锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

电赛笔记【msp430简介——基于msp430f5529】

时间:2022-10-18 03:30:00 精密型高传输速率usb电连接器连接器amp端子3176b1加速计传感器电阻1333

MSP430

该MCU由德州仪器制成TI16位低功耗单片机

主要分为以下型号:

  • 专注于低功耗1xx配备1的通用型KB-60KB FLASH、512B-10KB RAM,工作时间耗电仅2000uA/MIPS,RAM保持模式耗电0.1uA,RTC模式耗电0.7uA;可在6us快速唤醒。10/12位斜率SAR ADC,集成模拟比较器,DMA、硬件乘法器,BOR、SVS、12位DAC
  • 能耗比高的F2xx性能16的通用型MIPS@3.3V,配备1-120KB FLASH,8-128KB RAM,工作耗电220uA,10/12位斜率SAR ADC,集成16位Σ-ΔADC,基本上等于1xx的升级版
  • 性价比高的G2xx经济型,性能16MIPS@3.3V,对标友商stm32l,主要模拟外设和低功耗
  • 面向计量和智能电网AFE2xx特殊类型:性能略低于上述两个xx系列,但是集成了1-3个独立的24位Σ-ΔADC,16位定时器,16位硬件乘法器USART控制器,看门狗和GPIO
  • 老型号3停产xx
  • 面向低功耗多媒体4xx控制型,8-16MIPS处理性能,配备LCD控制器FLL、SVS,功耗及1xx相近,4-120KB FLASH、8-256KB RAM,引脚最多可达800Pin,10/12位斜率SAR、16位Σ-ΔADC,也集成了12位ADC、DMA、硬件乘法器,运放,USCI模块等
  • 超高能耗比5xx超低功耗型,能达到25MIPS@3.3V,工作模式功耗165uA/MIPS,RTC模式2.5uA,RAM保持模式可达1uA,待机唤醒时间很短,小于5ms,配备256KB FLASH、18KB RAM,额外集成了USB、模拟比较器
  • 6.高性能、低功耗xx25系列旗舰型MIPS@3.3V,创新的电源管理模块电源管理模块和USB配备控制器LCD控制器,有256KB FLASH、18KB RAM,74Pin引脚,功耗和5xx同一系列还集成了额外的电压管理模块
  • 基于FRAM技术的FRxx与F系列的主要区别在于使用了该系列FRAM存储技术可以更快地实现FLASH访问速度并在所有功率模式下保持零功率状态。即使发生功率损失,也可以保证写入操作,写入寿命可以达到100M不再需要周期EEPROM
  • 低电压C、L系列,两个谢列都可以在0.9-1.65V4.在电压范围内工作MIPS的性能
  • 集成射频基带CC无线系列,低于1GHz工作电压为1的片上射频收发器.8-3.3V,处理性能20MIPS
  • 特殊系列:面对车辆规则应用、电容触摸、超声波测量DSP等

综合来看MSP430具有以下特点:

  1. 超低功耗

    使用1.8-3.6V低压供电,RAM数据保持模式下的功耗仅为0.1μA/MIPS,在活动模式下,功耗仅为250μA/MIPS,IO输入端口泄漏电流仅为50mA,相比之下,只有stm8和stm32l0系列能达到同级低功耗水平。普通的8051远远落后于

  2. 能效比高,算法加速

    MSP430基于RISC采用一般架构DSP只有16位多功能硬件乘法器,硬件乘-加功能,DMA可以高效实现等架构FFT、DFT、FIR数字信号处理算法

  3. 模拟外设技术高

    MSP各种模拟外设集成在430件内,包括液晶驱动器和ADC、DAC等等,具体外设由型号决定

  4. 外部寄存器直接按位寻址

    外设寄存器可直接赋值,按位操作

msp430系列采用冯诺依曼架构,构建MAB(存储地址总线),MDB(存储数据总线)两个总线协议,其中RAM、FLASH共享相同的地址空间,程序下载到FLASH,设备复位后自动读取并执行程序说明,存储局部变量RAM,BSS存储段变量FLASH,FLASH掉电不丢失

设备内部时钟至少有3套时钟源:

  1. LFXT1CLK:低频时钟,32.768kHz
  2. XT2CLK:高频时钟,8MHz
  3. DCOCLK:电影中的数字控制RC振荡器通常用作系统和外设时钟信号,其稳定性是由FLL与硬件控制

设备可单独选择三套时钟源,时钟通过电影总线提供给设备;有些型号也有更多类型的时钟源

DMA可直接接管总线,提高传输效率AMBA总线仲裁,MAB、MDB总线仅采用主控设备-设备方式)

CPU采用双总线位宽的灵活处理方法,分为16位寻址的CPU20位寻址的CPUX。CPU采用RISC架构,配备27条指令和7种统一的搜索模式,64个搜索空间KB;CPUX寻址空间为1MB,采用面向控制的结构和指令系统,集计算分支、表处理等特点于一体,可在不分页的情况下处理1MB属于地址范围RISC正交指令集(正交:绝大多数指令集的格式和长度相同,可替换所有寄存器的搜索地址;指令的操作代码、搜索方法和操作数字寄存器字段的值相互独立)MTM(内存到内存)传输,不需要通过中间寄存器,共16位CPU实现了兼容

电赛中最常用的是==MSP430F5529==,下面均以F5529为例说明

外围电路设计

供电

MCU部分模拟外设和FLASH、RAM电源要求高,但是MCU数字部分对电源的要求较低,因此采用双电源-模拟/数字的方式MCU供电。磁珠跨接3.3V同时需要使用10个杂波和地除杂波uF、100nF电容并联滤波,10uF用于过滤低频杂波,1000nF则用于旁路

复位

RST引脚低电平有效,与一般单片机的复位电路相同

晶振

为保证电源稳定,需要使用两个晶振接入,XT1接低频32.768kHzXT2接高频晶振,一般为4MHz,由于内部电容不足以振动,需要单独配备20-30pF匹配电容一般使用22pF电容

USB

f5529具有USB4芯电缆可用于控制器:5V、D 、D-、GND,并可以兼容USB OTG的ID线。

编译烧录

MSP430支持JTAG和SBW(Spy-Bi-Wire,TI指定的两线调试接口称为信号SBWTCK和SBWTDIO)

同时也支持BSL(BootStrap Loader),或者说BootLoader可通过加载程序烧录USB、UART等待单片机ISP烧录,在PUR引脚和USB D 之间跨接1.4k电阻,下连1M电阻到到达地面时,通过增加限流电阻一般为100Ω)连接到微动开关VCC即可实现USB的BSL烧录

MSP430的开发环境是TI基于eclipse开发的Code Composer Studio,简称CCS,在其中使用专用的MSP430 Compile与LinkerC程序编译链接即可实现

关键字和内联函数

同时CCS支持一些扩展关键词,列出如下:

  • __asm用于C语言内嵌汇编keil一样

  • __interrupt在函数之前,指示中断函数,通常与#pragma指令共用

    #pragma vector=UART0RX_VECTOR __interrupt void UART_ISR(void) { 
              } 

    上一个例子表示串口0接收中断,#pragma该指令将中断向量表中的地址位重定向

  • __monitor在函数之前,当执行到函数时,它会自动关闭中断,类似__atom指令

  • li>

    __no_init放在全局变量钱让程序启动时不被变量赋初值

  • __raw关闭中断服务函数的恢复现场能力,这会导致中断服务函数无法返回

  • __regvar声明变量为寄存器变量,注意不能使用指针指向寄存器变量,并且必须搭配使用__no_init禁止初始化

  • sfrb用于声明单字节IO数据类型对象,和51一样用于定义寄存器地址

除了关键字外,CCS还包含了许多内联函数,常见的几个摘录如下

__no_operation();//空指令,相当于NOP
__enable_interrupt();//打开全局中断
__disable_interrupt();//关闭全局中断
__delay_cycles(unsigned long __cycles);//延时__cycles个主时钟(MCLK)周期
__set_SP_register(unsigned short);//为堆栈指针寄存器SP赋值

预定义寄存器

CCS中还预置了一些单片机常用的寄存器和配置,如下所示

  1. 端口定义,其中x表示端口号

    PxIN:端口输入寄存器

    PxOUT:端口输出寄存器

    PxDIR:端口方向控制寄存器

    PxSEL:端口复用寄存器

    注意:MSP430不支持位操作,一般通过屏蔽位的方法实现位操作,这是它和51开发方面最大的不同,如下所示

    #define BIT0 00000001b
    #define BIT1 00000010b
    #define BIT2 00000100b
    #define BIT3 00001000b
    #define BIT4 00010000b
    #define BIT5 00100000b
    #define BIT6 01000000b
    #define BIT7 10000000b
    
    P1OUT |= BIT0;
    //这样可以实现P1.0输出
    
    P1OUT |= BIT4;
    //这样可以实现P1.0和P1.3同时输出
    
    P1OUT &= ~BIT1;
    //这样可以取消P1.0的输出
    
  2. 低功耗模式的进入和退出

    CCS预定义了一些宏指令用来实现低功耗模式

    LPM3;//进入低功耗模式
    LPM3_EXIT;//退出低功耗模式
    

    其中数字可以写0-4,分别对应四种低功耗模式

  3. 外设寄存器

    各种片上外设的寄存器都被定义为了宏,可以通过|=&=~的方式进行按位控制

  4. 部分常用代码

    _dint(); //等效于__disable_interrupt
    _EINT(); //等效于__enable_interrupt
    _NOP(); //空指令
    _OPC(x); //在指令流中插入一个常熟,对与参数对应的任何指令进行编码
    _SWAP_BYTES(x); //将无符号16位整数的高8位和低8位交换
    monitor //关键字__monitor的宏定义
    no_init //关键字__no_init的宏定义
    

综上所述,MSP430的开发和8051的开发非常类似,并没有stm32的库封装,而是直接操作寄存器。这不仅仅是由于MSP430的性能较低,也是由于这样的编程方式写出的代码更加简洁、指令量更少,能突出体现MSP430低功耗的优势

片上外设开发

MSP430的片上外设寄存器具体配置和51单片机的很像,但是有一些功能更加复杂,和stm32的寄存器接近,同时也提供了简化操作的库函数

GPIO

f5529一共有80个引脚,和stm32的gpio结构类似,并且也具有复用功能。除此之外某些引脚具备基本的电源功能,分别能够为MCU的片上数字电路和模拟电路供电,一般情况下可以共用一个电源,但在某些高精度测量场合需要双电源隔离供电。msp430还具有一个USB电源,可以直接输出5V供电,经过片上LDO后能在端口VBUS处输出稳定的3.3V电压供单片机和外设使用,最大驱动电流60mA

其中P1、P2端口IO都具有外部中断能力,分别对应P1IV中断向量和P2IV中断向量。端口可单独配置强驱动和弱驱动模式,强驱动模式下全片最大输出电流100mA,单端口最大电流15mA;弱驱动模式下全片最大输出电流48mA,单端口最大电流6mA

寄存器操作可以通过上面介绍过的屏蔽位法,也可以通过分别操作寄存器高8位和低8位的方法实现

//使用三种方法将P1.1和P2.2配置为输出功能
P1DIR |= 0x02; //0x02 == 00000010b
P2DIR |= 0x04; //0x04 == 00000100b

PADIR_L |= 0x02; //DIR寄存器低8位,代表P1
PADIR_H |= 0x04; //DIR寄存器高8位,代表P2

PADIR |= 0x0402; //直接操作DIR寄存器,将其视作uint16_t
  1. 端口配置

    如下配置端口为输入状态并配置内部上拉

    P1DIR &= ~BIT1; //BIT1 == 0x00000010b,设置P1.1为输入模式
    P1REN |= BIT1; //使能上下拉电阻
    P1OUT |= BIT1; //P1.1配置上拉电阻
    

    通过配置PxDIR.n |= 1可以将相应的IO口配置为输出状态,在输出状态下,PxREN、PxIN无效。

    P1OUT |= BIT1; //P1.1输出高电平
    P1OUT &= ~BIT1; //P1.1输出低电平
    
    P1DS.1 &= ~BIT1; //配置P1.1为弱驱动输出
    P1DS.1 |= BIT1; //配置P1.1为强驱动输出
    
  2. 端口复用配置

    基本每个IO都有端口复用功能,通过配置PxSEL.n把对应的IO口配置为复用功能

    使用以下代码配置P1.0为定时器A0时钟输入

    P1DIR &= ~BIT0; //设置P1.0为输入状态
    P1SEL |= BIT0; //将P1.0复用为定时器A0时钟输入
    

    相关配置需要按照datasheet中的端口复用表选择

时钟系统与低功耗

msp430f5529具有5种时钟源(XT1CLK、XT2CLK、VLOCLK、REFOCLK、DCOCLK)和3种时钟信号(MCLK、SMCLK、ACLK)

时钟系统可以软件配置成不需要外部晶振、需要一个外部晶振、需要两个外部晶振、外部时钟输入等方式,最极端的情况下单片机内部具有自身振荡器可以为CPU及片上外设提供系统时钟

时钟系统的安全性比较重要,msp430配备了紧急保护系统,在外部时钟故障时会自动选择内部时钟源REFOCLK或VLOCLK作为时钟信号,并产生响应故障信号(可选中断)

系统时钟大致分为两级,信号生成级信号分配级,中间通过MUX连接。信号生成级别分为三个模块基本的OSC模块可以通过晶振旁路、内部REFO或VLO直接输出XT1CLK、VLOCLK、REFOCLK三种信号;可选的XT2模块直接输出XT2晶振的4MHz时钟作为XT2CLK;可以通过晶振旁路和FLL(Frequency Locked Loop频环)进行晶振时钟倍频和分频,信号源(即FLLREFCLK反馈时钟)通过MUX直接引用XT1CLK、REFOCLK、XT2CLK之一,经过多个倍频分频器后输出为DCOCLK和DCOCLKDIV。所有信号分别输出到信号分配级,通过MUX分配给ACLK、MCLK、SMCLK

XT1CLK外部低频或高频时钟源,默认关闭,需要接入外部晶振并通过软件使晶振起振后再使用,一般使用32.768kHz的低频晶振,但是也可以使用4-32MHz的外部高频时钟源,端口P5.4、P5.5

使用下面的代码对时钟源进行配置

P5SEL |= BIT4 | BIT5; //配置P5.4、P5.5为XT1复用功能
UCSCTL6 |= XCAP_3; //配置匹配电容为12pF
UCSCTL6 &= ~XT1OFF; //使能XT1,使外部晶振起振
while(SFRIFG1 & OFIFG)
{ 
        
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); //清除三类时钟故障标志位,等待起振
    SFRIFG1 &= ~OFIFG; //清除震荡器故障标志位
}

XT2CLK:和XT1CLK类似,但只能接4-32MHz的高频晶振,一般接入4MHz晶振,需要额外加匹配电容方便起振。端口P5.2、P5.3

需要注意的是在配置SMCLK和MCLK为XT2CLK时钟源之前需要先修改ACLK和REFCLK的时钟源,因为它们的时钟源默认为XT1CLK,但这里并没有启动,所以会导致没有必要的XT1CLK始终故障,会影响判断XT2是否起振,实现代码如下

P5SEL |= BIT2 | BIT3; //配置P5.2、P5.3为XT2复用功能
UCSCTL6 &= ~XT2OFF; //使能XT2
UCSCTL4 = UCSCTL4 & (~(SELA_7)) | SELA_1; //将ACLK配置为VLOCLK
UCSCTL3 |= SELREF_2; //将REFCLK配置为REFOCLK

while(SFRIFG1 & OFIFG)
{ 
        
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); //清除三类时钟故障标志位,等待起振
    SFRIFG1 &= ~OFIFG; //清除震荡器故障标志位
}

VLOCLK内部低功耗、低频时钟源频率10kHz,精度较低,会随电源电压和温度产生较大漂移,用于不需要精准时钟基准的系统控制,被使用时自动开启、不使用时自动关闭,低功耗唤醒模式下回优先使用该时钟源作为系统和看门狗时钟

配置UCSCTL4选择

REFOCLK内部修整低频参考时钟源,精度较高,32.768kHz,和VLOCLK一样不需要配置寄存器进行起振,若未使用外部晶振,系统会自动选择该时钟源作为ACLK和DCOCLK锁频环参考时钟源

通过UCSCTL4选择

DCOCLK:内部数字控制时钟源,具有宽工作频率,最高可产生25MHz时钟频率,可以和FLL配合控制参考时钟,也可以引入其他时钟源反馈进行时钟分频/倍频,但是需要额外配置

这是f5xx中最常用的时钟源,类似于stm32的PLL时钟(它的内部也是类似的PLL)

其频率计算公式如下
D C O C L K = D × ( N + 1 ) × R E F C L K n D C O C L K D I V = ( N + 1 ) × R E F C L K n DCOCLK = D \times (N+1) \times \frac{REFCLK}{n} \\ DCOCLKDIV = (N+1) \times \frac{REFCLK}{n} DCOCLK=D×(N+1)×nREFCLKDCOCLKDIV=(N+1)×nREFCLK
REFCLK来源见上文

n为输入时钟分频,通过UCSCTL3中的FLLCLKDIV设定,查找该寄存器介绍可知其取值0-7,对应n取值2p,默认为0,不分频

D通过UCSCTL2中的FLLD设对,可取值0-7,对应D取值2p,默认为1,即D=2,二分频

N可以通过UCSCTL2中的FLLN设定,取值0-1023,当FLLN=0时,N=1,除此之外N=FLLN,默认为31,即N=31

如果系统复位后不进行任何设置,DCOCLK=2097152Hz,DCOCLKDIV=1048576Hz

MCLK和SMCLK都默认选择DCOCLKDIV作为时钟源

通过配置DCORSEL、DCOx、MOD来选择DCO的频率设置范围(最小值和最大值)

详细内容参考datasheet

MODOSC:内部模块振荡器,是UCS时钟模块下属的振荡器,能产生4.8MHz的MODCLK时钟,用于FLASH、ADC等片上外设

MCLK:为CPU和片上外设提供主时钟,默认使用DCOCLKDIV

通过配置DIVM选择MCLK分频系数为1、2、4、8、16、32

UCSCTL4 = UCSCTL4 & (~SELM_7) | SELM_0; //XT1CLK时钟源
UCSCTL4 = UCSCTL4 & (~SELM_7) | SELM_1; //VLOCLK时钟源
UCSCTL4 = UCSCTL4 & (~SELM_7) | SELM_2; //REFOCLK时钟源
UCSCTL4 = UCSCTL4 & (~SELM_7) | SELM_3; //DCOCLK时钟源
UCSCTL4 = UCSCTL4 & (~SELM_7) | SELM_4; //DCOCLKDIV时钟源
UCSCTL4 = UCSCTL4 & (~SELM_7) | SELM_5; //XT2CLK时钟源
UCSCTL5 = UCSCTL5 & (~DIVM_7) | DIVM_0; //MCLK不分频
UCSCTL5 = UCSCTL5 & (~DIVM_7) | DIVM_1; //MCLK 2分频
UCSCTL5 = UCSCTL5 & (~DIVM_7) | DIVM_2; //MCLK 4分频
UCSCTL5 = UCSCTL5 & (~DIVM_7) | DIVM_3; //MCLK 8分频
UCSCTL5 = UCSCTL5 & (~DIVM_7) | DIVM_4; //MCLK 16分频
UCSCTL5 = UCSCTL5 & (~DIVM_7) | DIVM_5; //MCLK 32分频

ACLK辅助时钟,专用来为外围模块提供信号。默认使用XT1CLK时钟源,如果未起振,则使用REFOCLK。配置方法和MCLK完全一致

SMCLK子系统主时钟,和MCLK基本一致,只是不为CPU提供时钟

上电复位后,UCS默认配置如下:

  • ACLK选择XT1为时钟源,如果未起振则使用REFOCLK并生成时钟故障标志
  • MCLK选择DCOCLKDIV
  • SMCLK选择DCOCLKDIV

需要注意:msp430f5529的XTIN和XTOUT引脚默认为GPIO功能,并在上电情况下不会启动,需要额外进行软件设置

同时P7.7、P2.2、P1.0分别能够对外输出MCLK、SMCLK、ACLK时钟

这里用最为复杂的DCO配置说明整个时钟系统的配置流程

#include 
#include 

void SetVcoreUp(uint_32_t level); //提升核心电压以提升工作频率
void XT1_ON(void); //启动XT1
void DCO__16MHz(void); //使用DCO将XT1倍频到16MHz

void main(void)
{ 
        
    WDTCTL = WDTPW + WDTHOLD;
    P1SEL |= BIT0; //P1.0 ACLK输出
    P1DIR |= BIT0;
    P2SEL |= BIT2; //SMCLK输出
    P2DIR |= BIT2;
    P7SEL |= BIT7; //MCLK输出
    P7DIR |= BIT7;
    P7DIR |= BIT0; //P7.0 LED驱动输出
    P1OUT |= BIT0;
    
    XT1_ON();
    DCO__16MHz();
    
    while(1)
    { 
        
        __delay_cycles(8000000); //每0.5s
        P7OUT ^= BIT0 ;//LED状态翻转一次
    }
}

void SetVcoreUp(uint_32_t level)
{ 
        
    PMMCTL0_H = PMMPW_H; //解锁PMM寄存器,允许写入
    SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level; //设置SVS/SVM高侧到新的等级
    SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level; //设置SVS低侧到新的等级
    while((PMMIFG & SVSMLDLYIFG) == 0); //等待SVM稳定
    PMMIFG &= ~(SVMLVLRIFG + SVMLIFG); //清除已经置位的标志
    PMMCTL0_L = PMMCOREV0 * level; //设置VCORE到新的等级
	
    if((PMMIFG & SVMLIFG)) //等待达到新的电压等级
    { 
        
        while((PMMIFG & SVMLVLRIFG) == 0);
    }
    
    //设置SVS/SVM低侧到新的水平
    SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
    PMMCTL0_H = 0x00; //锁住PMM的写入路径
}

void XT1_ON(void)
{ 
        
    P5SEL |= BIT4 |BIT5; //配置XT1引脚
    UCSCTL6 |= XCAP_3; //配置电容为12pF
    UCSCTL6 &= ~XT1OFF; //使能XT1
    
    while(SFRIFG1 & OFIFG)
    { 
        
        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); //清除三类时钟错误标志位
        SFRIFG1 &= ~OFIFG; //清除时钟错误标志位
    }
}

void DCO__16MHz(void)
{ 
        
    SetVcoreUp(1); //一级一级提升核心电压,不能跨级
    SetVcoreUp(2);
    
    /* 配置寄存器使DCOCLK=4.9MHz,DCOCLKDIV=2.45MHz */
    __bis_SR_register(SCG0); //关闭FLL库函数
    UCSCTL0 = 0x0000; //清零寄存器值,FLL运行时系统会自动配置该寄存器
    UCSCTL1 = DCORSEL_5; //选择DCOCLK频率范围 6-23.7MHz
    
    //FLLD=0,则D=1;FLLN=487,则N=487;N在UCSCTL3寄存器,默认值为1,则DCOCLK=1*(487+1)*32768=15.990784MHz
    //DCODIVCLK=(487+1)*32768=15.990784MHz
    UCSCTL2 = FLLD_0 + 487; 
    
    __bic_SR_register(SCG0); //开启FLL控制回路
    __delay_cycles(76563); //延时等待时钟稳定
    
    while(SFRIFG1 & OFIFG) //检测时钟错误并等待时钟稳定
    { 
        
        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
        SFRIFG1 &= ~OFIFG;
    }
}

低功耗配置

msp430一共有8种工作模式

  • 活跃模式(AM)
  • 低功耗模式(LPM)0
  • 低功耗模式1
  • 低功耗模式2
  • 低功耗模式3
  • 低功耗模式3.5
  • 低功耗模式4
  • 低功耗模式4.5

但是并不是所有系列都支持这些工作模式,对于f5529来说,不支持LPM3.5

使用以下指令来进入和退出低功耗模式0-4

/* 开总中断并进入低功耗模式 */
__bis_SR_register(LPMn_bits + GIE);

/* 退出低功耗模式 */
LPMn_EXIT; //其中n可以换成数字0-4

需要注意:低功耗模式唤醒都需要使用外部中断,所以需要在进入低功耗模式同时开启总中断

在最高级别LPM4.5低功耗模式下,RAM中内容会直接丢失,所以在从LPM4.5唤醒后需要重新配置寄存器和相关设置

中断

低功耗模式唤醒使用的指令实际上是通过直接修改SR寄存器的值,清除休眠标志,它内联到以下函数

_bic_SR_register_on_exit(LPM3_bits);//退出LPM3

MSP430和arm一样都具有系统中断不可屏蔽中断可屏蔽中断三种,其中系统中断和不可屏蔽中断优先级最高;可屏蔽中断可以通过状态寄存器SR中的GIE位来屏蔽和开启

大致的中断作用与arm类似,而使用方式与51类似

下面主要介绍外部中断

  1. 初始化端口时要清空中断标志位

    P1IFG &= ~(BIT0); //清空中断标志位
    
  2. 使用PIES寄存器选择触发边沿(0为上升沿,1为下降沿)并使用PxIE寄存器使能中断

    P1IES &= ~BIT0; //P1.0上升沿触发
    P1IES |= BIT1; //P1.1下降沿触发
    P1IES |= BIT2; //P1.2下降沿触发
        
    P1IE |= BIT0; //使能P1.0中断
    P1IE |= BIT1; //使能P1.1中断
    P1IE |= BIT2; //使能P1.2中断
    
  3. 开总中断

    __bis_SR_register(GIE);
    
  4. 编写中断服务函数

    #pragma vector = 中断向量地址
    __interrupt void ISR_function(void)
    { 
              
        //中断服务函数
    }
    
  5. 在中断函数内部清零中断标志位

    __even_in_range(P1IV, 16); //用于查询P1的所有中断标志位并自动清零,使用该函数可以实现将所有P1的外部中断放在同一个函数内解决的功能,如下所示
    
    switch(__even_in_range(P1IV, 16))
    { 
              
        case 0: //无中断
            break;
        case 2: //P1IFG.0
            /* 中断处理函数 */
            break;
        case 4: //P1IFG.1
            /* 中断处理函数 */
            break;
        case 6: //P1IFG.2
            /* 中断处理函数 */
            break;
        case 8: //P1IFG.3
            break;
        case 10: //P1IFG.4
            break;
        case 12: //P1IFG.5
            break;
        case 14: //P1IFG.6
            break;
        case 16: //P1IFG.7
            break;
        default: //出错情况
            break;
    }
    

此外,msp430还支持手动的嵌套中断

示例程序如下所示(TI的七段数码管驱动示例程序)

#include  

const unsigned char SEVENSEG_OUTPUT[10] = { 
        0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; 

unsigned char loopCounter;

unsigned char timeCounter1; 
unsigned char timeCounter2;
unsigned char timeCounter3;

int main(void)
{ 
        
    WDTCTL = WDTPW | WDTHOLD; //关闭看门狗

    PADIR = 0x03ff; // P1, P2.0 and P2.1 output, P2.6 and P2.7 input
    PAOUT = 0xc03f;

    P2REN = 0xc0; // P2.6 P2.7 上拉电阻使能
    P2IES = 0x3f; // P2.6 P2.7 配置中断为上升沿
    P2IE = 0xc0; // P2.6 P2.7 interrupt enabled

    PM5CTL0 &= ~LOCKLPM5; // 关闭GPIO高阻抗模式

    RTCMOD = 50; // 设置RTC重装计数值为50
                 // 64/32768 * 51 = ~0.1 sec.
    SYSCFG2 |= RTCCKSEL; // Source = ACLK = REFO,64分频,选择ACLK作为RTC时钟
    RTCCTL = RTCSS_1 | RTCSR | RTCPS__64;

    P2IFG = 0; // 清除P1.3中断标志位
    __bis_SR_register元器件数据手册IC替代型号,打造电子元器件IC百科大全!
          

相关文章