IAR中MSP430的头文件解析,你看看
IAR_+_Proteus7.6仿真MSP430单片机的设置方法
(3) 在左边选择 Linker 选项,在右边选择 Output,按下图中设置选项。
(4)编译 X.C 文件生成 XX.hex 文件,XX.hex 在工程中的 Debug 文件下的 Exe 文件夹 下
2. Proteus 工程及仿真电路建立,注意 MSP430 型号选取,有些不可仿真,具体如下图
3. 建立仿 MSP430 的 Proteus7.6 仿真电路
仿真效果如下,
IAR + Proteus7.6 仿真 MSP430 单片机的设置方法
Proteus7.6 增加了 MSP430 系列单片机,iar embedded workbench 和 Proteus7.6 联调可 完成对 MSP430 的软件仿真,步骤如下。 1. 设置 IAR 软件,生产 XX.HEX 文件 (1) 在 IAR 建立 MSP430 工程及 X.C 文件,并编写 X.C 代码,界面如下图,
msp430如何选择头文件?怎么添加?
msp430 如何选择头文件?怎么添加?
使用iar,如果没有头文件,编译肯定通不过,更加不用说继续设计
了,本人使用IAR 进行msp430 开发,选择原因是因为ccs 所需内存太大
了,keil 已经无法满足MSP430 的某些功能了,对于IAR 集成开发环境,我
们从事一个项目开发,首先就是要添加头文件,头文件相信大家都不陌生,
使用C 语言开发的时候我们见到过无数的#include《》和#include 都可以添
加头文件,说明一下:放在自己工程目录下的头文件要用#include
msp430g2553.h ,系统目录下的头文件才用#include《iomsp430g2553.h》,当然你自定义的头文件可以在系统头文件库里面的。
再次使用时新版本的IAR5.31 时发现又不会添加头文件了,想想当时
用的时候也遇到过类似问题,最后也不知是如何解决的,在利用workspace
栏添加时,倒也能添加,只是不再main 分目录下,即便包含了xxx.h 文件,
编译时仍然会提示can no find xxx.h。
有关IAR 教程并总结出两种解决方法。
方法一:将头文件xxx.h 保存在当前工程目录下,通常和main.c 放在
同一个目录。
此时,无需在workspace 里面手工添加,只需要在main.c 或者
在对应的xxx.c 文件中#include xxx.h,编译成功完成后会自动出现在相应的.c。
MSP430寄存器的中文解释,熟知这些写起程序来很方便
#define P5DIR_ sfrb P5DIR
#define P5SEL_ sfrb P5SEL
#define P6IN_ const sfrb P6IN #define P6OUT_ sfrb P6OUT
0x0034 /* P6 输入寄存器 */ = P6IN_; 0x0035 /* P6 输出寄存器*/ = P6OUT_; 0x0036 /* P6 方向选择寄存器*/ = P6DIR_; 0x0037 /* P6 功能选择寄存器*/ = P6SEL_;
#define P4DIR_ sfrb P4DIR
#define P4SEL_ sfrb P4SEL
/************************************************************ * DIGITAL I/O Port5/6 I/O口寄存器定义PORT5和6 无中断功能
************************************************************/
#define P5IN_ const sfrb P5IN #define P5OUT_ sfrb P5OUT
0x0030 /* P5 输入寄存器 */ = P5IN_; 0x0031 /* P5 输出寄存器*/ = P5OUT_; 0x0032 /* P5 方向选择寄存器*/ = P5DIR_; 0x0033 /* P5 功能选择寄存器*/ = P5SEL_;
#define MPY_
0x0130 /* 无符号乘法 */
sfrw
MPY
= MPY_; 0x0132 /* 有符号乘法*/ = MPYS_; 0x0134 /* 无符号乘加 */ = MAC_; 0x0136 /* 有符号乘加 */ = MACS_; 0x0138 /* 第二乘数 */ = OP2_; 0x013A /* 低6位结果寄存器 */ = RESLO_; 0x013C /* 高6位结果寄存器 */ = RESHI_; 0x013E /*结果扩展寄存器 */ = SUMEXT_;
msp430学习的深度解析和总结
msp430学习的深度解析和总结一、MSP430开发环境建立1.安装IAR dor msp430 软件,软件带USB仿真器的驱动。
2.插入USB仿真器,驱动选择安装目录的/drivers/TIUSBFET3.建立一个工程,选择"option"选项,设置a、选择器件,在"General"项的"Target"标签选择目标器件b、选择输出仿真,在"Linker"项里的"Output"标签,选择输出"Debug information for C-SPY",以输出调试信息用于仿真。
c、若选择"Other",Output下拉框选择"zax-m"即可以输出hex文件用以烧录,注意,此时仿真不了。
d、选择"Debugger"项的"Setup"标签,"Driver"下拉框选择"FET Debugger"e、选择"FET Debugger"项的"Setup"标签,"Connection"下拉框选择"Texas Instrument USB-I"4.仿真器的接口,从左到右分别为" GND,RST,TEST,VCC"二、IO口数字输入/输出端口有下列特性:每个输入/输出位都可以独立编程。
允许任意组合输入、输出。
P1 和P2 所有8 个位都可以分别设置为中断。
可以独立操作输入和输出数据寄存器。
可以分别设置上拉或下拉电阻。
在介绍这四个I/O口时提到了一个“上拉电阻”那么上拉电阻又是一个什么东东呢?他起什么作用呢?都说了是电阻那当然就是一个电阻啦,当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以如果P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。
[最新]msp430头文件说明说明
msp430头文件解释说明//1MSP430F149祥解对头文件做了比较详细的注释,记不清寄存器的人可以看看#ifndef __msp430x14x#define __msp430x14x/********************************************************** *** STANDARD BITS*********************************************************** */#define BIT0 0x0001#define BIT1 0x0002#define BIT2 0x0004#define BIT3 0x0008#define BIT4 0x0010#define BIT5 0x0020#define BIT6 0x0040#define BIT7 0x0080#define BIT8 0x0100#define BIT9 0x0200#define BITA 0x0400#define BITB 0x0800#define BITC 0x1000#define BITD 0x2000#define BITE 0x4000#define BITF 0x8000/********************************************************** *** STATUS REGISTER BITS*********************************************************** */#define C 0x0001#define Z 0x0002#define N 0x0004#define V 0x0100#define GIE 0x0008#define CPUOFF 0x0010#define OSCOFF 0x0020#define SCG0 0x0040#define SCG1 0x0080/* Low Power Modes coded with Bits 4-7 in SR */#ifndef __IAR_SYSTEMS_ICC /* Begin #defines for assembler */#define LPM0 CPUOFF#define LPM1 SCG0+CPUOFF#define LPM2 SCG1+CPUOFF#define LPM3 SCG1+SCG0+CPUOFF#define LPM4 SCG1+SCG0+OSCOFF+CPUOFF/* End #defines for assembler */#else /* Begin #defines for C */#define LPM0_bits CPUOFF#define LPM1_bits SCG0+CPUOFF#define LPM2_bits SCG1+CPUOFF#define LPM3_bits SCG1+SCG0+CPUOFF#define LPM4_bits SCG1+SCG0+OSCOFF+CPUOFF#include <In430.h>#define LPM0 _BIS_SR(LPM0_bits) /* Enter Low Power Mode 0 */#define LPM0_EXIT _BIC_SR(LPM0_bits) /* Exit Low Power Mode 0 */#define LPM1 _BIS_SR(LPM1_bits) /* Enter Low Power Mode 1 */#define LPM1_EXIT _BIC_SR(LPM1_bits) /* Exit Low Power Mode 1 */#define LPM2 _BIS_SR(LPM2_bits) /* Enter Low Power Mode 2 */#define LPM2_EXIT _BIC_SR(LPM2_bits) /* Exit Low Power Mode 2 */#define LPM3 _BIS_SR(LPM3_bits) /* Enter Low Power Mode 3 */#define LPM3_EXIT _BIC_SR(LPM3_bits) /* Exit Low Power Mode 3 */#define LPM4 _BIS_SR(LPM4_bits) /* Enter Low Power Mode 4 */#define LPM4_EXIT _BIC_SR(LPM4_bits) /* Exit Low Power Mode 4 */#endif /* End #defines for C *//********************************************************** *** PERIPHERAL FILE MAP*********************************************************** *//********************************************************** *** 特殊功能寄存器地址和控制位*********************************************************** *//*中断使能1*/#define IE1_ 0x0000sfrb IE1 = IE1_;#define WDTIE 0x01 /*看门狗中断使能*/#define OFIE 0x02 /*外部晶振故障中断使能*/#define NMIIE 0x10 /*非屏蔽中断使能*/#define ACCVIE 0x20 /*可屏蔽中断使能/flash 写中断错误*/#define URXIE0 0x40 /*串口0接收中断使能*/#define UTXIE0 0x80 /*串口0发送中断使能*//*中断标志1*/#define IFG1_ 0x0002sfrb IFG1 = IFG1_;#define WDTIFG 0x01 /*看门狗中断标志*/#define OFIFG 0x02 /*外部晶振故障中断标志*/ #define NMIIFG 0x10 /*非屏蔽中断标志*/#define URXIFG0 0x40 /*串口0接收中断标志*/#define UTXIFG0 0x80 /*串口0发送中断标志*//* 中断模式使能1 */#define ME1_ 0x0004sfrb ME1 = ME1_;#define URXE0 0x40 /* 串口0接收中断模式使能 */#define USPIE0 0x40 /* 同步中断模式使能*/#define UTXE0 0x80 /* 串口0发送中断模式使能 *//* 中断使能2 */#define IE2_ 0x0001sfrb IE2 = IE2_;#define URXIE1 0x10 /* 串口1接收中断使能*/#define UTXIE1 0x20 /* 串口1发送中断使能*//* 中断标志2 */#define IFG2_ 0x0003sfrb IFG2 = IFG2_;#define URXIFG1 0x10 /* 串口1接收中断标志*/#define UTXIFG1 0x20 /* 串口1发送中断标志*//* 中断模式使能2 */#define ME2_ 0x0005sfrb ME2 = ME2_;#define URXE1 0x10 /* 串口1接收中断模式使能 */#define USPIE1 0x10 /* 同步中断模式使能*/#define UTXE1 0x20 /* 串口1发送中断模式使能 *//********************************************************** *** 看门狗定时器的寄存器定义*********************************************************** */#define WDTCTL_ 0x0120sfrw WDTCTL = WDTCTL_;#define WDTIS0 0x0001 /*选择WDTCNT的四个输出端之一*/#define WDTIS1 0x0002 /*选择WDTCNT的四个输出端之一*/#define WDTSSEL 0x0004 /*选择WDTCNT的时钟源*/#define WDTCNTCL 0x0008 /*清除WDTCNT端: 为1时从0开始计数*/#define WDTTMSEL 0x0010 /*选择模式 0: 看门狗模式; 1: 定时器模式*/#define WDTNMI 0x0020 /*选择NMI/RST 引脚功能 0:为 RST; 1:为NMI*/#define WDTNMIES 0x0040 /*WDTNMI=1时.选择触发延 0:为上升延 1:为下降延*/#define WDTHOLD 0x0080 /*停止看门狗定时器工作 0:启动;1:停止*/#define WDTPW 0x5A00 /* 写密码:高八位*//* SMCLK= 1MHz定时器模式 */#define WDT_MDLY_32 WDTPW+WDTTMSEL+WDTCNTCL /* TSMCLK*2POWER15=32ms 复位状态 */#define WDT_MDLY_8 WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0 /* TSMCLK*2POWER13=8.192ms " */#define WDT_MDLY_0_5 WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1 /* TSMCLK*2POWER9=0.512ms " */#define WDT_MDLY_0_064WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0 /*TSMCLK*2POWER6=0.512ms " *//* ACLK=32.768KHz 定时器模式*/#define WDT_ADLY_1000 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL /* TACLK*2POWER15=1000ms " */#define WDT_ADLY_250WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0 /*TACLK*2POWER13=250ms " */#define WDT_ADLY_16WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1 /*TACLK*2POWER9=16ms " */#define WDT_ADLY_1_9WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0 /*TACLK*2POWER6=1.9ms " *//* SMCLK=1MHz看门狗模式 */#define WDT_MRST_32 WDTPW+WDTCNTCL /* TSMCLK*2POWER15=32ms 复位状态 */#define WDT_MRST_8 WDTPW+WDTCNTCL+WDTIS0 /* TSMCLK*2POWER13=8.192ms " */#define WDT_MRST_0_5 WDTPW+WDTCNTCL+WDTIS1 /* TSMCLK*2POWER9=0.512ms " */#define WDT_MRST_0_064 WDTPW+WDTCNTCL+WDTIS1+WDTIS0 /* TSMCLK*2POWER6=0.512ms " *//* ACLK=32KHz看门狗模式 */#define WDT_ARST_1000 WDTPW+WDTCNTCL+WDTSSEL /* TACLK*2POWER15=1000ms " */#define WDT_ARST_250 WDTPW+WDTCNTCL+WDTSSEL+WDTIS0 /* TACLK*2POWER13=250ms " */#define WDT_ARST_16 WDTPW+WDTCNTCL+WDTSSEL+WDTIS1 /* TACLK*2POWER9=16ms " */#define WDT_ARST_1_9WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0 /*TACLK*2POWER6=1.9ms " *//************************************************************硬件乘法器的寄存器定义************************************************************/#define MPY_ 0x0130 /* 无符号乘法 */sfrw MPY = MPY_;#define MPYS_ 0x0132 /* 有符号乘法*/sfrw MPYS = MPYS_;#define MAC_ 0x0134 /* 无符号乘加 */sfrw MAC = MAC_;#define MACS_ 0x0136 /* 有符号乘加 */sfrw MACS = MACS_;#define OP2_ 0x0138 /* 第二乘数 */sfrw OP2 = OP2_;#define RESLO_ 0x013A /* 低6位结果寄存器 */sfrw RESLO = RESLO_;#define RESHI_ 0x013C /* 高6位结果寄存器 */sfrw RESHI = RESHI_;#define SUMEXT_ 0x013E /*结果扩展寄存器 */const sfrw SUMEXT = SUMEXT_;/********************************************************** *** DIGITAL I/O Port1/2 寄存器定义有中断功能*********************************************************** */#define P1IN_ 0x0020 /* P1 输入寄存器 */const sfrb P1IN = P1IN_;#define P1OUT_ 0x0021 /* P1 输出寄存器 */sfrb P1OUT = P1OUT_;#define P1DIR_ 0x0022 /* P1 方向选择寄存器 */sfrb P1DIR = P1DIR_;#define P1IFG_ 0x0023 /* P1 中断标志寄存器*/sfrb P1IFG = P1IFG_;#define P1IES_ 0x0024 /* P1 中断边沿选择寄存器*/sfrb P1IES = P1IES_;#define P1IE_ 0x0025 /* P1 中断使能寄存器 */sfrb P1IE = P1IE_;#define P1SEL_ 0x0026 /* P1 功能选择寄存器*/ sfrb P1SEL = P1SEL_;#define P2IN_ 0x0028 /* P2 输入寄存器 */const sfrb P2IN = P2IN_;#define P2OUT_ 0x0029 /* P2 输出寄存器 */sfrb P2OUT = P2OUT_;#define P2DIR_ 0x002A /* P2 方向选择寄存器 */sfrb P2DIR = P2DIR_;#define P2IFG_ 0x002B /* P2 中断标志寄存器 */sfrb P2IFG = P2IFG_;#define P2IES_ 0x002C /* P2 中断边沿选择寄存器*/sfrb P2IES = P2IES_;#define P2IE_ 0x002D /* P2 中断使能寄存器 */sfrb P2IE = P2IE_;#define P2SEL_ 0x002E /* P2 功能选择寄存器 */ sfrb P2SEL = P2SEL_;/********************************************************** *** DIGITAL I/O Port3/4寄存器定义无中断功能*********************************************************** */#define P3IN_ 0x0018 /* P3 输入寄存器 */const sfrb P3IN = P3IN_;#define P3OUT_ 0x0019 /* P3 输出寄存器 */sfrb P3OUT = P3OUT_;#define P3DIR_ 0x001A /* P3 方向选择寄存器 */sfrb P3DIR = P3DIR_;#define P3SEL_ 0x001B /* P3 功能选择寄存器*/ sfrb P3SEL = P3SEL_;#define P4IN_ 0x001C /* P4 输入寄存器 */const sfrb P4IN = P4IN_;#define P4OUT_ 0x001D /* P4 输出寄存器 */sfrb P4OUT = P4OUT_;#define P4DIR_ 0x001E /* P4 方向选择寄存器 */sfrb P4DIR = P4DIR_;#define P4SEL_ 0x001F /* P4 功能选择寄存器 */ sfrb P4SEL = P4SEL_;/********************************************************** *** DIGITAL I/O Port5/6 I/O口寄存器定义PORT5和6 无中断功能*********************************************************** */#define P5IN_ 0x0030 /* P5 输入寄存器 */const sfrb P5IN = P5IN_;#define P5OUT_ 0x0031 /* P5 输出寄存器*/sfrb P5OUT = P5OUT_;#define P5DIR_ 0x0032 /* P5 方向选择寄存器*/sfrb P5DIR = P5DIR_;#define P5SEL_ 0x0033 /* P5 功能选择寄存器*/ sfrb P5SEL = P5SEL_;#define P6IN_ 0x0034 /* P6 输入寄存器 */const sfrb P6IN = P6IN_;#define P6OUT_ 0x0035 /* P6 输出寄存器*/sfrb P6OUT = P6OUT_;#define P6DIR_ 0x0036 /* P6 方向选择寄存器*/sfrb P6DIR = P6DIR_;#define P6SEL_ 0x0037 /* P6 功能选择寄存器*/ sfrb P6SEL = P6SEL_;//2/********************************************************** *** USART 串口寄存器"UCTL","UTCTL","URCTL"定义的各个位可串口1 串口2公用*********************************************************** *//* UCTL 串口控制寄存器*/#define PENA 0x80 /*校验允许位*/#define PEV 0x40 /*偶校验为0时为奇校验*/#define SPB 0x20 /*停止位为2 为0时停止位为1*/#define CHAR 0x10 /*数据位为8位为0时数据位为7位*/#define LISTEN 0x08 /*自环模式(发数据同时在把发的数据接收回来)*/#define SYNC 0x04 /*同步模式为0异步模式*/#define MM 0x02 /*为1时地址位多机协议(异步) 主机模式(同步);为0时线路空闲多机协议(异步) 从机模式(同步)*/#define SWRST 0x01 /*控制位*//* UTCTL 串口发送控制寄存器*/#define CKPH 0x80 /*时钟相位控制位(只同步方式用)为1时时钟UCLK延时半个周期*/#define CKPL 0x40 /*时钟极性控制位为1时异步与UCLK相反;同步下降延有效*/#define SSEL1 0x20 /*时钟源选择位:与SSEL0组合为0,1,2,3四种方式*/#define SSEL0 0x10 /*"0"选择外部时钟,"1"选择辅助时钟,"2","3"选择系统子时钟 */#define URXSE 0x08 /*接收触发延控制位(只在异步方式下用)*/#define TXWAKE 0x04 /*多处理器通信传送控制位(只在异步方式下用)*/#define STC 0x02 /*外部引脚STE选择位为0时为4线模式为1时为3线模式*/#define TXEPT 0x01 /*发送器空标志*//* URCTL 串口接收控制寄存器同步模式下只用两位:FE和OE*/#define FE 0x80 /*帧错标志*/ #define PE 0x40 /*校验错标志位*/#define OE 0x20 /*溢出标志位*/#define BRK 0x10 /*打断检测位*/#define URXEIE 0x08 /*接收出错中断允许位*/#define URXWIE 0x04 /*接收唤醒中断允许位*/#define RXWAKE 0x02 /*接收唤醒检测位*/ #define RXERR 0x01 /*接收错误标志位*//********************************************************** *** USART 0 串口0寄存器定义*********************************************************** */#define U0CTL_ 0x0070 /* 串口0基本控制寄存器*/sfrb U0CTL = U0CTL_;#define U0TCTL_ 0x0071 /* 串口0发送控制寄存器 */sfrb U0TCTL = U0TCTL_;#define U0RCTL_ 0x0072 /* 串口0接收控制寄存器 */sfrb U0RCTL = U0RCTL_;#define U0MCTL_ 0x0073 /* 波特率调整寄存器 */sfrb U0MCTL = U0MCTL_;#define U0BR0_ 0x0074 /* 波特率选择寄存器0 */sfrb U0BR0 = U0BR0_;#define U0BR1_ 0x0075 /* 波特率选择寄存器1 */sfrb U0BR1 = U0BR1_;#define U0RXBUF_ 0x0076 /* 接收缓存寄存器 */const sfrb U0RXBUF = U0RXBUF_;#define U0TXBUF_ 0x0077 /* 发送缓存寄存器 */sfrb U0TXBUF = U0TXBUF_;/* 改变的寄存器名定义 */#define UCTL0_ 0x0070 /* UART 0 Control */sfrb UCTL0 = UCTL0_;#define UTCTL0_ 0x0071 /* UART 0 Transmit Control */sfrb UTCTL0 = UTCTL0_;#define URCTL0_ 0x0072 /* UART 0 Receive Control */sfrb URCTL0 = URCTL0_;#define UMCTL0_ 0x0073 /* UART 0 Modulation Control */sfrb UMCTL0 = UMCTL0_;#define UBR00_ 0x0074 /* UART 0 Baud Rate 0 */ sfrb UBR00 = UBR00_;#define UBR10_ 0x0075 /* UART 0 Baud Rate 1 */sfrb UBR10 = UBR10_;#define RXBUF0_ 0x0076 /* UART 0 Receive Buffer */const sfrb RXBUF0 = RXBUF0_;#define TXBUF0_ 0x0077 /* UART 0 Transmit Buffer */ sfrb TXBUF0 = TXBUF0_;#define UCTL_0_ 0x0070 /* UART 0 Control */sfrb UCTL_0 = UCTL_0_;#define UTCTL_0_ 0x0071 /* UART 0 Transmit Control */sfrb UTCTL_0 = UTCTL_0_;#define URCTL_0_ 0x0072 /* UART 0 Receive Control */sfrb URCTL_0 = URCTL_0_;#define UMCTL_0_ 0x0073 /* UART 0 Modulation Control */sfrb UMCTL_0 = UMCTL_0_;#define UBR0_0_ 0x0074 /* UART 0 Baud Rate 0 */sfrb UBR0_0 = UBR0_0_;#define UBR1_0_ 0x0075 /* UART 0 Baud Rate 1 */sfrb UBR1_0 = UBR1_0_;#define RXBUF_0_ 0x0076 /* UART 0 Receive Buffer */ const sfrb RXBUF_0 = RXBUF_0_;#define TXBUF_0_ 0x0077 /* UART 0 Transmit Buffer */sfrb TXBUF_0 = TXBUF_0_;/********************************************************** *** USART 1 串口1寄存器定义*********************************************************** */#define U1CTL_ 0x0078 /* 串口1基本控制寄存器*/sfrb U1CTL = U1CTL_;#define U1TCTL_ 0x0079 /* 串口1发送控制寄存器 */sfrb U1TCTL = U1TCTL_;#define U1RCTL_ 0x007A /* 串口1接收控制寄存器 */sfrb U1RCTL = U1RCTL_;#define U1MCTL_ 0x007B /* 波特率调整控制寄存器 */sfrb U1MCTL = U1MCTL_;#define U1BR0_ 0x007C /* 波特率选择寄存器0 */sfrb U1BR0 = U1BR0_;#define U1BR1_ 0x007D /* 波特率选择寄存器1 */sfrb U1BR1 = U1BR1_;#define U1RXBUF_ 0x007E /* 接收缓存 */const sfrb U1RXBUF = U1RXBUF_;#define U1TXBUF_ 0x007F /* 发送缓存 */ sfrb U1TXBUF = U1TXBUF_;/* 改变的寄存器名定义 */#define UCTL1_ 0x0078 /* UART 1 C。
IAR_FOR_MSP430_入门教程
IAR FOR 430 入门教程主要内容:一.IAR FOR 430 简介二.IAR软件的安装及破解三.软件的设置与调试一.IAR FOR 430 简介IAR Systems是全球领先的嵌入式系统开发工具和服务的供应商。
公司成立于1983年,迄今已有27年,提供的产品和服务涉及到嵌入式系统的设计、开发和测试的每一个阶段,包括:带有C/C++编译器和调试器的集成开发环境(IDE)、实时操作系统和中间件、开发套件、硬件仿真器以及状态机建模工具。
国内普及的MSP430开发软件种内不多,主要有IAR公司的Embedded Workbench for MSP430(简称为EW430)和AQ430。
目前IAR的用户居多。
IAR EW430软件提供了工程管理,程序编辑,代码下载,调试等所有功能。
并且软件界面和操作方法与IAR EW forARM等开发软件一致。
因此,学会了IAR EW430,就可以很顺利地过渡到另一种新处理器的开发工作。
现在IAR的最新版本为V5.10版,不过本文主要是以V4.11版讲解。
各个版本之间差异不大。
掌握了V4.11,别的版本也能很快上手。
二.IAR软件的安装及破解(1)软件的下载及破解IAR EW430在google or百度上很容易找到下载连接,也可以在IAR官网上下载,不过一定要将与版本相配套的注册机一并下载。
(2)软件的安装1.运行ew430-ev-cd-411b.exe2. 点击Next3点击AcceptName, Company 自己可以随意填License(序列号)就得用到注册机了运行注册机(iarkg.exe),可以看到首先在product中选EmbededWorkbenchForMSP430 v4.11B然后点击Generate生成License number和License Key将License number输到Licinse#中4.点击Next将注册机中的LicenseKey粘贴进去5点击Next,出现修改安装路径,这个随意,按个人喜好了6修改好后,点击Next选择Full,继续Next7 之后基本不用设置什么了,一路Next就OK了8出现点击Finish大功告成!注意:1.License number和License Key必须配套。
01A01---MSP430概述 IAR软件介绍
MSP430概述及IAR使用演讲者:技术部TI 微控制器列表DSC C2000TM作者:利尔达技术部150 MIPS高性能 • 电机控制 • 数字电源 工业标准 • 工业 • 医疗器械 测量 • 表类计量 • 便携式仪器TMS470 16/32-bitARM7TDMIMSP430Ultra-low Power8-bit性能2TI 嵌入式处理器产品线Microcontrollers16-bitMSP430 Ultra-Low Power Up to 25 MHz Flash 1 KB to 256 KB Analog I/O, ADC LCD, USB, RF Measurement, Sensing, General Purpose $0.49 to $9.00作者:利尔达技术部ARM-Based32-bit ARMStellaris M3 Industry Std Low Power Up to 100 MHz Flash 8kB to 256kB USB (H/D/OTG), ENET(PHY, 1588), ADC, PWM, QVGA Host Control $2.00 to $8.00DSPARM + DSP DSPC647x, C64x+, C55x32-bit Real-timeC2000™ Fixed & Floating Point Up to 150 MHz Flash 32 KB to 512 KB PWM, ADC, CAN, SPI, I2C Motor Control, Digital Power, Lighting $1.50 to $20.00ARM+ARM9 Cortex A-8C64x+ plus ARM9/Cortex A-8Industry-Std Core, Industry-Std Core + Leadership DSP Performance High-Perf GPP DSP for Signal Proc. Accelerators MMU USB, LCD, MMC, EMAC Linux/WinCE User Apps $8.00 to $35.00 4800 MMACs/ 1.07 DMIPS/MHz MMU, Cache VPSS, USB, EMAC, MMC Linux/Win + Video, Imaging, Multimedia $12.00 to $65.00 24,000 MMACS Up to 3 MB L2 Cache 1G EMAC, SRIO, DDR2, PCI-66 Comm, WiMAX, Industrial/ Medical Imaging $4.00 to $99.00+Software & Dev. Tools3什么是MSP430?MSP430系列单片机是美国Texas Instruments (TI) 从1996 年开始推向市场的一种16位 RISC 架构、超低功耗的混合信号 处理器(Mixed Signal Processor)。
MSP430相关说明文档
1.关于目标板供电,这个问题反映回来最多。
如果用仿真器供电,那么VCCI脚一定要接地。
VCCI是仿真器检测目标板电源的。
如果跟VCCO 接在一起,很可能导致仿真器不输出电压,导致IAR报错,找不到芯片。
如果用外部电源供电,那么VCCI一定要接到目标板电源(一般是3.3V),VCCO悬空,一定不要跟目标板电源相连,否则,有时可能会导致仿真器输出,两个电源短路,出现意想不到的情况;2. 系统中显示USB设备有问题:这个问题有可能是USB没有安装好,有时也可能系统问题。
如果驱动装好了。
电脑重启一下可能就好了。
如果还不行。
换台电脑再试一下。
3. 有时430单片机可能在死机状态,导致仿真器通过JTAG查询时,没有响应,导致IAR不能下载。
这时,拔掉JTAG 14pin插座,断开目标板电源,过至少1min时间,最好用镊子把目标板电源放电完,再插上JTAG插座,进行仿真。
4. 判断仿真器是否正常的一个简单的办法是:a) 硬件管理器中USB 设备工作正常(显示为msp430uif COMx口)。
b), 插入USB后,电脑有识别到新硬件的声音指示(开外放)代表仿真器自检通过。
那么仿真器一般不会有问题了。
重点在目标板上找原因,一般是不会有问题的。
5. 安装MSP430的LSD-FET430UIF USB仿真器驱动时出错。
"INF 找不到所需的段落" 的解决方法:首先这是您操作系统的问题a.打开“控制面板–管理工具–服务”,查看“smart card是否启用”,没有的话,请手动启动。
如果“smart card”服务也无法启用,可检查“scardsvr”服务是否存在,且已经启动,如果没有启动请手动启动,然后设为“自动”。
b.如果该服务不存在,则按以下步骤操作,单击“开始–运行”输入cmd 打开命令提示符窗口,先执行命令“scardsvr reinstall”,接着在执行命令“regsvr32 scardssp.dll”重新注册scardssp.dll。
MSP430系列单片机在IAR环境中实现数据或函数的定位
注意:在实现过程中可能涉及到.XCL连接文件的更改,请保存好原来的.XCL文件!1.打开相应的*c.xcl文件,用"-Z(CONST)段名=程序定位的目标段-FFDF"定义段的起始地址.2.在自己的C程序中用#pragma constseg(段名)定位自己的程序3.结束后恢复编译器的默认定位#pragma defaultIAR 1.26b环境下:1、将常量数组放在FLASH段自定议的MYSEG段中原来的MSP430F149 XCL文件如下:// Constant data-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=1100-FFDF如果想从中分出一部分做数据存储区,做如下修改:-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=1500-FFDF //将1100-14FF从ROM 中分出存储arry数组-Z(CONST)MYSEG=1100-14FF区间大小可自行决定在程序中描写如下即可:#pragma memory = constseg(MYSEG) //在.XCL文件中修改char arry[]={1,2,3,4,5,6,7};#pragma memory = default2、将变量放入所命名的段在XCL文件中开辟一段MYSEG段,如上所述#pragma memory = dataseg(MYSEG)char i;char j;int k;#pragma memory = defaultIAR3.10A环境下xcL文件的更改方法如上数据定位方法如下三种1、__no_init char alpha @ 0x0200;2、#pragma location=0x0202const int beta;3、const int gamma @ 0x0204 = 3;或;1、__no_init int alpha @ "MYSEGMENT"; //MYSEGMENT段可在XCL中开辟2、#pragma location="MYSEGMENT"const int beta;3、const int gamma @ "MYSEGMENT" = 3;函数定位如下面两种写法1、void g(void) @ "MYSEGMENT" //MYSEGMENT段可在XCL中开辟{}2、#pragma location="MYSEGMENT"void h(void){}。
MSP430单片机硬件结构及原理讲解
3.3 MSP430单片机的中央处理器
15
16
MSP430CPU的主要特征
RISC指令集,27条内核指令和7种寻址模式 寄存器资源丰富 寄存器操作为单周期 16位地址总线 常数发生器 直接的存储器到存储器访问 位、字和字节操作方式
17
MSP430 CPU的寄存器
简写 功能
R0
程序计数器PC,指示下一条将要执行的指令地址。
20
(2)堆栈指针SP
系统堆栈在系统调用子程序或进入中断服 务程序时,能够保护程序计数器PC.
然后将子程序的入口地址或者中断矢量地 址送程序计数器,执行子程序或中断服务 程序。
子程序或者中断服务程序执行完毕,遇到 返回指令时,将堆栈的内容送到程序计数 器中,程序流程又返回到原来的地方,继 续执行.
可屏蔽
0FFF6H
11
看门狗定时器
WDTIFG
可屏蔽
0FFF4H
10
串口0接收
URXIFG0
可屏蔽
0FFF2H
9
串口0发送
UTXIFG0
可屏蔽
0FFF0H
8
ADC
ADCIFG
可屏蔽
0FFEEH
7
定时器A
CCIFG0
可屏蔽
0FFECH
6
定时器A
CCIFG1~2 , 可屏蔽
0FFEAH
5
TAIFG
P1
P1IFG.0~7
16位RISC中央处理器,125ns指令周期。可以 用较少的代码空间实现高性能的应用。
在系统可编程的FLASH,为开发编程提供便利。
4
MSP430x14x主要包括以下功能部件:
1. CPU 2. 存储器: 3. 外围模块:主要包括:时钟模块、
IAR中MSP430的头文件解析,你看看
1、#define BIT0 (0×0001) //(0×0001)不是地址,而是一个16进制数值。
例1、P3DIR |= BIT3;实际上也可以写成P3DIR |= 0×0008;意思是将P3口的默认上电值0×0000和0×0008相与,设置P3口的第三位(即P3.3)管脚作输出使用。
例2、WDTCTL = WDTPW + WDTHOLD;实际上就是WDTCTL=0×5A80;你可以在头文件中查到#define WDTPW (0×5A00)和#define WDTHOLD (0×0080)。
WDTCTL是看门狗的控制寄存器,在msp430的User’Guide中有说明:当它的值为0×5A80时停止看门狗定时。
那为什么我们不直接写成WDTCTL=0×5A80;呢?这样的话程序的可读性会很差。
0×5A80只是一个数值,当你下次再看你写的程序,或者别人读你的程序时,就不明白WDTCTL=0×5A80;的意思了。
如果写成WDTCTL = WDTPW + WDTHOLD;就好理解多了:WDTPW(Watchdog timer password,看门狗的密码,WDTCTL的高8位):只有WDTCTL的高8位为0×5A时才能对WDTCTL寄存器进行写操作。
WDTHOLD(Watchdog timer hold,WDTCTL的第7位):当WDTCTL的第7位为1时,停止看门狗计时。
这样我们通过PW,HOLD就可以轻松的知道WDTCTL = WDTPW + WDTHOLD;是做什么的了。
可以看出msp430的头文件是很人性化的。
2、当然也有表示地址的,例如,头文件中有以下部分:#ifdef __IAR_SYSTEMS_ASM__#define DEFC(name, address) sfrb name = address#define DEFW(name, address) sfrw name = address;///运用了可变参数宏的宏定义格式:#define 宏符号名(参数表) 宏体;;宏体中就是写出参数表中各个//参数之间的关系。
msp430串口通信带12864头文件
/******************************************************程序功能:PC通过串口调试精灵向MCU发送数据,MCU将其在1602 液晶上显示-------------------------------------------------------通信格式:N.8.1, 9600------------------------------------------------------测试说明:打开串口调试助手,正确设置通信格式,向从PC机上向学习板发送数据,观察液晶上显示的字符。
******************************************************/#include <msp430.h>#include "12864.h"#include"delay.h"void InitUART(void);void PutString(uchar *ptr);uchar table1[]={"波特率:9600"};uchar table2[]={"接收到的数据为:"};uchar table[]={"0123456789"};uchar buffer[100]={0};uchar i=0,K=0;/***************主函数************/void main( void ){/*下面六行程序关闭所有的IO口*/uchar *tishi = "sennd data to MCU, and they will be displayed on 12864!";WDTCTL = WDTPW + WDTHOLD; //关狗InitUART(); //初始化UARTinit(); //初始化LCDPutString(tishi);_EINT();Disp_HZ(0x80,table1,6);Disp_HZ(0x90,table2,8);/* while(1){// LPM1;Disp_HZ(0x80,table1,6);Disp_HZ(0x90,table2,8);}*/}/*******************************************函数名称:PutSting功能:向PC机发送字符串参数:ptr--指向发送字符串的指针返回值:无********************************************/void PutString(uchar *ptr){while(*ptr != '\0'){while (!(IFG1 & UTXIFG0)); // TX缓存空闲?发送完毕UTXIFG0置1,IFG1=0X80TXBUF0 = *ptr++; // 发送数据}while (!(IFG1 & UTXIFG0));TXBUF0 = '\n';}/*******************************************函数名称:InitUART功能:初始化UART端口参数:无返回值:无********************************************/void InitUART(void){UCTL0 |= SWRST;P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDP3DIR|=BIT4;ME1 |= URXE0 + UTXE0; // Enable USART0 T/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKU0BR0 = 0x03; // 32k/9600 - 3.41U0BR1 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= URXIE0; // 使能USART0的接收中断}/*******************************************函数名称:UART0_RXISR功能:UART0的接收中断服务函数,在这里唤醒CPU,使它退出低功耗模式参数:无返回值:无********************************************/#pragma vector = UART0RX_VECTOR__interrupt void UART0_RXISR(void){i++;if(i==32){i=0;write_cmd(0x01); //清除显示Disp_HZ(0x80,table1,6);Disp_HZ(0x90,table2,8);} //退出低功耗模式buffer[i]=RXBUF0;if(i<=15){write_cmd(0x88);for(K=0;K<=i;K++)write_data(buffer[K]);}else{write_cmd(0x88);for(K=0;K<=15;K++)write_data(buffer[K]);write_cmd(0x98);for(K=16;K<=i;K++)write_data(buffer[K]);}}/*******************************************函数名称:PutChar功能:向PC机发送一个字符对应的ASCII码参数:zifu--发送的字符返回值:无********************************************/void PutChar(uchar zifu){while (!(IFG1 & UTXIFG0));if(zifu > 9) //发送键值1~16对应的ASCII码{TXBUF0 = 0x30 + zifu/10;while (!(IFG1 & UTXIFG0));TXBUF0 = 0x30 + zifu%10;}else{TXBUF0 = 0x30 + zifu;}while (!(IFG1 & UTXIFG0));TXBUF0 = '\n'; //发送回车字符}12864头文件#ifndef __CRY12864_H__#define __CRY12864_H__#include"delay.h"extern const unsigned char shuzi_table[];#define Busy 0x80#define Lcd_dataIn P6DIR=0x00 //数据口方向设置为输入#define lcd_dataout P6DIR=0XFF#define mcu2lcd_data P6OUT#define lcd2mcu_data P6IN#define lcd_cmdout P3DIR|=0X07#define rs_h P3OUT|=BIT0#define rs_l P3OUT&=~BIT0#define rw_h P3OUT|=BIT1#define rw_l P3OUT&=~BIT1#define en_h P3OUT|=BIT2#define en_l P3OUT&=~BIT2/*void ifbusy() //读忙状态{uchar lCdtemp = 0;while(1){ LCD_DataIn;rs_l;rw_h;en_h;_NOP();lcdtemp = LCD2MCU_Data;en_l;if((lCdtemp&Busy)==0)break;}}*/void write_cmd(uchar cmd){//ifbusy();rs_l;rw_l;//lcd_dataout;mcu2lcd_data=cmd;delayms(5);en_h;delayms(5);en_l;}void write_data(uchar dat){//ifbusy();rs_h;mcu2lcd_data=dat;delayms(5);en_h;delayms(5);en_l;}/******************************************* 函数名称:Ini_Lcd功能:初始化液晶模块参数:无返回值:无********************************************/ /*void Ini_Lcd(void){LcD_cMDOut; //液晶控制端口设置为输出// Delay_Nms(500);write_cmd(0x30); //基本指令集Delay_1ms();write_cmd(0x02); // 地址归位Delay_1ms();write_cmd(0x0c); //整体显示打开,游标关闭Delay_1ms();write_cmd(0x01); //清除显示Delay_1ms();write_cmd(0x06); //游标右移Delay_1ms();write_cmd(0x80); //设定显示的起始地址}*/void init(){lcd_dataout;lcd_cmdout;en_l;write_cmd(0x30);write_cmd(0x0c);write_cmd(0x01);}void initina2(void) //LcD显示图片(扩展)初始化程序{write_cmd(0x36); //Extended Function Set RE=1: extended instructiondelayms(1); //大于100uS的延时程序write_cmd(0x36); //Extended Function Set:RE=1: extended instruction setdelayms(1); ////大于37uS的延时程序write_cmd(0x3E); //EXFUNcTION(DL=8BITS,RE=1,G=1)delayms(1); //大于100uS的延时程序write_cmd(0x01); //cLEAR ScREENdelayms(1); //大于100uS的延时程序}/*******************************************函数名称:clear_GDRAM功能:清除液晶GDRAM中的随机数据参数:无返回值:无********************************************/void clear_GDRAM(void){uchar i,j,k;write_cmd(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){write_cmd(i++);write_cmd(0x80);for(k = 0;k < 16;k++){write_data(0x00);}}i = 0x80;for(j = 0;j < 32;j++){write_cmd(i++);write_cmd(0x88);for(k = 0;k < 16;k++){write_data(0x00);}}write_cmd(0x30); //回到基本指令集}/******************************************* 函数名称:Disp_HZ功能:控制液晶显示汉字参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示字符个数返回值:无********************************************/ void Disp_HZ(uchar addr,const uchar * pt,uchar num) {uchar i;write_cmd(addr);for(i = 0;i < (num*2);i++){write_data(*(pt++));delayms(1);}}/******************************************* 函数名称:Draw_TX功能:显示一个16*16大小的图形参数:Yaddr--Y地址Xaddr--X地址dp--指向图形数据存放地址的指针返回值:无********************************************/void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp){uchar j;uchar k=0;// write_cmd(0x01); //清屏,只能清除DDRAMwrite_cmd(0x34); //使用扩展指令集,关闭绘图显示for(j=0;j<16;j++){write_cmd(Yaddr++); //Y地址write_cmd(Xaddr); //X地址write_data(dp[k++]);write_data(dp[k++]);}write_cmd(0x36); //打开绘图显示// write_cmd(0x30); //回到基本指令集模式}/*******************************************函数名称:DisplayGraphic功能:在整个液晶屏幕上画图参数:无返回值:无********************************************/void DisplayGraphic(const uchar *adder){int i,j;//*******显示上半屏内容设置for(i=0;i<32;i++) //{write_cmd(0x80 + i); //SET 垂直地址VERTIcAL ADDwrite_cmd(0x80); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;}}//*******显示下半屏内容设置for(i=0;i<32;i++) //{write_cmd((0x80 + i)); //SET 垂直地址VERTIcAL ADDwrite_cmd(0x88); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;}}write_cmd(0x36); //打开绘图显示}/*在显示时DDAM和GDRAM是同时显示的,也就是它们的显示结果是叠加在一起的//SM12864液晶基本指令集控制命令测试////1.设定DDRAM地址命令write_cmd(0x90); //设定DDRAM地址,因为此时DDRAM地址已经溢出//2.显示状态命令write_cmd(0x08); //整体显示关,游标关,游标位置关write_cmd(0x0c); //整体显示开,游标关,游标位置关write_cmd(0x0e); //整体显示开,游标开,游标位置关write_cmd(0x0f); //整体显示开,游标开,游标位置开//3.位址归位write_cmd(0x02); //位址归位,游标回到原点write_cmd(0x84); //将DDRAM地址设为0x88,游标在此闪烁//4.点设定指令//(以下四个命令是控制写入字符以后光标及整屏显示的移动)write_cmd(0x07); //光标右移整体显示左移write_Data(0x20); //写入两个空格write_Data(0x20);write_cmd(0x05); //光标左移整体显示右移write_Data(0x20); //写入两个空格write_Data(0x20);write_cmd(0x06); //光标右移整体显示不移动write_Data(0x20); //写入两个空格write_Data(0x20);write_cmd(0x04); //光标左移整体显示不移动write_Data(0x20); //写入两个空格write_Data(0x20);//5.游标和显示移位控制//(以下四个命令无需写入显示数据,直接控制光标和整屏显示的移动)write_cmd(0x10); //光标左移write_cmd(0x14); //光标右移write_cmd(0x18); //整体显示左移,光标跟随write_cmd(0x1c); //整体显示右移,光标跟随write_cmd(0x0c); //关闭光标//6.进入扩展功能模式命令write_cmd(0x34); //打开扩展功能模式,绘图显示关闭//7.反白命令write_cmd(0x04); //同时反白1、3行write_cmd(0x04); //再次反白1、3行,相当于关闭1、3行反白write_cmd(0x05); //同时反白2、4行write_cmd(0x05); //再次反白2、4行,相当于关闭2、4行反白//8.睡眠模式命令write_cmd(0x08); //进入睡眠模式write_cmd(0x0c); //退出睡眠模式//9.待命模式命令write_cmd(0x01); //进入待命模式//10.打开GDRAM显示write_cmd(0x36); //打开扩展功能模式,打开绘图显示Draw_TX(0x80,0x84,laba); //设置16*16大小图形clear_GDRAM(); //清除上电复位后RAM中的随机数值Draw_TX(0x80,0x84,laba); //重新显示设置16*16大小图形//11.关闭GDRAM显示write_cmd(0x34); //打开扩展功能模式,关闭绘图显示//12.设定基本指令集write_cmd(0x30); //回到基本指令集//13.清除显示命令*/#endif。
IAR430头文件
/******************************************************************** ** Standard register and bit definitions for the T exas Instruments* MSP430 microcontroller.** This file supports assembler and C development for* MSP430x14x devices.** Texas Instruments, V ersion 2.3** Rev. 1.2, Additional Timer B bit definitions.* Renamed XTOFF to XT2OFF.** Rev. 1.3, Removed leading 0 to aviod interpretation as octal* values under C* Included <In430.h> rather than "In430.h"** Rev. 1.4, Corrected LPMx_EXIT to reference new intrinsic _BIC_SR_IRQ* Changed TAIV and TBIV to be read-only** Rev. 1.5, Enclose all #define statements with parentheses** Rev. 1.6, Defined vectors for USART (in addition to UART)** Rev. 1.7, Added USART special function labels (UxME, UxIE, UxIFG)** Rev. 2.1, Alignment of defintions in Users Guide and of version numbers** Rev. 2.2, Fixed type in ADC12 bit definitions (replaced ADC10 with ADC12) ** Rev. 2.3, Removed unused def of TASSEL2 / TBSSEL2*********************************************************************/#ifndef __msp430x14x#define __msp430x14x#ifdef __IAR_SYSTEMS_ICC__#ifndef _SY STEM_BUILD#pragma system_include#endif#endif#if (((__TID__ >> 8) & 0x7F) != 0x2b) /* 0x2b = 43 dec */#error MSP430X44X.H file for use with ICC430/A430 only#endif#ifdef __IAR_SYSTEMS_ICC__#include <in430.h>#pragma language=extended#define DEFC(name, address) __no_init volatile unsigned char name @ address; #define DEFW(name, address) __no_init volatile unsigned short name @ address;#endif /* __IAR_SYSTEMS_ICC__ */#ifdef __IAR_SYSTEMS_ASM__#define DEFC(name, address) sfrb name = address;#define DEFW(name, address) sfrw name = address;#endif /* __IAR_SYSTEMS_ASM__*/#ifdef __cplusplus#define READ_ONL Y#else#define READ_ONL Y const#endif/************************************************************* STANDARD BITS************************************************************/#define BIT0 (0x0001)#define BIT1 (0x0002)#define BIT2 (0x0004)#define BIT3 (0x0008)#define BIT4 (0x0010)#define BIT5 (0x0020)#define BIT6 (0x0040)#define BIT7 (0x0080)#define BIT8 (0x0100)#define BIT9 (0x0200)#define BITA(0x0400)#define BITB (0x0800)#define BITC (0x1000)#define BITD (0x2000)#define BITE (0x4000)#define BITF (0x8000)/************************************************************* STA TUS REGISTER BITS************************************************************/#define C (0x0001)#define Z (0x0002)#define N (0x0004)#define V (0x0100)#define GIE (0x0008)#define CPUOFF (0x0010)#define OSCOFF (0x0020)#define SCG0 (0x0040)#define SCG1 (0x0080)/* Low Power Modes code d with Bits 4-7 in SR */#ifndef __IAR_SYSTEMS_ICC /* Begin #defines for assembler */#define LPM0 (CPUOFF)#define LPM1 (SCG0+CPUOFF)#define LPM2 (SCG1+CPUOFF)#define LPM3 (SCG1+SCG0+CPUOFF)#define LPM4 (SCG1+SCG0+OSCOFF+CPUOFF)/* End #defines for assembler */#else /* Begin #defines for C */#define LPM0_bits (CPUOFF) //进入低功耗模式0之后,CPU被关闭,MCLK关闭#define LPM1_bits (SCG0+CPUOFF) //进入低功耗模式1之后,CPU被关闭,MCLK关闭,直流发生器被禁止#define LPM2_bits (SCG1+CPUOFF) //进入低功耗模式2之后,CPU被关闭,MCLK关闭,SCLK被禁止#define LPM3_bits (SCG1+SCG0+CPUOFF) //进入低功耗模式3之后,CPU被关闭,MCLK关闭,直流发生器被禁止,SCLK也被禁止#define LPM4_bits (SCG1+SCG0+OSCOFF+CPUOFF) //进入低功耗模式4之后,CPU被关闭,MCLK关闭,直流发生器被禁止,SCLK也被禁止,LFXT也被禁止#include <In430.h>#define LPM0 _BIS_SR(LPM0_bits) /* Enter Low Power Mode 0 */#define LPM0_EXIT _BIC_SR_IRQ(LPM0_bits) /* Exit Low Power Mode 0 */#define LPM1 _BIS_SR(LPM1_bits) /* Enter Low Power Mode 1 */#define LPM1_EXIT _BIC_SR_IRQ(LPM1_bits) /* Exit Low Power Mode 1 */#define LPM2 _BIS_SR(LPM2_bits) /* Enter Low Power Mode 2 */#define LPM2_EXIT _BIC_SR_IRQ(LPM2_bits) /* Exit Low Power Mode 2 */#define LPM3 _BIS_SR(LPM3_bits) /* Enter Low Power Mode 3 */#define LPM3_EXIT _BIC_SR_IRQ(LPM3_bits) /* Exit Low Power Mode 3 */#define LPM4 _BIS_S R(LPM4_bits) /* Enter Low Power Mode 4 */#define LPM4_EXIT _BIC_SR_IRQ(LPM4_bits) /* Exit Low Power Mode 4 */#endif /* End #defines for C *//************************************************************* PERIPHERAL FILE MAP************************************************************//************************************************************* SPECIAL FUNCTION REGISTER ADDRESSES + CONTROL BITS************************************************************/#define IE1_ (0x0000) /* Interrupt Enable 1 */DEFC( IE1 , IE1_)#define U0IE IE1 /* UART0 Interrupt Enable Register */ #define WDTIE (0x01)#define OFIE (0x02)#define NMIIE (0x10)#define ACCVIE (0x20)#define URXIE0 (0x40)#define UTXIE0 (0x80)#define IFG1_ (0x0002) /* Interrupt Flag 1 */DEFC( IFG1 , IFG1_)#define U0IFG IFG1 /* UART0 Interrupt Flag Register */ #define WDTIFG (0x01)#define OFIFG (0x02)#define NMIIFG (0x10)#define URXIFG0 (0x40)#define UTXIFG0 (0x80)#define ME1_ (0x0004) /* Module Enable 1 */DEFC( ME1 , ME1_)#define U0ME ME1 /* UART0 Module Enable Register */ #define URXE0 (0x40)#define UTXE0 (0x80)#define USPIE0 (0x40)#define IE2_ (0x0001) /* Interrupt Enable 2 */DEFC( IE2 , IE2_)#define U1IE IE2 /* UART1 Interrupt Enable Register */#define URXIE1 (0x10)#define UTXIE1 (0x20)#define IFG2_ (0x0003) /* Interrupt Flag 2 */DEFC( IFG2 , IFG2_)#define U1IFG IFG2 /* UART1 Interrupt Flag Register */#define URXIFG1 (0x10)#define UTXIFG1 (0x20)#define ME2_ (0x0005) /* Module Enable 2 */DEFC( ME2 , ME2_)#define U1ME ME2 /* UART1 Module Enable Register */#define URXE1 (0x10)#define UTXE1 (0x20)#define USPIE1 (0x10)/************************************************************* W A TCHDOG TIMER************************************************************/#define __MSP430_HAS_WDT__ /* Definition to show that Module is available */#define WDTCTL_ (0x0120) /* W atchdog Timer Control */DEFW( WDTCTL, WDTCTL_)/* The bit names have been prefixed with "WDT" */#define WDTIS0 (0x0001)#define WDTIS1 (0x0002)#define WDTSSEL(0x0004)#define WDTCNTCL(0x0008)#define WDTTMSEL(0x0010)#define WDTNMI (0x0020)#define WDTNMIES (0x0040)#define WDTHOLD (0x0080)#define WDTPW (0x5A00)/* WDT-interval times [1ms] coded with Bits 0-2 *//* WDT is clocked by fSMCLK (assumed 1MHz) */#define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL) /* 32ms interval (default) */#define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0) /* 8ms " */#define WDT_MDL Y_0_5 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)/* 0.5ms " */#define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " *//* WDT is clocked by fACLK (assumed 32KHz) */#define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL) /* 1000ms " */#define WDT_ADLY_250 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */#define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */#define WDT_ADLY_1_9 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " *//* W atchdog mode -> reset after expired time *//* WDT is clocked by fSMCLK (assumed 1MHz) */#define WDT_MRST_32 (WDTPW+WDTCNTCL) /* 32ms interval (default) */#define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTIS0) /* 8ms " */#define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTIS1) /* 0.5ms " */#define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " *//* WDT is clocked by fACLK (assumed 32KHz) */#define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL) /* 1000ms " */#define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0) /* 250ms " */#define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1) /* 16ms " */#define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0) /* 1.9ms " *//* INTERRUPT CONTROL *//* These two bits are defined in the Special Function Registers *//* #define WDTIE 0x01 *//* #define WDTIFG 0x01 *//************************************************************* HARDWARE MUL TIPLIER************************************************************/#define __MSP430_HAS_MPY__ /* Definition to show that Module is available */#define MPY_ (0x0130) /* Multiply Unsigned/Operand 1 */DEFW( MPY , MPY_)#define MPYS_ (0x0132) /* Multiply Signed/Operand 1 */DEFW( MPYS , MPYS_)#define MAC_ (0x0134) /* Multiply Unsigned and Accumulate/Operand 1 */ DEFW( MAC , MAC_)#define MACS_ (0x0136) /* Multiply Signed and Accumulate/Operand 1 */ DEFW( MACS , MACS_)#define OP2_ (0x0138) /* Operand 2 */DEFW( OP2 , OP2_)#define RESLO_ (0x013A) /* Result Low W ord */DEFW( RESLO , RESLO_)#define RESHI_ (0x013C) /* Result High W ord */DEFW( RESHI , RESHI_)#define SUMEXT_ (0x013E) /* Sum Extend */READ_ONL Y DEFW( SUMEXT , SUMEXT_)/************************************************************* DIGITAL I/O Port1/2************************************************************/#define __MSP430_HAS_PORT1__ /* Definition to show that Module is available */ #define __MSP430_HAS_PORT2__ /* Definition to show that Module is available */#define P1IN_ (0x0020) /* Port 1 Input */READ_ONL Y DEFC( P1IN , P1IN_)#define P1OUT_ (0x0021) /* Port 1 Output */DEFC( P1OUT , P1OUT_)#define P1DIR_ (0x0022) /* Port 1 Direction */DEFC( P1DIR , P1DIR_)#define P1IFG_ (0x0023) /* Port 1 Interrupt Flag */DEFC( P1IFG , P1IFG_)#define P1IES_ (0x0024) /* Port 1 Interrupt Edge Select */DEFC( P1IES , P1IES_)#define P1IE_ (0x0025) /* Port 1 Interrupt Enable */DEFC( P1IE , P1IE_)#define P1SEL_ (0x0026) /* Port 1 Selection */DEFC( P1SEL, P1SEL_)#define P2IN_ (0x0028) /* Port 2 Input */READ_ONL Y DEFC( P2IN , P2IN_)#define P2OUT_ (0x0029) /* Port 2 Output */DEFC( P2OUT , P2OUT_)#define P2DIR_ (0x002A) /* Port 2 Direction */DEFC( P2DIR , P2DIR_)#define P2IFG_ (0x002B) /* Port 2 Interrupt Flag */DEFC( P2IFG , P2IFG_)#define P2IES_ (0x002C) /* Port 2 Interrupt Edge Select */DEFC( P2IES , P2IES_)#define P2IE_ (0x002D) /* Port 2 Interrupt Enable */DEFC( P2IE , P2IE_)#define P2SEL_ (0x002E) /* Port 2 Selection */DEFC( P2SEL, P2SEL_)/************************************************************* DIGITAL I/O Port3/4************************************************************/#define __MSP430_HAS_PORT3__ /* Definition to show that Module is available */ #define __MSP430_HAS_PORT4__ /* Definition to show that Module is available */#define P3IN_ (0x0018) /* Port 3 Input */READ_ONL Y DEFC( P3IN , P3IN_)#define P3OUT_ (0x0019) /* Port 3 Output */DEFC( P3OUT , P3OUT_)#define P3DIR_ (0x001A) /* Port 3 Direction */DEFC( P3DIR , P3DIR_)#define P3SEL_ (0x001B) /* Port 3 Selection */DEFC( P3SEL, P3SEL_)#define P4IN_ (0x001C) /* Port 4 Input */READ_ONL Y DEFC( P4IN , P4IN_)#define P4OUT_ (0x001D) /* Port 4 Output */DEFC( P4OUT , P4OUT_)#define P4DIR_ (0x001E) /* Port 4 Direction */DEFC( P4DIR , P4DIR_)#define P4SEL_ (0x001F) /* Port 4 Selection */DEFC( P4SEL, P4SEL_)/************************************************************* DIGITAL I/O Port5/6************************************************************/#define __MSP430_HAS_PORT5__ /* Definition to show that Module is available */ #define __MSP430_HAS_PORT6__ /* Definition to show that Module is available */#define P5IN_ (0x0030) /* Port 5 Input */READ_ONL Y DEFC( P5IN , P5IN_)#define P5OUT_ (0x0031) /* Port 5 Output */DEFC( P5OUT , P5OUT_)#define P5DIR_ (0x0032) /* Port 5 Direction */DEFC( P5DIR , P5DIR_)#define P5SEL_ (0x0033) /* Port 5 Selection */DEFC( P5SEL, P5SEL_)#define P6IN_ (0x0034) /* Port 6 Input */READ_ONL Y DEFC( P6IN , P6IN_)#define P6OUT_ (0x0035) /* Port 6 Output */DEFC( P6OUT , P6OUT_)#define P6DIR_ (0x0036) /* Port 6 Direction */DEFC( P6DIR , P6DIR_)#define P6SEL_ (0x0037) /* Port 6 Selection */DEFC( P6SEL, P6SEL_)/************************************************************* USART************************************************************//* UxCTL */#define PENA(0x80) /* Parity enable */#define PEV (0x40) /* Parity 0:odd / 1:even */#define SPB (0x20) /* Stop Bits 0:one / 1: two */#define CHAR (0x10) /* Data 0:7-bits / 1:8-bits */#define LISTEN (0x08) /* Listen mode */#define SYNC (0x04) /* UART / SPI mode */#define MM (0x02) /* Master Mode off/on */#define SWRST (0x01) /* USART Software Reset *//* UxTCTL */#define CKPH (0x80) /* SPI: Clock Phase */#define CKPL(0x40) /* Clock Polarity */#define SS EL1 (0x20) /* Clock Source Select 1 */#define SSEL0 (0x10) /* Clock Source Select 0 */#define URXSE (0x08) /* Receive Start edge select */#define TXW AKE (0x04) /* TX W ake up mode */#define STC (0x02) /* SPI: STC enable 0:on / 1:off */#define TXEPT (0x01) /* TX Buffer empty *//* UxRCTL */#define FE (0x80) /* Frame Error */#define PE (0x40) /* Parity Error */#define OE (0x20) /* Overrun Error */#define BRK (0x10) /* Break detected */#define URXEIE (0x08) /* RX Error interrupt enable */#define URXWIE (0x04) /* RX W ake up interrupt enable */ #define RXWAKE (0x02) /* RX W ake up detect */#define RXERR (0x01) /* RX Error Error *//************************************************************* USART 0************************************************************/#define __MSP430_HAS_UART0__ /* Definition to show that Module is available */#define U0CTL_ (0x0070) /* USART 0 Control */DEFC( U0CTL, U0CTL_)#define U0TCTL_ (0x0071) /* USART 0 Transmit Control */DEFC( U0TCTL, U0TCTL_)#define U0RCTL_ (0x0072) /* USART 0 Receive Control */DEFC( U0RCTL, U0RCTL_)#define U0MCTL_ (0x0073) /* USART 0 Modulation Control */DEFC( U0MCTL, U0MCTL_)#define U0BR0_ (0x0074) /* USART 0 Baud Rate 0 */DEFC( U0BR0 , U0BR0_)#define U0BR1_ (0x0075) /* USART 0 Baud Rate 1 */DEFC( U0BR1 , U0BR1_)#define U0RXBUF_ (0x0076) /* USART 0 Receive Buffer */READ_ONL Y DEFC( U0RXBUF , U0RXBUF_)#define U0TXBUF_ (0x0077) /* USART 0 Transmit Buffer */DEFC( U0TXBUF , U0TXBUF_)/* Alternate register names */#define UCTL0 U0CTL/* USART 0 Control */#define UTCTL0 U0TCTL/* USART 0 Transmit Control */#define URCTL0 U0RCTL/* USART 0 Receive Control */#define UMCTL0 U0MCTL/* USART 0 Modulation Control */#define UBR00 U0BR0 /* USART 0 Baud Rate 0 */#define UBR10 U0BR1 /* USART 0 Baud Rate 1 */#define RXBUF0 U0RXBUF /* USART 0 Receive Buffer */#define TXBUF0 U0TXBUF /* USART 0 Transmit Buffer */#define UCTL0_ U0CTL_ /* USART 0 Control */#define UTCTL0_ U0TCTL_ /* USART 0 Transmit Control */#define URCTL0_ U0RCTL_ /* USART 0 Receive Control */#define UMCTL0_ U0MCTL_ /* USART 0 Modulation Control */#define UBR00_ U0BR0_ /* USART 0 Baud Rate 0 */#define UBR10_ U0BR1_ /* USART 0 Baud Rate 1 */#define RXBUF0_ U0RXBUF_ /* USART 0 Receive Buffer */#define TXBUF0_ U0TXBUF_ /* USART 0 Transmit Buffer */#define UCTL_0 U0CTL/* USART 0 Control */#define UTCTL_0 U0TCTL/* USART 0 Transmit Control */#define URCTL_0 U0RCTL/* USART 0 Receive Control */#define UMCTL_0 U0MCT L/* USART 0 Modulation Control */#define UBR0_0 U0BR0 /* USART 0 Baud Rate 0 */#define UBR1_0 U0BR1 /* USART 0 Baud Rate 1 */#define RXBUF_0 U0RXBUF /* USART 0 Receive Buffer */#define TXBUF_0 U0TXBUF /* USART 0 Transmit Buffer */#define UCTL_0_ U0CTL_ /* USART 0 Control */#define UTCTL_0_ U0TCTL_ /* USART 0 Transmit Control */#define URCTL_0_ U0RCTL_ /* USART 0 Receive Control */#define UMCTL_0_ U0MCTL_ /* USART 0 Modulation Control */#define UBR0_0_ U0BR0_ /* USART 0 Baud Rate 0 */#define UBR1_0_ U0BR1_ /* USART 0 Baud Rate 1 */#define RXBUF_0_ U0RXBUF_ /* USART 0 Receive Buffer */#define TXBUF_0_ U0TXBUF_ /* USART 0 Transmit Buffer *//************************************************************* USART 1************************************************************/#define __MSP430_HAS_UART1__ /* Definition to show that Module is available */#define U1CTL_ (0x0078) /* USART 1 Control */DEFC( U1CTL, U1CTL_)#define U1TCTL_ (0x0079) /* USART 1 Transmit Control */DEFC( U1TCTL, U1TCTL_)#define U1RCTL_ (0x007A) /* USART 1 Receive Control */DEFC( U1RCTL, U1RCTL_)#define U1MCTL_ (0x007B) /* USART 1 Modulation Control */DEFC( U1MCTL, U1MCTL_)#define U1BR0_ (0x007C) /* USART 1 Baud Rate 0 */DEFC( U1BR0 , U1BR0_)#define U1BR1_ (0x007D) /* USART 1 Baud Rate 1 */DEFC( U1BR1 , U1BR1_)#define U1RXBUF_ (0x007E) /* USART 1 Receive Buffer */READ_ONL Y DEFC( U1RXBUF , U1RXBUF_)#define U1TXBUF_ (0x007F) /* USART 1 Transmit Buffer */DEFC( U1TXBUF , U1TXBUF_)/* Alternate register names */#define UCTL1 U1CTL/* USART 1 Control */#define UTCTL1 U1TCTL/* USART 1 Transmit Control */#define URCTL1 U1RCTL/* USART 1 Receive Control */#define UMCTL1 U1MCTL/* USART 1 Modulation Control */#define UBR01 U1BR0 /* USART 1 Baud Rate 0 */#define UBR11 U1BR1 /* USART 1 Baud Rate 1 */#define RXBUF1 U1RXBUF /* USART 1 Receive Buffer */#define TXBUF1 U1TXBUF /* USART 1 Transmit Buffer */#define UCTL1_ U1CTL_ /* USART 1 Control */#define UTCTL1_ U1TCTL_ /* USART 1 Transmit Control */#define URCTL1_ U1RCTL_ /* USART 1 Receive Control */#define UMCTL1_ U1MCTL_ /* USART 1 Modulation Control */#define UBR01_ U1BR0_ /* USART 1 Baud Rate 0 */#define UBR11_ U1BR1_ /* USART 1 Baud Rate 1 */#define RXBUF1_ U1RXBUF_ /* USART 1 Receive Buffer */#define TXBUF1_ U1TXBUF_ /* USART 1 Transmit Buffer */#define UCTL_1 U1CTL/* USART 1 Control */#define UTCTL_1 U1TCTL/* USART 1 Transmit Control */#define URCTL_1 U1RCTL/* USART 1 Receive Control */#define UMCTL_1 U1MCTL/* USART 1 Modulation Control */#define UBR0_1 U1BR0 /* USART 1 Baud Rate 0 */#define UBR1_1 U1BR1 /* USART 1 Baud Rate 1 */#define RXBUF_1 U1RXBUF /* USART 1 Receive Buffer */#define TXBUF_1 U1TXBUF /* USART 1 Transmit Buffer */#define UCTL_1_ U1CTL_ /* USART 1 Control */#define UTCTL_1_ U1TCTL_ /* USART 1 Transmit Control */#define URCTL_1_ U1RCTL_ /* USART 1 Receive Control */#define UMCTL_1_ U1MCTL_ /* USART 1 Modulation Control */#define UBR0_1_ U1BR0_ /* USART 1 Baud Rate 0 */#define UBR1_1_ U1BR1_ /* USART 1 Baud Rate 1 */#define RXBUF_1_ U1RXBUF_ /* USART 1 Receive Buffer */#define TXBUF_1_ U1TXBUF_ /* USART 1 Transmit Buffer *//************************************************************* Timer A3************************************************************/#define __MSP430_HAS_TA3__ /* Definition to show that Module is available */#define TAIV_ (0x012E) /* Timer A Interrupt V ector W ord */READ_ONL Y DEFW( TAIV , TAIV_)#define TACTL_ (0x0160) /* Timer A Control */DEFW( TACTL, TACTL_)#define TACCTL0_ (0x0162) /* Timer A Capture/Compare Control 0 */ DEFW( TACCTL0 , TACCTL0_)#define TACCTL1_ (0x0164) /* Timer A Capture/Compare Control 1 */ DEFW( TACCTL1 , TACCTL1_)#define TACCTL2_ (0x0166) /* Timer A Capture/Compare Control 2 */ DEFW( TACCTL2 , TACCTL2_)#define TAR_ (0x0170) /* Timer A */DEFW( TAR , TAR_)#define TACCR0_ (0x0172) /* Timer A Capture/Compare 0 */DEFW( TACCR0 , TACCR0_)#define TACCR1_ (0x0174) /* Timer A Capture/Compare 1 */DEFW( TACCR1 , TACCR1_)#define TACCR2_ (0x0176) /* Timer A Capture/Compare 2 */DEFW( TACCR2 , TACCR2_)/* Alternate register names */#define CCTL0 TACCTL0 /* Timer A Capture/Compare Control 0 */ #define CCTL1 TACCTL1 /* Timer A Capture/Compare Control 1 */ #define CCTL2 TACCTL2 /* Timer A Capture/Compare Control 2 */ #define CCR0 TACCR0 /* Timer A Capture/Compare 0 */#define CCR1 TACCR1 /* Timer A Capture/Compare 1 */#define CCR2 TACCR2 /* Timer A Capture/Compare 2 */#define CCTL0_ TACCTL0_ /* Timer A Capture/Compare Control 0 */ #define CCTL1_ TACCTL1_ /* Timer A Capture/Compare Control 1 */ #define CCTL2_ TACCTL2_ /* Timer A Capture/Compare Control 2 */ #define CCR0_ TACCR0_ /* Timer A Capture/Compare 0 */#define CCR1_ TACCR1_ /* Timer A Capture/Compare 1 */#define CCR2_ TACCR2_ /* Timer A Capture/Compare 2 */#define TASSEL1 (0x0200) /* Timer A clock source select 0 */#define TASSEL0 (0x0100) /* Timer A clock source select 1 */#define ID1 (0x0080) /* Timer A clock input divider 1 */#define ID0 (0x0040) /* Timer A clock input divider 0 */#define MC1 (0x0020) /* Timer A mode control 1 */#define MC0 (0x0010) /* Timer A mode control 0 */#define TACLR (0x0004) /* Timer A counter clear */#define TAIE (0x0002) /* Timer A counter interrupt enable */#define TAIFG (0x0001) /* Timer A counter interrupt flag */#define MC_0 (0*0x10u) /* Timer A mode control: 0 - Stop */#define MC_1 (1*0x10u) /* Timer A mode control: 1 - Up to CCR0 */ #define MC_2 (2*0x10u) /* Timer A mode control: 2 - Continous up */ #define MC_3 (3*0x10u) /* Timer A mode control: 3 - Up/Down */#define ID_0 (0*0x40u) /* Timer A input divider: 0 - /1 */#define ID_1 (1*0x40u) /* Timer A input divider: 1 - /2 */#define ID_2 (2*0x40u) /* Timer A input divider: 2 - /4 */#define ID_3 (3*0x40u) /* Timer A input divider: 3 - /8 */#define TASSEL_0 (0*0x100u) /* Timer A clock source select: 0 - TACLK */ #define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */ #define TASSEL_2 (2*0x100u) /* Timer A clock source select: 2 - SMCLK */ #define TASSEL_3 (3*0x100u) /* Timer A clock source select: 3 - INCLK */#define CM1 (0x8000) /* Capture mode 1 */#define CM0 (0x4000) /* Capture mode 0 */#define CCI S1 (0x2000) /* Capture input select 1 */#define CCI S0 (0x1000) /* Capture input select 0 */#define SCS (0x0800) /* Capture sychronize */#define SCCI (0x0400) /* Latched capture signal (read) */#define CAP (0x0100) /* Capture mode: 1 /Compare mode : 0 */#define OUTMOD2 (0x0080) /* Output mode 2 */#define OUTMOD1 (0x0040) /* Output mode 1 */#define OUTMOD0 (0x0020) /* Output mode 0 */#define CCIE (0x0010) /* Capture/compare interrupt enable */#define CCI (0x0008) /* Capture input signal (read) */#define OUT (0x0004) /* PWM Output signal if output mode 0 */#define COV (0x0002) /* Capture/compare overflow flag */#define CCIFG (0x0001) /* Capture/compare interrupt flag */#define OUTMOD_0 (0*0x20u) /* PWM output mode: 0 - output only */#define OUTMOD_1 (1*0x20u) /* PWM output mode: 1 - set */#define OUTMOD_2 (2*0x20u) /* PWM output mode: 2 - PWM toggle/reset */ #define OUTMOD_3 (3*0x20u) /* PWM output mode: 3 - PWM set/reset */#define OUTMOD_4 (4*0x20u) /* PWM output mode: 4 - toggle */#define OUTMOD_5 (5*0x20u) /* PWM output mode: 5 - Reset */#define OUTMOD_6 (6*0x20u) /* PWM output mode: 6 - PWM toggle/set */ #define OUTMOD_7 (7*0x20u) /* PWM output mode: 7 - PWM reset/set */#define CCI S_0 (0*0x1000u) /* Capture input select: 0 - CCIxA */#define CCI S_1 (1*0x1000u) /* Capture input select: 1 - CCIxB */#define CCI S_2 (2*0x1000u) /* Capture input select: 2 - GND */#define CCI S_3 (3*0x1000u) /* Capture input select: 3 - Vcc */#define CM_0 (0*0x4000u) /* Capture mode: 0 - disabled */#define CM_1 (1*0x4000u) /* Capture mode: 1 - pos. edge */#define CM_2 (2*0x4000u) /* Capture mode: 1 - neg. edge */#define CM_3 (3*0x4000u) /* Capture mode: 1 - both edges *//************************************************************* Timer B7************************************************************/#define __MSP430_HAS_TB7__ /* Definition to show that Module is available */#define TBIV_ (0x011E) /* Timer B Interrupt V ector W ord */READ_ONL Y DEFW( TBIV , TBIV_)#define TBCTL_ (0x0180) /* Timer B Control */DEFW( TBCTL, TBCTL_)#define TBCCTL0_ (0x0182) /* Timer B Capture/Compare Control 0 */ DEFW( TBCCTL0 , TBCCTL0_)#define TBCCTL1_ (0x0184) /* Timer B Capture/Compare Control 1 */ DEFW( TBCCTL1 , TBCCTL1_)#define TBCCTL2_ (0x0186) /* Timer B Capture/Compare Control 2 */ DEFW( TBCCTL2 , TBCCTL2_)#define TBCCTL3_ (0x0188) /* Timer B Capture/Compare Control 3 */ DEFW( TBCCTL3 , TBCCTL3_)#define TBCCTL4_ (0x018A) /* Timer B Capture/Compare Control 4 */ DEFW( TBCCTL4 , TBCCTL4_)#define TBCCTL5_ (0x018C) /* Timer B Capture/Compare Control 5 */ DEFW( TBCCTL5 , TBCCTL5_)#define TBCCTL6_ (0x018E) /* Timer B Capture/Compare Control 6 */ DEFW( TBCCTL6 , TBCCTL6_)#define TBR_ (0x0190) /* Timer B */DEFW( TBR , TBR_)#define TBCCR0_ (0x0192) /* Timer B Capture/Compare 0 */DEFW( TBCCR0 , TBCCR0_)#define TBCCR1_ (0x0194) /* Timer B Capture/Compare 1 */DEFW( TBCCR1 , TBCCR1_)#define TBCCR2_ (0x0196) /* Timer B Capture/Compare 2 */DEFW( TBCCR2 , TBCCR2_)#define TBCCR3_ (0x0198) /* Timer B Capture/Compare 3 */DEFW( TBCCR3 , TBCCR3_)#define TBCCR4_ (0x019A) /* Timer B Capture/Compare 4 */DEFW( TBCCR4 , TBCCR4_)#define TBCCR5_ (0x019C) /* Timer B Capture/Compare 5 */DEFW( TBCCR5 , TBCCR5_)#define TBCCR6_ (0x019E) /* Timer B Capture/Compare 6 */DEFW( TBCCR6 , TBCCR6_)#define TBCLGRP1 (0x4000) /* Timer B Compare latch load group 1 */ #define TBCLGRP0 (0x2000) /* Timer B Compare latch load group 0 */ #define CNTL1 (0x1000) /* Counter lenght 1 */#define CNTL0 (0x0800) /* Counter lenght 0 */#define TBSSEL1 (0x0200) /* Clock source 1 */#define TBSSEL0 (0x0100) /* Clock source 0 */#define TBCLR (0x0004) /* Timer B counter clear */#define TBIE (0x0002) /* Timer B interrupt enable */#define TBIFG (0x0001) /* Timer B interrupt flag */#define SHR1 (0x4000) /* Timer B Compare latch load group 1 */ #define SHR0 (0x2000) /* Timer B Compare latch load group 0 */#define TBSSEL_0 (0*0x0100u) /* Clock Source: TBCLK */#define TBSSEL_1 (1*0x0100u) /* Clock Source: ACLK */#define TBSSEL_2 (2*0x0100u) /* Clock Source: SMCLK */#define TBSSEL_3 (3*0x0100u) /* Clock Source: INCLK */#define CNTL_0 (0*0x0800u) /* Counter lenght: 16 bit */#define CNTL_1 (1*0x0800u) /* Counter lenght: 12 bit */#define CNTL_2 (2*0x0800u) /* Counter lenght: 10 bit */#define CNTL_3 (3*0x0800u) /* Counter lenght: 8 bit */#define SHR_0 (0*0x2000u) /* Timer B Group: 0 - individually */#define SHR_1 (1*0x2000u) /* Timer B Group: 1 - 3 groups (1-2, 3-4, 5-6) */#define SHR_2 (2*0x2000u) /* Timer B Group: 2 - 2 groups (1-3, 4-6)*/#define SHR_3 (3*0x2000u) /* Timer B Group: 3 - 1 group (all) */#define TBCLGRP_0 (0*0x2000u) /* Timer B Group: 0 - individually */#define TBCLGRP_1 (1*0x2000u) /* Timer B Group: 1 - 3 groups (1-2, 3-4, 5-6) */#define TBCLGRP_2 (2*0x2000u) /* Timer B Group: 2 - 2 groups (1-3, 4-6)*/#define TBCLGRP_3 (3*0x2000u) /* Timer B Group: 3 - 1 group (all) *//* Additional Timer B Control Register bits are defined in Timer A */#define CLLD1 (0x0400) /* Compare latch load source 1 */#define CLLD0 (0x0200) /* Compare latch load source 0 */#define SLSHR1 (0x0400) /* Compare latch load source 1 */#define SLSHR0 (0x0200) /* Compare latch load source 0 */#define SLSHR_0 (0*0x0200u) /* Compare latch load sourec : 0 - immediate */#define SLSHR_1 (1*0x0200u) /* Compare latch load sourec : 1 - TBR counts to 0 */#define SLSHR_2 (2*0x0200u) /* Compare latch load sourec : 2 - up/down */#define SLSHR_3 (3*0x0200u) /* Compare latch load sourec : 3 - TBR counts to TBCTL0 */#define CLLD_0 (0*0x0200u) /* Compare latch load sourec : 0 - immediate */#define CLLD_1 (1*0x0200u) /* Compare latch load sourec : 1 - TBR counts to 0 */#define CLLD_2 (2*0x0200u) /* Compare latch load sourec : 2 - up/down */#define CLLD_3 (3*0x0200u) /* Compare latch load sourec : 3 - TBR counts to TBCTL0 *//************************************************************* Basic Clock Module************************************************************/#define __MSP430_HAS_BASIC_CLOCK__ /* Definition to show that Module is available */#define DCOCTL_ (0x0056) /* DCO Clock Frequency Control */DEFC( DCOCTL, DCOCTL_)#define BCSCTL1_ (0x0057) /* Basic Clock System Control 1 */DEFC( BCSCTL1 , BCSCTL1_)#define BCSCTL2_ (0x0058) /* Basic Clock System Control 2 */。
[说明]IAR430头文件中define定义的部分解释
IAR 430 头文件中#define定义的部分解释今天在阅读RF_Example_Code_v1.0中头文件cc430x613x.h时发现了几部分的疑问。
首先来看一下cc430x613x.h 中的3个#define的例子:#define DEFC(name, address) __no_init volatile unsigned char name @ address;#define DEFW(name, address) __no_init volatile unsigned short name @ address;#define DEFCW(name, address) __no_init union \{ \struct \{ \volatile unsigned char name##_L; \volatile unsigned char name##_H; \}; \volatile unsigned short name; \} @ address;前面的两个#define的用法是一样的。
首先我可以发现,在宏定义里面都有一个关键字__no_init。
查看了《MSP430 IAR C/EC++ Compiler Reference Guide》内的IAR Language Extension Overview 可以发现,__no_init是IAR扩展语法里面的一个扩展关键字。
作用是声明一个non-volatile类型的内存地址(Support non-valotile memory)。
于是解决了__no_init的问题。
再者对@这个字符存在一定的疑问,于是上网查了查资料。
虽然对于@这个字符的用法还是不是很明确,但是可以明确的是:#define DEFC(name, address) __no_init volatile unsigned char name @ address;#define DEFC(name, address) sfrb name = address;这两种定义是等价的,但是后者是基于汇编嵌入式编程的情况下才成立。
MSP430经典例程讲解
这只是我在学习TI公司生产的16位超的功耗单片机MSP430的随笔,希望能对其他朋友有所借鉴,不对之处还请多指教。
下面,开始430之旅。
讲解430的书现在也有很多了,不过大多数都是详细说明底层硬件结构的,看了不免有些空洞和枯燥,我认为了解一个MCU的操作首先要对其基础特性有所了解,然后再仔细研究各模块的功能。
1、首先你要知道msp430的存储器结构。
典型微处理器的结构有两种:冯 ? 诺依曼结构----程序存储器和数据存储器统一编码;哈佛结构----程序存储器和数据存储器。
MSP430系列单片机属于前者,而常用的mcs51系列属于后者。
0-0xf特殊功能寄存器;0x10-0x1ff外围模块寄存器;0x200-?根据不同型号地址从低向高扩展;0x1000-0x107f seg_b0x1080_0x10ff seg_a 供flash信息存储,剩下的从0xffff 开始向下扩展,根据不同容量,例如149为60KB,0xffff-0x11002、复位信号是MCU工作的起点,430的复位型号有两种:上电复位信号POR和上电清楚信号PUC。
POR信号只在上电和RST/NMI复位管脚被设置为复位功能,且低电平时系统复位。
而PUC信号是POR信号产生,以及其他如看门狗定时溢出、安全键值出现错误是产生。
但是,无论那种信号触发的复位,都会使MSP430在地址0xffff处读取复位中断向量,然后程序从中断向量所指的地址开始执行。
复位后的状态不写了,详见参考书,嘿嘿。
3、系统时钟是一个程序运行的指挥官,时序和中断也是整个程序的核心和中轴线。
430最多有三个振荡器:DCO内部振荡器;LFXT1外接低频振荡器,常见的32768HZ,不用外接负载电容;也可接高频450KHZ-8M,需接负载电容;XT2接高频450KHZ-8M,加外接电容。
430有三种时钟信号:MCLK系统主时钟,可分频1/2/4/8,供CPU使用,其他外围模块在有选择情况下也可使用;SMCLK系统子时钟,供外围模块使用,可选则不同振荡器产生的时钟信号;ACLK辅助时钟,只能由LFXT1产生,供外围模块。
430头文件的解释
PUC上电清零powerupclear
tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
unsignedshortWDTIS0:1;//1表示字段宽度(2进制),这表示WDTISO要么是
1要么是0
后面这个8个位和WDTCTL共享存储单元。看userguide,WDTCTL是一个ቤተ መጻሕፍቲ ባይዱ
16位的寄存器,WDTIS0位于其bit0,以此类推,WDTHOLD是bit7,复位之后
这几个位都是0。在MSP的C语言中,并不支持位变量。在430的IO头文件
unsignedshortWDTNMI:1;//看门狗定时器非屏蔽中断选择
unsignedshortWDTTMSEL:1;//看门狗定时器模式选择
unsignedshortWDTCNTCL:1;//看门狗定时器计数器清零选择位
unsignedshortWDTSSEL:1;//看门狗定时器时钟源选择
unsignedshortWDTIS0:1;//看门狗定时间隔选择
430头文件的解释
__no_initvolatileunion{
unsignedshortWDTCTL;/*WatchdogTimerControl*/
struct
{
unsignedshortWDTIS0:1;/**/
unsignedshortWDTIS1:1;/**/
unsignedshortWDTSSEL:1;/**/
中,用这种定义方式实现了对寄存器的位变量访问。
WDTCTL=WDTPW+WDTHOLD;//停止看门狗这个停止看门狗的操作如何解
释?
WDTCTL很明显,是看门狗控制寄存器,而WDTPW是一个宏定义,头文
MSP430头文件带中文注释
#ifndef __msp430x14x#define __msp430x14x/************************************************************ * STANDARD BITS************************************************************/#define BIT0 0x0001#define BIT1 0x0002#define BIT2 0x0004#define BIT3 0x0008#define BIT4 0x0010#define BIT5 0x0020#define BIT6 0x0040#define BIT7 0x0080#define BIT8 0x0100#define BIT9 0x0200#define BITA 0x0400#define BITB 0x0800#define BITC 0x1000#define BITD 0x2000#define BITE 0x4000#define BITF 0x8000/************************************************************ * STATUS REGISTER BITS************************************************************/#define C 0x0001#define Z 0x0002#define N 0x0004#define V 0x0100#define GIE 0x0008#define CPUOFF 0x0010#define OSCOFF 0x0020#define SCG0 0x0040#define SCG1 0x0080/* Low Power Modes coded with Bits 4-7 in SR */#ifndef __IAR_SYSTEMS_ICC /* Begin #defines for assembler */#define LPM0 CPUOFF#define LPM1 SCG0+CPUOFF#define LPM2 SCG1+CPUOFF#define LPM3 SCG1+SCG0+CPUOFF#define LPM4 SCG1+SCG0+OSCOFF+CPUOFF/* End #defines for assembler */#else /* Begin #defines for C */#define LPM0_bits CPUOFF#define LPM1_bits SCG0+CPUOFF#define LPM2_bits SCG1+CPUOFF#define LPM3_bits SCG1+SCG0+CPUOFF#define LPM4_bits SCG1+SCG0+OSCOFF+CPUOFF#include <In430.h>#define LPM0 _BIS_SR(LPM0_bits) /* Enter Low Power Mode 0 */#define LPM0_EXIT _BIC_SR(LPM0_bits) /* Exit Low Power Mode 0 */#define LPM1 _BIS_SR(LPM1_bits) /* Enter Low Power Mode 1 */#define LPM1_EXIT _BIC_SR(LPM1_bits) /* Exit Low Power Mode 1 */#define LPM2 _BIS_SR(LPM2_bits) /* Enter Low Power Mode 2 */#define LPM2_EXIT _BIC_SR(LPM2_bits) /* Exit Low Power Mode 2 */#define LPM3 _BIS_SR(LPM3_bits) /* Enter Low Power Mode 3 */#define LPM3_EXIT _BIC_SR(LPM3_bits) /* Exit Low Power Mode 3 */#define LPM4 _BIS_SR(LPM4_bits) /* Enter Low Power Mode 4 */#define LPM4_EXIT _BIC_SR(LPM4_bits) /* Exit Low Power Mode 4 */#endif /* End #defines for C *//************************************************************ * PERIPHERAL FILE MAP************************************************************//************************************************************ * 特殊功能寄存器地址和控制位************************************************************/ /*中断使能1*/#define IE1_ 0x0000sfrb IE1 = IE1_;#define WDTIE 0x01 /*看门狗中断使能*/#define OFIE 0x02 /*外部晶振故障中断使能*/#define NMIIE 0x10 /*非屏蔽中断使能*/#define ACCVIE 0x20 /*可屏蔽中断使能/flash写中断错误*/#define URXIE0 0x40 /*串口0接收中断使能*/#define UTXIE0 0x80 /*串口0发送中断使能*//*中断标志1*/#define IFG1_ 0x0002sfrb IFG1 = IFG1_;#define WDTIFG 0x01 /*看门狗中断标志*/#define OFIFG 0x02 /*外部晶振故障中断标志*/#define NMIIFG 0x10 /*非屏蔽中断标志*/#define URXIFG0 0x40 /*串口0接收中断标志*/#define UTXIFG0 0x80 /*串口0发送中断标志*//* 中断模式使能1 */#define ME1_ 0x0004sfrb ME1 = ME1_;#define URXE0 0x40 /* 串口0接收中断模式使能*/#define USPIE0 0x40 /* 同步中断模式使能*/#define UTXE0 0x80 /* 串口0发送中断模式使能*//* 中断使能2 */#define IE2_ 0x0001sfrb IE2 = IE2_;#define URXIE1 0x10 /* 串口1接收中断使能*/#define UTXIE1 0x20 /* 串口1发送中断使能*//* 中断标志2 */#define IFG2_ 0x0003sfrb IFG2 = IFG2_;#define URXIFG1 0x10 /* 串口1接收中断标志*/#define UTXIFG1 0x20 /* 串口1发送中断标志*//* 中断模式使能2 */#define ME2_ 0x0005sfrb ME2 = ME2_;#define URXE1 0x10 /* 串口1接收中断模式使能*/#define USPIE1 0x10 /* 同步中断模式使能*/#define UTXE1 0x20 /* 串口1发送中断模式使能*//************************************************************* 看门狗定时器的寄存器定义************************************************************/#define WDTCTL_ 0x0120sfrw WDTCTL = WDTCTL_;#define WDTIS0 0x0001 /*选择WDTCNT的四个输出端之一*/#define WDTIS1 0x0002 /*选择WDTCNT的四个输出端之一*/#define WDTSSEL 0x0004 /*选择WDTCNT的时钟源*/#define WDTCNTCL 0x0008 /*清除WDTCNT端: 为1时从0开始计数*/#define WDTTMSEL 0x0010 /*选择模式0: 看门狗模式; 1: 定时器模式*/#define WDTNMI 0x0020 /*选择NMI/RST 引脚功能0:为RST; 1:为NMI*/#define WDTNMIES 0x0040 /*WDTNMI=1时.选择触发延0:为上升延1:为下降延*/ #define WDTHOLD 0x0080 /*停止看门狗定时器工作0:启动;1:停止*/#define WDTPW 0x5A00 /* 写密码:高八位*//* SMCLK= 1MHz定时器模式*/#define WDT_MDLY_32 WDTPW+WDTTMSEL+WDTCNTCL /* TSMCLK*2POWER15=32ms 复位状态*/#define WDT_MDLY_8 WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0 /* TSMCLK*2POWER13=8.192ms " */#define WDT_MDLY_0_5 WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1 /* TSMCLK*2POWER9=0.512ms " */#define WDT_MDLY_0_064 WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0 /* TSMCLK*2POWER6=0.512ms " *//* ACLK=32.768KHz 定时器模式*/#define WDT_ADLY_1000 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL /* TACLK*2POWER15=1000ms " */#define WDT_ADLY_250 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0 /* TACLK*2POWER13=250ms " */#define WDT_ADLY_16 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1 /* TACLK*2POWER9=16ms " */#define WDT_ADLY_1_9 WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0 /* TACLK*2POWER6=1.9ms " *//* SMCLK=1MHz看门狗模式*/#define WDT_MRST_32 WDTPW+WDTCNTCL /* TSMCLK*2POWER15=32ms 复位状态*/#define WDT_MRST_8 WDTPW+WDTCNTCL+WDTIS0 /* TSMCLK*2POWER13=8.192ms " */#define WDT_MRST_0_5 WDTPW+WDTCNTCL+WDTIS1 /* TSMCLK*2POWER9=0.512ms " */#define WDT_MRST_0_064 WDTPW+WDTCNTCL+WDTIS1+WDTIS0 /* TSMCLK*2POWER6=0.512ms " *//* ACLK=32KHz看门狗模式*/#define WDT_ARST_1000 WDTPW+WDTCNTCL+WDTSSEL /* TACLK*2POWER15=1000ms " */#define WDT_ARST_250 WDTPW+WDTCNTCL+WDTSSEL+WDTIS0 /* TACLK*2POWER13=250ms " */#define WDT_ARST_16 WDTPW+WDTCNTCL+WDTSSEL+WDTIS1 /* TACLK*2POWER9=16ms " */ #define WDT_ARST_1_9 WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0 /* TACLK*2POWER6=1.9ms " *//************************************************************硬件乘法器的寄存器定义************************************************************/#define MPY_ 0x0130 /* 无符号乘法*/sfrw MPY = MPY_;#define MPYS_ 0x0132 /* 有符号乘法*/sfrw MPYS = MPYS_;#define MAC_ 0x0134 /* 无符号乘加*/sfrw MAC = MAC_;#define MACS_ 0x0136 /* 有符号乘加*/sfrw MACS = MACS_;#define OP2_ 0x0138 /* 第二乘数*/sfrw OP2 = OP2_;#define RESLO_ 0x013A /* 低6位结果寄存器*/sfrw RESLO = RESLO_;#define RESHI_ 0x013C /* 高6位结果寄存器*/sfrw RESHI = RESHI_;#define SUMEXT_ 0x013E /*结果扩展寄存器*/const sfrw SUMEXT = SUMEXT_;/************************************************************ * DIGITAL I/O Port1/2 寄存器定义有中断功能************************************************************/#define P1IN_ 0x0020 /* P1 输入寄存器*/const sfrb P1IN = P1IN_;#define P1OUT_ 0x0021 /* P1 输出寄存器*/sfrb P1OUT = P1OUT_;#define P1DIR_ 0x0022 /* P1 方向选择寄存器*/sfrb P1DIR = P1DIR_;#define P1IFG_ 0x0023 /* P1 中断标志寄存器*/sfrb P1IFG = P1IFG_;#define P1IES_ 0x0024 /* P1 中断边沿选择寄存器*/sfrb P1IES = P1IES_;#define P1IE_ 0x0025 /* P1 中断使能寄存器*/sfrb P1IE = P1IE_;#define P1SEL_ 0x0026 /* P1 功能选择寄存器*/sfrb P1SEL = P1SEL_;#define P2IN_ 0x0028 /* P2 输入寄存器*/const sfrb P2IN = P2IN_;#define P2OUT_ 0x0029 /* P2 输出寄存器*/sfrb P2OUT = P2OUT_;#define P2DIR_ 0x002A /* P2 方向选择寄存器*/sfrb P2DIR = P2DIR_;#define P2IFG_ 0x002B /* P2 中断标志寄存器*/sfrb P2IFG = P2IFG_;#define P2IES_ 0x002C /* P2 中断边沿选择寄存器*/sfrb P2IES = P2IES_;#define P2IE_ 0x002D /* P2 中断使能寄存器*/sfrb P2IE = P2IE_;#define P2SEL_ 0x002E /* P2 功能选择寄存器*/sfrb P2SEL = P2SEL_;/************************************************************ * DIGITAL I/O Port3/4寄存器定义无中断功能************************************************************/#define P3IN_ 0x0018 /* P3 输入寄存器*/const sfrb P3IN = P3IN_;#define P3OUT_ 0x0019 /* P3 输出寄存器*/sfrb P3OUT = P3OUT_;#define P3DIR_ 0x001A /* P3 方向选择寄存器*/sfrb P3DIR = P3DIR_;#define P3SEL_ 0x001B /* P3 功能选择寄存器*/sfrb P3SEL = P3SEL_;#define P4IN_ 0x001C /* P4 输入寄存器*/const sfrb P4IN = P4IN_;#define P4OUT_ 0x001D /* P4 输出寄存器*/sfrb P4OUT = P4OUT_;#define P4DIR_ 0x001E /* P4 方向选择寄存器*/sfrb P4DIR = P4DIR_;#define P4SEL_ 0x001F /* P4 功能选择寄存器*/sfrb P4SEL = P4SEL_;/************************************************************ * DIGITAL I/O Port5/6 I/O口寄存器定义PORT5和6 无中断功能************************************************************/#define P5IN_ 0x0030 /* P5 输入寄存器*/const sfrb P5IN = P5IN_;#define P5OUT_ 0x0031 /* P5 输出寄存器*/sfrb P5OUT = P5OUT_;#define P5DIR_ 0x0032 /* P5 方向选择寄存器*/sfrb P5DIR = P5DIR_;#define P5SEL_ 0x0033 /* P5 功能选择寄存器*/sfrb P5SEL = P5SEL_;#define P6IN_ 0x0034 /* P6 输入寄存器*/const sfrb P6IN = P6IN_;#define P6OUT_ 0x0035 /* P6 输出寄存器*/sfrb P6OUT = P6OUT_;#define P6DIR_ 0x0036 /* P6 方向选择寄存器*/sfrb P6DIR = P6DIR_;#define P6SEL_ 0x0037 /* P6 功能选择寄存器*/sfrb P6SEL = P6SEL_;/************************************************************* USART 串口寄存器"UCTL","UTCTL","URCTL"定义的各个位可串口1 串口2公用************************************************************//* UCTL 串口控制寄存器*/#define PENA 0x80 /*校验允许位*/#define PEV 0x40 /*偶校验为0时为奇校验*/#define SPB 0x20 /*停止位为2 为0时停止位为1*/#define CHAR 0x10 /*数据位为8位为0时数据位为7位*/#define LISTEN 0x08 /*自环模式(发数据同时在把发的数据接收回来)*/#define SYNC 0x04 /*同步模式为0异步模式*/#define MM 0x02 /*为1时地址位多机协议(异步) 主机模式(同步);为0时线路空闲多机协议(异步) 从机模式(同步)*/#define SWRST 0x01 /*控制位*//* UTCTL 串口发送控制寄存器*/#define CKPH 0x80 /*时钟相位控制位(只同步方式用)为1时时钟UCLK延时半个周期*/#define CKPL 0x40 /*时钟极性控制位为1时异步与UCLK相反;同步下降延有效*/#define SSEL1 0x20 /*时钟源选择位:与SSEL0组合为0,1,2,3四种方式*/#define SSEL0 0x10 /*"0"选择外部时钟,"1"选择辅助时钟,"2","3"选择系统子时钟*/#define URXSE 0x08 /*接收触发延控制位(只在异步方式下用)*/#define TXWAKE 0x04 /*多处理器通信传送控制位(只在异步方式下用)*/#define STC 0x02 /*外部引脚STE选择位为0时为4线模式为1时为3线模式*/#define TXEPT 0x01 /*发送器空标志*//* URCTL 串口接收控制寄存器同步模式下只用两位:FE和OE*/#define FE 0x80 /*帧错标志*/#define PE 0x40 /*校验错标志位*/#define OE 0x20 /*溢出标志位*/#define BRK 0x10 /*打断检测位*/#define URXEIE 0x08 /*接收出错中断允许位*/#define URXWIE 0x04 /*接收唤醒中断允许位*/#define RXWAKE 0x02 /*接收唤醒检测位*/#define RXERR 0x01 /*接收错误标志位*//************************************************************* USART 0 串口0寄存器定义************************************************************/#define U0CTL_ 0x0070 /* 串口0基本控制寄存器*/sfrb U0CTL = U0CTL_;#define U0TCTL_ 0x0071 /* 串口0发送控制寄存器*/ sfrb U0TCTL = U0TCTL_;#define U0RCTL_ 0x0072 /* 串口0接收控制寄存器*/ sfrb U0RCTL = U0RCTL_;#define U0MCTL_ 0x0073 /* 波特率调整寄存器*/sfrb U0MCTL = U0MCTL_;#define U0BR0_ 0x0074 /* 波特率选择寄存器0 */sfrb U0BR0 = U0BR0_;#define U0BR1_ 0x0075 /* 波特率选择寄存器1 */sfrb U0BR1 = U0BR1_;#define U0RXBUF_ 0x0076 /* 接收缓存寄存器*/const sfrb U0RXBUF = U0RXBUF_;#define U0TXBUF_ 0x0077 /* 发送缓存寄存器*/sfrb U0TXBUF = U0TXBUF_;/* 改变的寄存器名定义*/#define UCTL0_ 0x0070 /* UART 0 Control */sfrb UCTL0 = UCTL0_;#define UTCTL0_ 0x0071 /* UART 0 Transmit Control */ sfrb UTCTL0 = UTCTL0_;#define URCTL0_ 0x0072 /* UART 0 Receive Control */sfrb URCTL0 = URCTL0_;#define UMCTL0_ 0x0073 /* UART 0 Modulation Control */ sfrb UMCTL0 = UMCTL0_;#define UBR00_ 0x0074 /* UART 0 Baud Rate 0 */sfrb UBR00 = UBR00_;#define UBR10_ 0x0075 /* UART 0 Baud Rate 1 */sfrb UBR10 = UBR10_;#define RXBUF0_ 0x0076 /* UART 0 Receive Buffer */ const sfrb RXBUF0 = RXBUF0_;#define TXBUF0_ 0x0077 /* UART 0 Transmit Buffer */sfrb TXBUF0 = TXBUF0_;#define UCTL_0_ 0x0070 /* UART 0 Control */sfrb UCTL_0 = UCTL_0_;#define UTCTL_0_ 0x0071 /* UART 0 Transmit Control */ sfrb UTCTL_0 = UTCTL_0_;#define URCTL_0_ 0x0072 /* UART 0 Receive Control */ sfrb URCTL_0 = URCTL_0_;#define UMCTL_0_ 0x0073 /* UART 0 Modulation Control */ sfrb UMCTL_0 = UMCTL_0_;#define UBR0_0_ 0x0074 /* UART 0 Baud Rate 0 */sfrb UBR0_0 = UBR0_0_;sfrb UBR1_0 = UBR1_0_;#define RXBUF_0_ 0x0076 /* UART 0 Receive Buffer */const sfrb RXBUF_0 = RXBUF_0_;#define TXBUF_0_ 0x0077 /* UART 0 Transmit Buffer */sfrb TXBUF_0 = TXBUF_0_;/************************************************************ * USART 1 串口1寄存器定义************************************************************/#define U1CTL_ 0x0078 /* 串口1基本控制寄存器*/sfrb U1CTL = U1CTL_;#define U1TCTL_ 0x0079 /* 串口1发送控制寄存器*/sfrb U1TCTL = U1TCTL_;#define U1RCTL_ 0x007A /* 串口1接收控制寄存器*/sfrb U1RCTL = U1RCTL_;#define U1MCTL_ 0x007B /* 波特率调整控制寄存器*/sfrb U1MCTL = U1MCTL_;#define U1BR0_ 0x007C /* 波特率选择寄存器0 */sfrb U1BR0 = U1BR0_;#define U1BR1_ 0x007D /* 波特率选择寄存器1 */sfrb U1BR1 = U1BR1_;#define U1RXBUF_ 0x007E /* 接收缓存*/const sfrb U1RXBUF = U1RXBUF_;#define U1TXBUF_ 0x007F /* 发送缓存*/sfrb U1TXBUF = U1TXBUF_;/* 改变的寄存器名定义*/#define UCTL1_ 0x0078 /* UART 1 Control */sfrb UCTL1 = UCTL1_;#define UTCTL1_ 0x0079 /* UART 1 Transmit Control */sfrb UTCTL1 = UTCTL1_;#define URCTL1_ 0x007A /* UART 1 Receive Control */sfrb URCTL1 = URCTL1_;#define UMCTL1_ 0x007B /* UART 1 Modulation Control */sfrb UMCTL1 = UMCTL1_;#define UBR01_ 0x007C /* UART 1 Baud Rate 0 */sfrb UBR01 = UBR01_;#define UBR11_ 0x007D /* UART 1 Baud Rate 1 */sfrb UBR11 = UBR11_;#define RXBUF1_ 0x007E /* UART 1 Receive Buffer */const sfrb RXBUF1 = RXBUF1_;sfrb TXBUF1 = TXBUF1_;#define UCTL_1_ 0x0078 /* UART 1 Control */sfrb UCTL_1 = UCTL_1_;#define UTCTL_1_ 0x0079 /* UART 1 Transmit Control */sfrb UTCTL_1 = UTCTL_1_;#define URCTL_1_ 0x007A /* UART 1 Receive Control */sfrb URCTL_1 = URCTL_1_;#define UMCTL_1_ 0x007B /* UART 1 Modulation Control */sfrb UMCTL_1 = UMCTL_1_;#define UBR0_1_ 0x007C /* UART 1 Baud Rate 0 */sfrb UBR0_1 = UBR0_1_;#define UBR1_1_ 0x007D /* UART 1 Baud Rate 1 */sfrb UBR1_1 = UBR1_1_;#define RXBUF_1_ 0x007E /* UART 1 Receive Buffer */const sfrb RXBUF_1 = RXBUF_1_;#define TXBUF_1_ 0x007F /* UART 1 Transmit Buffer */sfrb TXBUF_1 = TXBUF_1_;/************************************************************ * Timer A 定时器A寄存器定义************************************************************/#define TAIV_ 0x012E /* Timer A 中断向量寄存器*/sfrw TAIV = TAIV_;#define TACTL_ 0x0160 /* Timer A 控制寄存器*/sfrw TACTL = TACTL_;#define TACCTL0_ 0x0162 /* Timer A 捕获/比较控制寄存器0 */sfrw TACCTL0 = TACCTL0_;#define TACCTL1_ 0x0164 /* Timer A 捕获/比较控制寄存器1 */sfrw TACCTL1 = TACCTL1_;#define TACCTL2_ 0x0166 /* Timer A 捕获/比较控制寄存器2 */sfrw TACCTL2 = TACCTL2_;#define TAR_ 0x0170 /* Timer A 16位计数器内容*/sfrw TAR = TAR_;#define TACCR0_ 0x0172 /* Timer A 捕获/比较寄存器0 */sfrw TACCR0 = TACCR0_;#define TACCR1_ 0x0174 /* Timer A 捕获/比较寄存器1 */sfrw TACCR1 = TACCR1_;#define TACCR2_ 0x0176 /* Timer A 捕获/比较寄存器2 */sfrw TACCR2 = TACCR2_;/* 改变的寄存器名定义*/#define CCTL0_ 0x0162 /* Timer A Capture/Compare Control 0 */ sfrw CCTL0 = CCTL0_;#define CCTL1_ 0x0164 /* Timer A Capture/Compare Control 1 */ sfrw CCTL1 = CCTL1_;#define CCTL2_ 0x0166 /* Timer A Capture/Compare Control 2 */ sfrw CCTL2 = CCTL2_;#define CCR0_ 0x0172 /* Timer A Capture/Compare 0 */sfrw CCR0 = CCR0_;#define CCR1_ 0x0174 /* Timer A Capture/Compare 1 */sfrw CCR1 = CCR1_;#define CCR2_ 0x0176 /* Timer A Capture/Compare 2 */sfrw CCR2 = CCR2_;/*TACTL 控制寄存器16个位寄存器定义*/#define TASSEL2 0x0400 /* 未用*/#define TASSEL1 0x0200 /* 时钟输入源控制位1 */#define TASSEL0 0x0100 /* 时钟输入源控制位0 */#define ID1 0x0080 /* 分频系数选择位1 */#define ID0 0x0040 /* 分频系数选择位0 */#define MC1 0x0020 /* 计数模式控制位1 */#define MC0 0x0010 /* 计数模式控制位0 */#define TACLR 0x0004 /* 置1位清除定时器*/#define TAIE 0x0002 /* 定时器中断允许*/#define TAIFG 0x0001 /* 定时器中断标志*/#define MC_0 00*0x10 /* 停止模式*/#define MC_1 01*0x10 /* 增计数模式*/#define MC_2 02*0x10 /* 连续计数模式*/#define MC_3 03*0x10 /* 增/减计数模式*/#define ID_0 00*0x40 /* 直通*/#define ID_1 01*0x40 /* 2分频*/#define ID_2 02*0x40 /* 4分频*/#define ID_3 03*0x40 /* 8分频*/#define TASSEL_0 00*0x100 /* 时钟源为TACLK */#define TASSEL_1 01*0x100 /* 时钟源为ACLK */#define TASSEL_2 02*0x100 /* 时钟源为SMCLK */#define TASSEL_3 03*0x100 /* 时钟源为INCLK *//* Timer A ,Timer B 可公用捕获/比较控制寄存器X */#define CM1 0x8000 /* 捕获模式选择位1 */#define CM0 0x4000 /* 捕获模式选择位0 */#define CCIS1 0x2000 /* 捕获输入信号源选择位1 */#define CCIS0 0x1000 /* 捕获输入信号源选择位0 */#define SCS 0x0800 /* 信号同步位0:异步捕获;1:同步捕获*/#define SCCI 0x0400 /* 锁存输入信号*/#define CAP 0x0100 /* 模式选择: 0:比较模式;1:捕获模式*/#define OUTMOD2 0x0080 /* 输出模式选择位2 */#define OUTMOD1 0x0040 /* 输出模式选择位1 */#define OUTMOD0 0x0020 /* 输出模式选择位0 */#define CCIE 0x0010 /* 中断允许位*/#define CCI 0x0008 /* 读出输入信号源位ccis0\1 */#define OUT 0x0004 /* 输出信号(选择输出模式0) */#define COV 0x0002 /* 捕获溢出标志*/#define CCIFG 0x0001 /* 中断标志*/#define OUTMOD_0 0*0x20 /* 输出模式*/#define OUTMOD_1 1*0x20 /* 置位模式*/#define OUTMOD_2 2*0x20 /* 翻转/复位模式*/#define OUTMOD_3 3*0x20 /* 置位/复位模式*/#define OUTMOD_4 4*0x20 /* 翻转模式*/#define OUTMOD_5 5*0x20 /* 复位模式*/#define OUTMOD_6 6*0x20 /* 翻转/置位模式*/#define OUTMOD_7 7*0x20 /* 复位/置位模式*/#define CCIS_0 0*0x1000 /* 选择CCIXA为捕获事件的输入信号源*/#define CCIS_1 1*0x1000 /* 选择CCIXB为捕获事件的输入信号源*/#define CCIS_2 2*0x1000 /* 选择GND为捕获事件的输入信号源*/#define CCIS_3 3*0x1000 /* 选择VCC为捕获事件的输入信号源*/#define CM_0 0*0x4000 /* 禁止捕获模式*/#define CM_1 1*0x4000 /* 上升延捕获模式*/#define CM_2 2*0x4000 /* 下降沿捕获模式*/#define CM_3 3*0x4000 /* 上升沿和下降沿都捕获模式*//************************************************************ * Timer B 定时器B寄存器定义************************************************************/#define TBIV_ 0x011E /* 中断向量寄存器:BIT1-BIT3有效*/sfrw TBIV = TBIV_;#define TBCTL_ 0x0180 /* 定时器B控制寄存器:全部控制都集中在这*/ sfrw TBCTL = TBCTL_;#define TBCCTL0_ 0x0182 /* 定时器B捕获/比较控制寄存器0*/sfrw TBCCTL0 = TBCCTL0_;#define TBCCTL1_ 0x0184 /* 定时器B捕获/比较控制寄存器1 */sfrw TBCCTL1 = TBCCTL1_;#define TBCCTL2_ 0x0186 /* 定时器B捕获/比较控制寄存器2 */sfrw TBCCTL2 = TBCCTL2_;#define TBCCTL3_ 0x0188 /* 定时器B捕获/比较控制寄存器3 */sfrw TBCCTL3 = TBCCTL3_;#define TBCCTL4_ 0x018A /* 定时器B捕获/比较控制寄存器4 */sfrw TBCCTL4 = TBCCTL4_;#define TBCCTL5_ 0x018C /* 定时器B捕获/比较控制寄存器5 */sfrw TBCCTL5 = TBCCTL5_;#define TBCCTL6_ 0x018E /* 定时器B捕获/比较控制寄存器6 */sfrw TBCCTL6 = TBCCTL6_;#define TBR_ 0x0190 /* 计数器*/sfrw TBR = TBR_;#define TBCCR0_ 0x0192 /* 定时器B捕获/比较寄存器0 */sfrw TBCCR0 = TBCCR0_;#define TBCCR1_ 0x0194 /* 定时器B捕获/比较寄存器1 */sfrw TBCCR1 = TBCCR1_;#define TBCCR2_ 0x0196 /* 定时器B捕获/比较寄存器2 */sfrw TBCCR2 = TBCCR2_;#define TBCCR3_ 0x0198 /* 定时器B捕获/比较寄存器3 */sfrw TBCCR3 = TBCCR3_;#define TBCCR4_ 0x019A /* 定时器B捕获/比较寄存器4 */sfrw TBCCR4 = TBCCR4_;#define TBCCR5_ 0x019C /* 定时器B捕获/比较寄存器5 */sfrw TBCCR5 = TBCCR5_;#define TBCCR6_ 0x019E /* 定时器B捕获/比较寄存器6 */sfrw TBCCR6 = TBCCR6_;/* 定时器B控制寄存器:全部控制都集中在这*/#define SHR1 0x4000 /* 装载比较锁存器控制位1 :受TBCCTLx中的CCLDx位控制*/#define SHR0 0x2000 /* 装载比较锁存器控制位0 :受TBCCTLx中的CCLDx位控制*/#define TBCLGRP1 0x4000 /* 装载比较锁存器控制位1 :受TBCCTLx中的CCLDx位控制*/ #define TBCLGRP0 0x2000 /* 装载比较锁存器控制位0 :受TBCCTLx中的CCLDx位控制*/ #define CNTL1 0x1000 /* 定时器位数长度控制位1 */#define CNTL0 0x0800 /* 定时器位数长度控制位0 */#define TBSSEL2 0x0400 /* 未用*/#define TBSSEL1 0x0200 /* 时钟输入源控制位1 */#define TBSSEL0 0x0100 /* 时钟输入源控制位0 */#define TBCLR 0x0004 /* 置1清除定时器*/#define TBIE 0x0002 /* 中断允许*/#define TBIFG 0x0001 /* 中断标志*/#define TBSSEL_0 0*0x0100 /* 时钟源为:TBCLK */#define TBSSEL_1 1*0x0100 /* 时钟源为: ACLK */#define TBSSEL_2 2*0x0100 /* 时钟源为:SMCLK */#define TBSSEL_3 3*0x0100 /* 时钟源为:INCLK */#define CNTL_0 0*0x0800 /* 16 位计数模式*/#define CNTL_1 1*0x0800 /* 12 位计数模式*/#define CNTL_2 2*0x0800 /* 10 位计数模式*/#define CNTL_3 3*0x0800 /* 8 位计数模式*/#define SHR_0 0*0x2000 /* 单独装载(初始值) */#define SHR_1 1*0x2000 /* 分三组装载: 1 - 3 groups (1-2, 3-4, 5-6) */#define SHR_2 2*0x2000 /* 分二组装载: 2 - 2 groups (1-3, 4-6)*/#define SHR_3 3*0x2000 /* 不分组装载: 3 - 1 group (all) */#define TBCLGRP_0 0*0x2000 /* 单独装载(初始值) */#define TBCLGRP_1 1*0x2000 /* 分三组装载: 1 - 3 groups (1-2, 3-4, 5-6) */#define TBCLGRP_2 2*0x2000 /* 分二组装载: 2 - 2 groups (1-3, 4-6)*/#define TBCLGRP_3 3*0x2000 /* 不分组装载: 3 - 1 group (all) *//* Additional Timer B Control Register bits are defined in Timer A */#define SLSHR1 0x0400 /* Compare latch load source 1 */#define SLSHR0 0x0200 /* Compare latch load source 0 */#define CLLD1 0x0400 /* 定义比较锁存器TBCLx的装载方式控制位1 */#define CLLD0 0x0200 /* 定义比较锁存器TBCLx的装载方式控制位0 */#define SLSHR_0 0*0x0200 /* 立即装载*/#define SLSHR_1 1*0x0200 /* TBR 计数到0时装载*/#define SLSHR_2 2*0x0200 /* 在增减模式下,计数到TBCLx或0时装载; 在连续计数模式下,计数到0时装载*/#define SLSHR_3 3*0x0200 /* 当计数到TBCL0时装载*/#define CLLD_0 0*0x0200 /* 立即装载*/#define CLLD_1 1*0x0200 /* TBR 计数到0时装载*/#define CLLD_2 2*0x0200 /* 在增减模式下,计数到TBCLx或0时装载; 在连续计数模式下,计数到0时装载*/#define CLLD_3 3*0x0200 /* 当计数到TBCL0时装载*//************************************************************* Basic Clock Module************************************************************/#define DCOCTL_ 0x0056 /* DCO 时钟频率控制寄存器:复位后的值位060h*/sfrb DCOCTL = DCOCTL_;#define BCSCTL1_ 0x0057 /* 系统时钟控制寄存器1 :复位后的值位084h*/sfrb BCSCTL1 = BCSCTL1_;#define BCSCTL2_ 0x0058 /* 系统时钟控制寄存器2 :复位后的值位000h*/sfrb BCSCTL2 = BCSCTL2_;/* DCO 时钟频率控制寄存器*/#define MOD0 0x01 /* DCO插入周期控制位0 */#define MOD1 0x02 /* DCO插入周期控制位1 */#define MOD2 0x04 /* DCO插入周期控制位2 */#define MOD3 0x08 /* DCO插入周期控制位3 */#define MOD4 0x10 /* DCO插入周期控制位4 */#define DCO0 0x20 /* 8种频率控制位0 */#define DCO1 0x40 /* 8种频率控制位1 */#define DCO2 0x80 /* 8种频率控制位2 *//* 系统时钟控制寄存器1 :复位后的值位084h*/#define RSEL0 0x01 /* 选择内部电阻控制位0 */#define RSEL1 0x02 /* 选择内部电阻控制位1 */#define RSEL2 0x04 /* 选择内部电阻控制位2 */#define XT5V 0x08 /* 必须为0*/#define DIVA0 0x10 /* ACLK分频系数控制位0*/#define DIVA1 0x20 /* ACLK分频系数控制位1 */#define XTS 0x40 /* LFXT1工作模式控制位0:低频模式. / 1: 高频模式. */ #define XT2OFF 0x80 /* XT2CLK 使能控制位0:开启; 1:关闭*/#define DIVA_0 0x00 /* ACLK分频系数为: 1 */#define DIVA_1 0x10 /* ACLK分频系数为: 2 */#define DIVA_2 0x20 /* ACLK分频系数为: 4 */#define DIVA_3 0x30 /* ACLK分频系数为: 8 *//* 系统时钟控制寄存器2 :复位后的值位000h*/#define DCOR 0x01 /* 内外电阻选择控制位*/#define DIVS0 0x02 /* SMCLK分频控制位0*/#define DIVS1 0x04 /* SMCLK分频控制位1 */#define SELS 0x08 /* SMCLK 时钟源选择位t 0COCLK / 1:XT2CLK/LFXTCLK */ #define DIVM0 0x10 /* MCLK分频控制位0 */#define DIVM1 0x20 /* MCLK分频控制位1 */#define SELM0 0x40 /* MCLK 时钟输入源选择位0 */#define SELM1 0x80 /* MCLK 时钟输入源选择位1 */#define DIVS_0 0x00 /* SMCLK 分频系数为: 1 */#define DIVS_1 0x02 /* SMCLK 分频系数为: 2 */#define DIVS_2 0x04 /* SMCLK 分频系数为: 4 */#define DIVS_3 0x06 /* SMCLK 分频系数为: 8 */#define DIVM_0 0x00 /* MCLK 分频系数为: 1 */#define DIVM_1 0x10 /* MCLK 分频系数为: 2 */#define DIVM_2 0x20 /* MCLK 分频系数为: 4 */#define DIVM_3 0x30 /* MCLK 分频系数为: 8 */#define SELM_0 0x00 /* MCLK 时钟输入源: DCOCLK */#define SELM_1 0x40 /* MCLK 时钟输入源: DCOCLK */#define SELM_2 0x80 /* MCLK 时钟输入源: XT2CLK/LFXTCLK */#define SELM_3 0xC0 /* MCLK 时钟输入源: LFXTCLK *//************************************************************* * Flash Memory FLASH操作寄存器定义*************************************************************/#define FCTL1_ 0x0128 /* FLASH控制寄存器1:控制编程、擦除*/sfrw FCTL1 = FCTL1_;#define FCTL2_ 0x012A /* FLASH 控制寄存器2 :控制时钟分频*/sfrw FCTL2 = FCTL2_;#define FCTL3_ 0x012C /* FLASH 控制寄存器3:状态标志*/sfrw FCTL3 = FCTL3_;#define FRKEY 0x9600 /* 读FLASH 密码*/#define FWKEY 0xA500 /* 写FLASH 密码*/#define FXKEY 0x3300 /* for use with XOR instruction *//* FLASH控制寄存器1:控制编程、擦除*/#define ERASE 0x0002 /* 擦除段使能*/#define MERAS 0x0004 /* 主存擦除使能*/#define WRT 0x0040 /* 编程使能*/#define BLKWRT 0x0080 /* 段编程使能*//* FLASH 控制寄存器2 :控制时钟分频*/#define FN_0 0x0000 /*直通*/#define FN_1 0x0001 /*2分频*/#define FN_2 0x0002 /*3分频*/#define FN_3 0x0003 /*4分频*/#define FN_4 0x0004 /*5分频*/#define FN_5 0x0005 /*6分频*/#define FN_6 0x0006 /*7分频*/#define FN_7 0x0007 /*8分频*/#define FN_8 0x0008 /*9分频*/#define FN_9 0x0009 /*10分频*/#define FN_10 0x000A /*11分频*/#define FN_11 0x000B /*12分频*/#define FN_12 0x000C /*13分频*/#define FN_13 0x000D /*14分频*/#define FN_14 0x000E /*15分频*/#define FN_15 0x000F /*16分频*/#define FN_16 0x0010 /*17分频*/#define FN_17 0x0011 /*18分频*/#define FN_18 0x0012 /*19分频*/#define FN_19 0x0013 /*20分频*/#define FN_20 0x0014 /*21分频*/#define FN_21 0x0015 /*22分频*/#define FN_22 0x0016 /*23分频*/#define FN_23 0x0017 /*24分频*/#define FN_24 0x0018 /*25分频*/#define FN_25 0x0019 /*26分频*/#define FN_26 0x001A /*27分频*/#define FN_27 0x001B /*28分频*/#define FN_28 0x001C /*29分频*/#define FN_29 0x001D /*30分频*/#define FN_30 0x001E /*31分频*/#define FN_31 0x001F /*32分频*/#define FN_32 0x0020 /*33分频*/#define FN_33 0x0021 /*34分频*/#define FN_34 0x0022 /*35分频*/#define FN_35 0x0023 /*36分频*/#define FN_36 0x0024 /*37分频*/#define FN_37 0x0025 /*38分频*/#define FN_38 0x0026 /*39分频*/#define FN_39 0x0027 /*40分频*/#define FN_40 0x0028 /*41分频*/#define FN_41 0x0029 /*42分频*/#define FN_42 0x002A /*43分频*/#define FN_43 0x002B /*44分频*/#define FN_44 0x002C /*45分频*/#define FN_45 0x002D /*46分频*/#define FN_46 0x002E /*47分频*/#define FN_47 0x002F /*48分频*/#define FN_48 0x0030 /*49分频*/#define FN_49 0x0031 /*50分频*/#define FN_50 0x0032 /*51分频*/#define FN_51 0x0033 /*52分频*/#define FN_52 0x0034 /*53分频*/#define FN_53 0x0035 /*54分频*/#define FN_54 0x0036 /*55分频*/#define FN_55 0x0037 /*56分频*/#define FN_56 0x0038 /*57分频*/#define FN_57 0x0039 /*58分频*/#define FN_58 0x003A /*59分频*/#define FN_59 0x003B /*60分频*/#define FN_60 0x003C /*61分频*/#define FN_61 0x003D /*62分频*/#define FN_62 0x003E /*63分频*/#define FN_63 0x003F /*64分频*/#define FSSEL_0 0x0000 /* Flash时钟选择: ACLK */ #define FSSEL_1 0x0040 /* Flash时钟选择: MCLK */ #define FSSEL_2 0x0080 /* Flash时钟选择: SMCLK */ #define FSSEL_3 0x00C0 /* Flash时钟选择: SMCLK */ /* FLASH 控制寄存器3:状态标志*/#define BUSY 0x0001 /* Flash忙标志*/#define KEYV 0x0002 /* Flash安全键值出错标志*/#define ACCVIFG 0x0004 /* Flash非法访问中断标志*/#define WAIT 0x0008 /* 等待指示信号位*/#define LOCK 0x0010 /* 锁定位*/#define EMEX 0x0020 /* 紧急退出位*//************************************************************ * Comparator A 比较器A寄存器定义************************************************************/#define CACTL1_ 0x0059 /* 比较器A控制寄存器1 */sfrb CACTL1 = CACTL1_;#define CACTL2_ 0x005A /* 比较器A控制寄存器2 */sfrb CACTL2 = CACTL2_;#define CAPD_ 0x005B /*比较器A端口禁止寄存器*/sfrb CAPD = CAPD_;/* 比较器A控制寄存器1 */#define CAIFG 0x01 /*比较器A中断标志*/#define CAIE 0x02 /* 比较器A中断使能*/#define CAIES 0x04 /* 比较器A中断边沿触发选择0:上升延1:下降延*/ #define CAON 0x08 /* 比较器电源开关*/#define CAREF0 0x10 /* 选择参考源位0 */#define CAREF1 0x20 /* 选择参考源位1 */#define CARSEL 0x40 /* 选择内部参考源加到比较器的正端或负端*/#define CAEX 0x80 /* 交换比较器的输入端*/#define CAREF_0 0x00 /* 选择参考源0 : Off 使用外部参考源*/#define CAREF_1 0x10 /* 选择参考源1 : 0.25*Vcc为参考源*/#define CAREF_2 0x20 /* 选择参考源2 : 0.5*Vcc为参考源*/#define CAREF_3 0x30 /* 选择参考源3 : Vt*//* 比较器A控制寄存器2 */#define CAOUT 0x01 /* 比较器输出*/#define CAF 0x02 /* 选择比较器是否经过RC低通滤波器*/#define P2CA0 0x04 /* 外部引脚信号连接到比较器A的CA0 */#define P2CA1 0x08 /* 外部引脚信号连接到比较器A的CA1 */#define CACTL24 0x10#define CACTL25 0x20#define CACTL26 0x40#define CACTL27 0x80#define CAPD0 0x01 /* Comp. A Disable Input Buffer of Port Register .0 */#define CAPD1 0x02 /* Comp. A Disable Input Buffer of Port Register .1 */#define CAPD2 0x04 /* Comp. A Disable Input Buffer of Port Register .2 */#define CAPD3 0x08 /* Comp. A Disable Input Buffer of Port Register .3 */#define CAPD4 0x10 /* Comp. A Disable Input Buffer of Port Register .4 */#define CAPD5 0x20 /* Comp. A Disable Input Buffer of Port Register .5 */#define CAPD6 0x40 /* Comp. A Disable Input Buffer of Port Register .6 */#define CAPD7 0x80 /* Comp. A Disable Input Buffer of Port Register .7 *//************************************************************* ADC12 A/D采样寄存器定义************************************************************//*ADC12转换控制类寄存器*/#define ADC12CTL0_ 0x0;' /* ADC12 Control 0 */sfrw ADC12CTL0 = ADC12CTL0_;#define ADC12CTL1_ 0x01A2 /* ADC12 Control 1 */sfrw ADC12CTL1 = ADC12CTL1_;/*ADC12中断控制类寄存器*/#define ADC12IFG_ 0x01A4 /* ADC12 Interrupt Flag */sfrw ADC12IFG = ADC12IFG_;#define ADC12IE_ 0x01A6 /* ADC12 Interrupt Enable */sfrw ADC12IE = ADC12IE_;#define ADC12IV_ 0x01A8 /* ADC12 Interrupt Vector Word */sfrw ADC12IV = ADC12IV_;/*ADC12存贮器类寄存器*/#define ADC12MEM_ 0x0140 /* ADC12 Conversion Memory */#ifndef __IAR_SYSTEMS_ICC#define ADC12MEM ADC12MEM_ /* ADC12 Conversion Memory (for assembler) */ #else#define ADC12MEM ((int*) ADC12MEM_) /* ADC12 Conversion Memory (for C) */ #endif#define ADC12MEM0_ ADC12MEM_ /* ADC12 Conversion Memory 0 */sfrw ADC12MEM0 = ADC12MEM0_;#define ADC12MEM1_ 0x0142 /* ADC12 Conversion Memory 1 */sfrw ADC12MEM1 = ADC12MEM1_;#define ADC12MEM2_ 0x0144 /* ADC12 Conversion Memory 2 */sfrw ADC12MEM2 = ADC12MEM2_;#define ADC12MEM3_ 0x0146 /* ADC12 Conversion Memory 3 */sfrw ADC12MEM3 = ADC12MEM3_;#define ADC12MEM4_ 0x0148 /* ADC12 Conversion Memory 4 */sfrw ADC12MEM4 = ADC12MEM4_;#define ADC12MEM5_ 0x014A /* ADC12 Conversion Memory 5 */sfrw ADC12MEM5 = ADC12MEM5_;#define ADC12MEM6_ 0x014C /* ADC12 Conversion Memory 6 */sfrw ADC12MEM6 = ADC12MEM6_;#define ADC12MEM7_ 0x014E /* ADC12 Conversion Memory 7 */。
IARMSP430 使用指引
IARMSP430使用指引本指引是为配合推出的MSP430学习系统而写的,当然您也可以把它当成您使用IAR FOR MSP430(以下简写为EW430)的一个参考文档!本指引会按照建立一个项目的步骤来撰写,并且会插入附图以加快大家对IAR FOR MSP430的学习使用。
一、安装和运行EW430:EW430是IAR SYSTEMS SOFTWARE INC的产品,该公司的网站是,您可以到这个公司的网站下载到试用版的软件,它和正式版不同的是试用版可以免费使用一段时间而没有功能上的限制,超过这段试用期,如果您打算继续使用,那么您得购买此软件的授权。
下载了试用版后,点击安装包的SETUP.EXE,选择安装路径和安装方式或采用默认的安装,安装包会在目录下产生IAR的目录,并在”开始”菜单产生快捷方式,这一个工程对于经常使用软件的用户来说是非常简单的,因此不再AOSHU。
系统重启后,在系统栏会出现图1.1中的图标。
在这个图标上点击鼠标左键可以很方便的开启IAR FOR MSP和其它IAR系统软件(图1.2)。
图1.1图1.2运行后的界面如图1.3所示(以1.26A版为例)图1.3二、建立工程文件和添加文件我们习惯了在WINDOWS下的各种编程软件中以一个工程(PROJECT)来管理我们正在作的工作,EW430也不例外,因此第一步要作的就是新建一个工程或用其它方法来建立一个工程。
点击”File”菜单下的”New”菜单,出现图2.1中的框,选择”Project”后点击”确定”按键。
图2.1接下来会出现对话框,您得指定你的工程文件保存在哪个目录下图2.2我这此建立的是一个控制液晶模块1602A的工程,取名为lcm1602.prj。
然后点击”Create”按键生成这个项目。
图2.3图中的”Targets”一项中表示目前的这个工程的是用于调试的。
好了,工程文件已经建立完成了,现在可以把要用到的文件添加到工程中去。
要提醒您的是经常使用”File”菜单下的”Save all”保存您到目前完成的工作。
MSP430_intrinsic头文件
/**************************************************** Intrinsic functions for the IAR Embedded Workbench for MSP430. ** Copyright ?2002-2008 IAR Systems AB.** $Revision: 7932 $***************************************************/#ifndef __INTRINSICS_H#define __INTRINSICS_H#ifndef _SYSTEM_BUILD#pragma system_include#endif#pragma language=save#pragma language=extended/** Interrupt state, used by "__get_interrupt_state" and* "__set_interrupt_state".*/typedef unsigned short __istate_t;/* Deprecated. */typedef __istate_t istate_t;#ifdef __cplusplusextern "C"{#endif__intrinsic void __no_operation(void);__intrinsic void __enable_interrupt(void);__intrinsic void __disable_interrupt(void);__intrinsic __istate_t __get_interrupt_state(void);__intrinsic void __set_interrupt_state(__istate_t);__intrinsic void __op_code(unsigned short);__intrinsic unsigned short __swap_bytes(unsigned short);__intrinsic long __code_distance(void);__intrinsic void __bic_SR_register(unsigned short);__intrinsic void __bis_SR_register(unsigned short);__intrinsic unsigned short __get_SR_register(void);__intrinsic void __bic_SR_register_on_exit(unsigned short);__intrinsic void __bis_SR_register_on_exit(unsigned short);__intrinsic unsigned short __get_SR_register_on_exit(void);__intrinsic unsigned short __bcd_add_short(unsigned short,unsigned short);__intrinsic unsigned long __bcd_add_long (unsigned long,unsigned long);__intrinsic unsigned long long __bcd_add_long_long(unsigned long long,unsigned long long);/** Support for efficient switch:es. E.g. switch(__even_in_range(x, 10))** Note that the value must be even and in the range from 0 to* __bound, inclusive. No code will be generated that checks this.** This is typically used inside interrupt dispatch functions, to* switch on special processor registers like TAIV.*/__intrinsic unsigned short __even_in_range(unsigned short __value,unsigned short __bound);/* Insert a delay with a specific number of cycles. */__intrinsic void __delay_cycles(unsigned long __cycles);/** The following R4/R5 intrinsic functions are only available when* the corresponding register is locked.*/__intrinsic unsigned short __get_R4_register(void);__intrinsic void __set_R4_register(unsigned short);__intrinsic unsigned short __get_R5_register(void);__intrinsic void __set_R5_register(unsigned short);__intrinsic unsigned short __get_SP_register(void);__intrinsic void __set_SP_register(unsigned short);/** If the application provides this function, it is called by the* startup code before variables are initialized. If the function* returns 0 the data segments will not be initialized.*/__intrinsic int __low_level_init(void);/* ----------------------------------------* MSP430X-specific intrinsic functions.*//** Intrinsic functions to allow access to the full 1 Mbyte memory* range in small data model.** The functions are available in medium and large data model* aswell, however it is recommended to access memory using normal * __data20 variables and/or pointers.** Please note that interrupts must be disabled when the following* intrinsics are used.*/__intrinsic void __data20_write_char (unsigned long __addr,unsigned char __value);__intrinsic void __data20_write_short(unsigned long __addr,unsigned short __value);__intrinsic void __data20_write_long (unsigned long __addr,unsigned long __value);__intrinsic unsigned char __data20_read_char (unsigned long __addr); __intrinsic unsigned short __data20_read_short(unsigned long __addr);__intrinsic unsigned long __data20_read_long (unsigned long __addr);/** The following two functions can be used to access 20-bit SFRs in the* lower 64kB. They are only available in extended mode (--core=430X).*/__intrinsic void __data16_write_addr (unsigned short __addr,unsigned long __value);__intrinsic unsigned long __data16_read_addr (unsigned short __addr);#ifdef __cplusplus}#endif/** Alias for locations used for global register variables. For example,* "__no_init __regvar int x @ __R4;".*/#define __R4 4#define __R5 5/** Control bits in the processor status register, SR.*/#define __SR_GIE (1<<3)#define __SR_CPU_OFF (1<<4)#define __SR_OSC_OFF (1<<5)#define __SR_SCG0 (1<<6)#define __SR_SCG1 (1<<7)/** Functions for controlling the processor operation modes.*/#define __low_power_mode_0() (__bis_SR_register( __SR_GIE \| __SR_CPU_OFF)) #define __low_power_mode_1() (__bis_SR_register( __SR_GIE \| __SR_CPU_OFF \| __SR_SCG0))#define __low_power_mode_2() (__bis_SR_register( __SR_GIE \| __SR_CPU_OFF \| __SR_SCG1))#define __low_power_mode_3() \(__bis_SR_register( __SR_GIE \| __SR_CPU_OFF \| __SR_SCG0 \| __SR_SCG1))#define __low_power_mode_4() \(__bis_SR_register( __SR_GIE \| __SR_CPU_OFF \| __SR_SCG0 \| __SR_SCG1 \| __SR_OSC_OFF))#define __low_power_mode_off_on_exit() \(__bic_SR_register_on_exit( __SR_CPU_OFF \| __SR_SCG0 \| __SR_SCG1 \| __SR_OSC_OFF))#pragma language=restore#endif /* __INTRINSICS_H */。
重要MSP430F149ADC12头文件摘要
MPS430头文件摘要及注释一.ADC121..定义采样保持时间(ADC12CTL0)#define SHT0_0 (0*0x100u) //定义ADC12MEM0——ADC12MEM7采样#define SHT0_1 (1*0x100u) //保持时间为ADCCLK的多少个周期 eg:#define SHT0_2 (2*0x100u) //SHT0_0 代表采样保持时间为4个ADCCLK#define SHT0_3 (3*0x100u) //周期同理 SHT0_1为8个周期#define SHT0_4 (4*0x100u)#define SHT0_5 (5*0x100u)#define SHT0_6 (6*0x100u)#define SHT0_7 (7*0x100u)#define SHT0_8 (8*0x100u)#define SHT0_9 (9*0x100u)#define SHT0_10 (10*0x100u)#define SHT0_11 (11*0x100u)#define SHT0_12 (12*0x100u)#define SHT0_13 (13*0x100u)#define SHT0_14 (14*0x100u)#define SHT0_15 (15*0x100u)#define SHT1_0 (0*0x1000u) //定义ADC12MEM8——ADC12MEM15采样#define SHT1_1 (1*0x1000u) //保持时间为ADCCLK的多少个周期#define SHT1_2 (2*0x1000u) //使用方法同SHT0_x#define SHT1_3 (3*0x1000u)#define SHT1_4 (4*0x1000u)#define SHT1_5 (5*0x1000u)#define SHT1_6 (6*0x1000u)#define SHT1_7 (7*0x1000u)#define SHT1_8 (8*0x1000u)#define SHT1_9 (9*0x1000u)#define SHT1_10 (10*0x1000u)#define SHT1_11 (11*0x1000u)#define SHT1_12 (12*0x1000u)#define SHT1_13 (13*0x1000u)#define SHT1_14 (14*0x1000u)#define SHT1_15 (15*0x1000u)2.转换模式选择(ADC12CTL1)#define CONSEQ_0 (0*2u) //单通道单次转换#define CONSEQ_1 (1*2u) //多通道单次转换#define CONSEQ_2 (2*2u) //单通道多次转换#define CONSEQ_3 (3*2u) //多通道多次转换3..ADC12内核时钟源选择(ADC12CTL1)#define ADC12SSEL_0 (0*8u) //ADC内部时钟源 ADC12OSC #define ADC12SSEL_1 (1*8u) //ACLK#define ADC12SSEL_2 (2*8u) //MCLK#define ADC12SSEL_3 (3*8u) //SMCLK4.ADC时钟分频选择(ADC12CTL1)//分频数=三位二进制数加#define ADC12DIV_0 (0*0x20u) //1分频即不分频#define ADC12DIV_1 (1*0x20u) //2分频#define ADC12DIV_2 (2*0x20u)#define ADC12DIV_3 (3*0x20u)#define ADC12DIV_4 (4*0x20u)#define ADC12DIV_5 (5*0x20u)#define ADC12DIV_6 (6*0x20u)#define ADC12DIV_7 (7*0x20u) //8分频5..采样触发输入源选择(ADC12CTL1)#define SHS_0 (0*0x400u) //ADC12SC 位#define SHS_1 (1*0x400u) //TimerA_OUT1#define SHS_2 (2*0x400u) //TImerB_OUT0#define SHS_3 (3*0x400u) //TimerB_OUT16.转换结果数据存储寄存器选择(ADC12CTL1)#define CSTARTADD_0 (0*0x1000u) //结果存在ADC12MEM0 #define CSTARTADD_1 (1*0x1000u)#define CSTARTADD_2 (2*0x1000u)#define CSTARTADD_3 (3*0x1000u)#define CSTARTADD_4 (4*0x1000u)#define CSTARTADD_5 (5*0x1000u)#define CSTARTADD_6 (6*0x1000u)#define CSTARTADD_7 (7*0x1000u)#define CSTARTADD_8 (8*0x1000u)#define CSTARTADD_9 (9*0x1000u)#define CSTARTADD_10 (10*0x1000u)#define CSTARTADD_11 (11*0x1000u)#define CSTARTADD_12 (12*0x1000u)#define CSTARTADD_13 (13*0x1000u)#define CSTARTADD_14 (14*0x1000u)#define CSTARTADD_15 (15*0x1000u)注:在单通道单次转换情况下,转换结果存储寄存器的选择与ADC转换通道选择并没有必然联系,即从不同转换通道进入的数据经转换后,其结果在不引起错误的前提下,可存入任一个转换结果存储寄存器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、#define BIT0 (0×0001) //(0×0001)不是地址,而是一个16进制数值。
例1、P3DIR |= BIT3;实际上也可以写成P3DIR |= 0×0008;
意思是将P3口的默认上电值0×0000和0×0008相与,设置P3口的第三位(即P3.3)管脚作输出使用。
例2、WDTCTL = WDTPW + WDTHOLD;实际上就是WDTCTL=0×5A80;
你可以在头文件中查到#define WDTPW (0×5A00)和#define WDTHOLD (0×0080)。
WDTCTL是看门狗的控
制寄存器,在msp430的User’Guide中有说明:当它的值为0×5A80时停止看门狗定时。
那为什么我们不直接写成WDTCTL=0×5A80;呢?这样的话程序的可读性会很差。
0×5A80只是一个数值,当你下次再看你写的程序,或者别人读你的程序时,就不明白WDTCTL=0×5A80;的
意思了。
如果写成WDTCTL = WDTPW + WDTHOLD;就好理解多了:
WDTPW(Watchdog timer password,看门狗的密码,WDTCTL的高8位):只有WDTCTL的高8位为
0×5A时才能对WDTCTL寄存器进行写操作。
WDTHOLD(Watchdog timer hold,WDTCTL的第7位):当WDTCTL的第7位为1时,停止看门狗计时。
这样我们通过PW,HOLD就可以轻松的知道WDTCTL = WDTPW + WDTHOLD;是做什么的了。
可以看出
msp430的头文件是很人性化的。
2、当然也有表示地址的,例如,头文件中有以下部分:
#ifdef __IAR_SYSTEMS_ASM__
#define DEFC(name, address) sfrb name = address
#define DEFW(name, address) sfrw name = address;
///运用了可变参数宏的宏定义格式:#define 宏符号名(参数表) 宏体;;宏体中就是写出参数表中各个
//参数之间的关系。
#endif
……
……
#define P6OUT_ (0×0035)
DEFC( P6OUT , P6OUT_) //这里就是用了以上的可变参数宏。
DEFC( P6OUT , P6OUT_) 就表
//示:sfrb P6OUT = P6OUT_
这里的0×0035就是指P6OUT这个寄存器的地址了。