火辣西米秀

  • 2020-08-14
  • 发表了主题帖: 问一下MSP430FR5969开发使用什么仿真器

    问一下大神们,MSP430FR5969开发使用什么仿真器,板子上要留和开发板一样的USB口吗?  

  • 2020-08-11
  • 发表了主题帖: msp430f5529捕获加串口源码

    msp430f5529捕获加串口,可以供大家学习 单片机源程序如下: #include "msp430f5529.h" #define uint unsigned int #define uchar unsigned char uint flag,TA_cent,PerVal; unsigned long int val,cha; int m[5]; void Delay10ms(unsigned int c)   //误差 0us {     unsigned char a, b;         //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//     for (;c>0;c--)         {                 for (b=38;b>0;b--)                 {                         for (a=130;a>0;a--);                 }                  }       } void USCI_A0_Init()                   //USCI_A0的初始化 {         P3SEL |= BIT3+BIT4;               // P3.3和P3.4选择UART通信功能         UCA0CTL1 |= UCSWRST;              // 复位寄存器设置         UCA0CTL0 = 0x00;         UCA0CTL1 |= UCSSEL_1; // 波特率发生器参考时钟设置为ACLK,ACLK=32768Hz         UCA0BR0 = 0x03;                   // 波特率设置为9600bps         UCA0BR1 = 0x00;         UCA0MCTL |= UCBRS_3 + UCBRF_0;    // 调制器设置         UCA0CTL1 &= ~UCSWRST;             // 完成USCI_A0初始化设置 } void fasongzifu (char Cha)        //单个字符发送函数 {         UCA0TXBUF = Cha;         while (!(UCA0IFG&UCTXIFG));       //等待上一个字节发送完毕 } //void yunsuan() //{   //int m[5];   //m[0]=val%10000/1000;   //m[1]=val%1000/100; // m[2]=val%100/10;   //m[3]=val%10; //m[4]='.'; // USCI_A0_Putchar(m[0]+48);   //USCI_A0_Putchar(m[4]);   //USCI_A0_Putchar(m[1]+48);   //USCI_A0_Putchar(m[2]+48);   //USCI_A0_Putchar(m[3]+48); //} void main( void ) {   // Stop watchdog timer to prevent time out reset   WDTCTL = WDTPW + WDTHOLD;   P1DIR&=~BIT2;  //捕捉P1.2口   P1SEL |= BIT2;   TA0CCTL1 |= CAP + CM_1 + CCIS_0 + SCS + CCIE;//捕获模式,上升和下降都捕获,选择CCI2A,同步,捕获中断开   TA0CTL |= TASSEL_2 + MC_2 + ID_0 + TAIE + TACLR; //SMCLK=1M,连续计数模式   USCI_A0_Init();                   //USCI_A0初始化   _EINT();//中断起始位 while(1); } #pragma vector=TIMER0_A1_VECTOR __interrupt void TIMER0_A1_ISR(void) {   switch(TA0IV)   {     case 2:       val = TA0CCR1 - PerVal;       PerVal = TA0CCR1;       flag++;      if(flag >2)      {       flag =0;       val = 1048576 / val; //1048576 :系统稳定后,DCOCLK默认为2.097152MHZ,FLL默认2分频,则MCLK和SMCLK的频率都为1.048576MHZ。(实验三会提到如何计算)       m[0]=val%10000/1000;       m[1]=val%1000/100;       m[2]=val%100/10;       m[3]=val%10;       m[4]=' ';       fasongzifu(m[0]+48);     fasongzifu(m[1]+48);     fasongzifu(m[2]+48);       fasongzifu(m[3]+48);     fasongzifu(m[4]);     Delay10ms(10);          }      TA1CCTL0 &= ~CCIFG;       break;     case 4:       break;     case 10:       TA1CCTL0 &= ~CCIFG;       break;   } }  

  • 发表了主题帖: win10下使用Energia开发MSP430F5529LP 基本流程及遇到的问题

    energia.nu上下载energia 安装驱动,部分电脑可能要禁用数字签名,常规操作不多说,官网上也有禁用数字签名的方法。 都装好后打开energia,页面几乎和arduino一样,就是红得晃眼睛。什么东西都不写,先编译一下,就报错 大概意思是一个文件中的浮点数常量超出double范围 从来没见过这种错误,检查了一下自己安装的64位也没啥问题,到处找方法,论坛贴吧资料都很少,最后看到energia.exe附近有个arduino-builder.exe 点击运行一下,再回去编译,就ok了,blink烧写进去也完全正常。 后来发现还是有点问题,直接把报错的那个文件删除就好,不会有任何问题,亲测。 当然最好留个备份,后面有关于这个函数的问题了再放回去。

  • 发表了主题帖: MSP430f149头文件详解

    msp430f149头文件详解 #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_                0x0000   sfrb    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_               0x0002   sfrb    IFG1              = IFG1_; #define WDTIFG              0x01     /*看门狗中断标志*/ #define OFIFG               0x02     /*外部晶振故障中断标志*/ #define NMIIFG              0x10     /*非屏蔽中断标志*/ #define URXIFG0             0x40     /*串口0接收中断标志*/ #define UTXIFG0             0x80     /*串口0发送中断标志*/ /* 中断模式使能1 */ #define ME1_                0x0004 sfrb    ME1               = ME1_; #define URXE0               0x40        /* 串口0接收中断模式使能 */ #define USPIE0              0x40        /* 同步中断模式使能 */ #define UTXE0               0x80        /* 串口0发送中断模式使能 */ /* 中断使能2 */ #define IE2_                0x0001   sfrb    IE2               = IE2_; #define URXIE1              0x10       /* 串口1接收中断使能 */ #define UTXIE1              0x20       /* 串口1发送中断使能 */ /* 中断标志2 */ #define IFG2_               0x0003   sfrb    IFG2              = IFG2_; #define URXIFG1             0x10         /* 串口1接收中断标志 */ #define UTXIFG1             0x20         /* 串口1发送中断标志 */ /* 中断模式使能2 */ #define ME2_                0x0005   sfrb    ME2               = ME2_; #define URXE1               0x10         /* 串口1接收中断模式使能 */ #define USPIE1              0x10         /* 同步中断模式使能 */ #define UTXE1               0x20         /* 串口1发送中断模式使能 */ /************************************************************ *           看门狗定时器的寄存器定义 ************************************************************/ #define WDTCTL_             0x0120 sfrw    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_; #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 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_; #define TXBUF1_             0x007F  /* UART 1 Transmit Buffer */ 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 0:DCOCLK / 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 */ sfrw    ADC12MEM7         = ADC12MEM7_; #define ADC12MEM8_          0x0150  /* ADC12 Conversion Memory 8 */ sfrw    ADC12MEM8         = ADC12MEM8_; #define ADC12MEM9_          0x0152  /* ADC12 Conversion Memory 9 */ sfrw    ADC12MEM9         = ADC12MEM9_; #define ADC12MEM10_         0x0154  /* ADC12 Conversion Memory 10 */ sfrw    ADC12MEM10        = ADC12MEM10_; #define ADC12MEM11_         0x0156  /* ADC12 Conversion Memory 11 */ sfrw    ADC12MEM11        = ADC12MEM11_; #define ADC12MEM12_         0x0158  /* ADC12 Conversion Memory 12 */ sfrw    ADC12MEM12        = ADC12MEM12_; #define ADC12MEM13_         0x015A  /* ADC12 Conversion Memory 13 */ sfrw    ADC12MEM13        = ADC12MEM13_; #define ADC12MEM14_         0x015C  /* ADC12 Conversion Memory 14 */ sfrw    ADC12MEM14        = ADC12MEM14_; #define ADC12MEM15_         0x015E  /* ADC12 Conversion Memory 15 */ sfrw    ADC12MEM15        = ADC12MEM15_; /*ADC12存贮控制类寄存器*/ #define ADC12MCTL_          0x0080  /* ADC12 Memory Control */ #ifndef __IAR_SYSTEMS_ICC #define ADC12MCTL           ADC12MCTL_ /* ADC12 Memory Control (for assembler) */ #else #define ADC12MCTL           ((char*) ADC12MCTL_) /* ADC12 Memory Control (for C) */ #endif #define ADC12MCTL0_         ADC12MCTL_ /* ADC12 Memory Control 0 */ sfrb    ADC12MCTL0        = ADC12MCTL0_; #define ADC12MCTL1_         0x0081  /* ADC12 Memory Control 1 */ sfrb    ADC12MCTL1        = ADC12MCTL1_; #define ADC12MCTL2_         0x0082  /* ADC12 Memory Control 2 */ sfrb    ADC12MCTL2        = ADC12MCTL2_; #define ADC12MCTL3_         0x0083  /* ADC12 Memory Control 3 */ sfrb    ADC12MCTL3        = ADC12MCTL3_; #define ADC12MCTL4_         0x0084  /* ADC12 Memory Control 4 */ sfrb    ADC12MCTL4        = ADC12MCTL4_; #define ADC12MCTL5_         0x0085  /* ADC12 Memory Control 5 */ sfrb    ADC12MCTL5        = ADC12MCTL5_; #define ADC12MCTL6_         0x0086  /* ADC12 Memory Control 6 */ sfrb    ADC12MCTL6        = ADC12MCTL6_; #define ADC12MCTL7_         0x0087  /* ADC12 Memory Control 7 */ sfrb    ADC12MCTL7        = ADC12MCTL7_; #define ADC12MCTL8_         0x0088  /* ADC12 Memory Control 8 */ sfrb    ADC12MCTL8        = ADC12MCTL8_; #define ADC12MCTL9_         0x0089  /* ADC12 Memory Control 9 */ sfrb    ADC12MCTL9        = ADC12MCTL9_; #define ADC12MCTL10_        0x008A  /* ADC12 Memory Control 10 */ sfrb    ADC12MCTL10       = ADC12MCTL10_; #define ADC12MCTL11_        0x008B  /* ADC12 Memory Control 11 */ sfrb    ADC12MCTL11       = ADC12MCTL11_; #define ADC12MCTL12_        0x008C  /* ADC12 Memory Control 12 */ sfrb    ADC12MCTL12       = ADC12MCTL12_; #define ADC12MCTL13_        0x008D  /* ADC12 Memory Control 13 */ sfrb    ADC12MCTL13       = ADC12MCTL13_; #define ADC12MCTL14_        0x008E  /* ADC12 Memory Control 14 */ sfrb    ADC12MCTL14       = ADC12MCTL14_; #define ADC12MCTL15_        0x008F  /* ADC12 Memory Control 15 */ sfrb    ADC12MCTL15       = ADC12MCTL15_; /* ADC12CTL0 内16位控制寄存器位*/ #define ADC12SC             0x001         /*采样/转换控制位*/    #define ENC                 0x002         /* 转换允许位*/ #define ADC12TOVIE          0x004         /*转换时间溢出中断允许位*/ #define ADC12OVIE           0x008         /*溢出中断允许位*/ #define ADC12ON             0x010         /*ADC12内核控制位*/ #define REFON               0x020         /*参考电压控制位*/ #define REF2_5V             0x040         /*内部参考电压的电压值选择位 '0'为1.5V; '1'为2.5V*/ #define MSH                 0x080         /*多次采样/转换位*/ #define MSC                 0x080         /*多次采样/转换位*/ /*SHT0 采样保持定时器0 控制ADC12的结果存贮器MEM0~MEM7的采样周期*/ #define SHT0_0               0*0x100       /*采样周期=TADC12CLK*4 */ #define SHT0_1               1*0x100       /*采样周期=TADC12CLK*8 */ #define SHT0_2               2*0x100       /*采样周期=TADC12CLK*16 */ #define SHT0_3               3*0x100       /*采样周期=TADC12CLK*32 */ #define SHT0_4               4*0x100       /*采样周期=TADC12CLK*64 */ #define SHT0_5               5*0x100       /*采样周期=TADC12CLK*96 */ #define SHT0_6               6*0x100       /*采样周期=TADC12CLK*128 */ #define SHT0_7               7*0x100       /*采样周期=TADC12CLK*192 */ #define SHT0_8               8*0x100       /*采样周期=TADC12CLK*256 */ #define SHT0_9               9*0x100       /*采样周期=TADC12CLK*384 */ #define SHT0_10             10*0x100       /*采样周期=TADC12CLK*512 */   #define SHT0_11             11*0x100       /*采样周期=TADC12CLK*768 */ #define SHT0_12             12*0x100       /*采样周期=TADC12CLK*1024 */ #define SHT0_13             13*0x100       /*采样周期=TADC12CLK*1024 */ #define SHT0_14             14*0x100       /*采样周期=TADC12CLK*1024 */ #define SHT0_15             15*0x100       /*采样周期=TADC12CLK*1024 */ /*SHT1 采样保持定时器1 控制ADC12的结果存贮器MEM8~MEM15的采样周期*/ #define SHT1_0               0*0x100       /*采样周期=TADC12CLK*4 */ #define SHT1_1               1*0x100       /*采样周期=TADC12CLK*8 */ #define SHT1_2               2*0x100       /*采样周期=TADC12CLK*16 */ #define SHT1_3               3*0x100       /*采样周期=TADC12CLK*32 */ #define SHT1_4               4*0x100       /*采样周期=TADC12CLK*64 */ #define SHT1_5               5*0x100       /*采样周期=TADC12CLK*96 */ #define SHT1_6               6*0x100       /*采样周期=TADC12CLK*128 */ #define SHT1_7               7*0x100       /*采样周期=TADC12CLK*192 */ #define SHT1_8               8*0x100       /*采样周期=TADC12CLK*256 */ #define SHT1_9               9*0x100       /*采样周期=TADC12CLK*384 */ #define SHT1_10             10*0x100       /*采样周期=TADC12CLK*512 */   #define SHT1_11             11*0x100       /*采样周期=TADC12CLK*768 */ #define SHT1_12             12*0x100       /*采样周期=TADC12CLK*1024 */ #define SHT1_13             13*0x100       /*采样周期=TADC12CLK*1024 */ #define SHT1_14             14*0x100       /*采样周期=TADC12CLK*1024 */ #define SHT1_15             15*0x100       /*采样周期=TADC12CLK*1024 */ /* ADC12CTL1 内16位控制寄存器位*/ #define ADC12BUSY           0x0001         /*ADC12忙标志位*/ #define CONSEQ_0             0*2           /*单通道单次转换*/ #define CONSEQ_1             1*2           /*序列通道单次转换*/ #define CONSEQ_2             2*2           /*单通道多次转换*/ #define CONSEQ_3             3*2           /*序列通道多次转换*/ #define ADC12SSEL_0          0*8           /*ADC12内部时钟源*/ #define ADC12SSEL_1          1*8           /*ACLK*/ #define ADC12SSEL_2          2*8           /*MCLK*/ #define ADC12SSEL_3          3*8           /*SCLK*/ #define ADC12DIV_0           0*0x20        /*1分频*/ #define ADC12DIV_1           1*0x20        /*2分频*/ #define ADC12DIV_2           2*0x20        /*3分频*/ #define ADC12DIV_3           3*0x20        /*4分频*/ #define ADC12DIV_4           4*0x20        /*5分频*/ #define ADC12DIV_5           5*0x20        /*6分频*/ #define ADC12DIV_6           6*0x20        /*7分频*/ #define ADC12DIV_7           7*0x20        /*8分频*/ #define ISSH                 0x0100        /*采样输入信号反向与否控制位*/ #define SHP                  0x0200        /*采样信号(SAMPCON)选择控制位*/ #define SHS_0                0*0x400       /*采样信号输入源选择控制位 ADC12SC*/ #define SHS_1                1*0x400       /*采样信号输入源选择控制位 TIMER_A.OUT1*/ #define SHS_2                2*0x400       /*采样信号输入源选择控制位 TIMER_B.OUT0*/ #define SHS_3                3*0x400       /*采样信号输入源选择控制位 TIMER_B.OUT1*/ /*转换存贮器地址定义位*/ #define CSTARTADD_0          0*0x1000      /*选择MEM0首地址*/ #define CSTARTADD_1          1*0x1000      /*选择MEM1首地址*/ #define CSTARTADD_2          2*0x1000      /*选择MEM2首地址*/ #define CSTARTADD_3          3*0x1000      /*选择MEM3首地址*/ #define CSTARTADD_4          4*0x1000      /*选择MEM4首地址*/ #define CSTARTADD_5          5*0x1000      /*选择MEM5首地址*/ #define CSTARTADD_6          6*0x1000      /*选择MEM6首地址*/ #define CSTARTADD_7          7*0x1000      /*选择MEM7首地址*/ #define CSTARTADD_8          8*0x1000      /*选择MEM8首地址*/ #define CSTARTADD_9          9*0x1000      /*选择MEM9首地址*/ #define CSTARTADD_10        10*0x1000      /*选择MEM10首地址*/ #define CSTARTADD_11        11*0x1000      /*选择MEM11首地址*/ #define CSTARTADD_12        12*0x1000      /*选择MEM12首地址*/ #define CSTARTADD_13        13*0x1000      /*选择MEM13首地址*/       #define CSTARTADD_14        14*0x1000      /*选择MEM14首地址*/    #define CSTARTADD_15        15*0x1000      /*选择MEM15首地址*/ /* ADC12MCTLx */ #define INCH_0               0                 /*选择模拟量通道0 A0 */ #define INCH_1               1                 /*选择模拟量通道0 A1*/ #define INCH_2               2                 /*选择模拟量通道0 A2*/ #define INCH_3               3                 /*选择模拟量通道0 A3*/ #define INCH_4               4                 /*选择模拟量通道0 A4*/ #define INCH_5               5                 /*选择模拟量通道0 A5*/ #define INCH_6               6                 /*选择模拟量通道0 A6*/ #define INCH_7               7                 /*选择模拟量通道0 A7*/ #define INCH_8               8                 /*VEREF+*/ #define INCH_9               9                 /*VEREF-*/ #define INCH_10             10                 /*片内温度传感器的输出*/ #define INCH_11             11                 /*(AVCC-AVSS)/2*/ #define INCH_12             12                 /*(AVCC-AVSS)/2*/ #define INCH_13             13                 /*(AVCC-AVSS)/2*/ #define INCH_14             14                 /*(AVCC-AVSS)/2*/ #define INCH_15             15                 /*(AVCC-AVSS)/2*/ /*参考电压源选择位*/ #define SREF_0               0*0x10            /*VR+ = AVCC; VR- = AVSS*/ #define SREF_1               1*0x10            /*VR+ = VREF+; VR- = AVSS*/ #define SREF_2               2*0x10            /*VR+ = VEREF+; VR- = AVSS*/ #define SREF_3               3*0x10            /*VR+ = VEREF+; VR- = AVSS*/ #define SREF_4               4*0x10            /*VR+ = AVCC; VR- = VREF-*/ #define SREF_5               5*0x10            /*VR+ = VREF+; VR- = VREF-*/ #define SREF_6               6*0x10            /*VR+ = VEREF+; VR- = VREF-*/ #define SREF_7               7*0x10            /*VR+ = VEREF+; VR- = VREF-*/ #define EOS                 0x80               /*序列结束选择位*/ /************************************************************ * Interrupt Vectors (offset from 0xFFE0) 16个中断矢量定义 ************************************************************/ //#define BASICTIMER_VECTOR   0 * 2  /* 0xFFE0 Basic Timer MSP430F149 没有*/ #define PORT2_VECTOR        1 * 2  /* 0xFFE2 Port 2 */ #define UART1TX_VECTOR      2 * 2  /* 0xFFE4 UART 1 Transmit */ #define UART1RX_VECTOR      3 * 2  /* 0xFFE6 UART 1 Receive */ #define PORT1_VECTOR        4 * 2  /* 0xFFE8 Port 1 */ #define TIMERA1_VECTOR      5 * 2  /* 0xFFEA Timer A CC1-2, TA */ #define TIMERA0_VECTOR      6 * 2  /* 0xFFEC Timer A CC0 */ #define ADC_VECTOR          7 * 2  /* 0xFFEE ADC */ #define UART0TX_VECTOR      8 * 2  /* 0xFFF0 UART 0 Transmit */ #define UART0RX_VECTOR      9 * 2  /* 0xFFF2 UART 0 Receive */ #define WDT_VECTOR          10 * 2 /* 0xFFF4 Watchdog Timer */ #define COMPARATORA_VECTOR  11 * 2 /* 0xFFF6 Comparator A */ #define TIMERB1_VECTOR      12 * 2 /* 0xFFF8 Timer B 1-6 */ #define TIMERB0_VECTOR      13 * 2 /* 0xFFFA Timer B 0 */ #define NMI_VECTOR          14 * 2 /* 0xFFFC Non-maskable */ #define RESET_VECTOR        15 * 2 /* 0xFFFE Reset [Highest Priority] */ /************************************************************ * End of Modules ************************************************************/ #endif /* #ifndef __msp430x44x */

  • 2020-08-10
  • 发表了主题帖: 单片机在医疗器械设备中有哪些应用

         其实单片机在医疗器械设备中,应用非常广泛,常用的小型设备。或者一些大型得设备都使用的单片机,其中运用到了单片机的外设部分有ADC iic pwm 存储,串口,外部中断,低功耗模式,看门狗,定时器等应用。具体项目会有差异,具体情况具体分析。   最基础的应用就是人体血压测量用了,现在去医院体检用的都是这个;   单片机在当前的医疗器械领域广泛运用,常见的血压,血氧,血糖,体温计,额温枪,耳温枪,雾化器,生化采集系统设备,红外照射仪等等都运用了8位,16位,或者一部分32位的单片机,   很多人就会说你将32位了还是单片机吗?其实在开发人员眼里,不能跑linux的都可以成为单片机,比如stm32,只是比51系列单片机功能强大很多而已。   在医疗器械当中,一般包含 电源管理,显示屏或者灯,或者能够将数据传输到其他终端的无线外设如蓝牙, 传感器部分,   单片机电池采集,锂电池或者干电池供电,使用ADC采集,一般电池电压工作在3.4~4.2之间,将电压分为几个档位,有需要的项目可以显示电池状态,当电池电量低于一定电压时,提示电池电量低。   显示部分,一般的二类医疗器械,都会有显示屏,一般采用外部驱动芯片,驱动屏幕,有部分单片机自带断码屏,或者彩屏驱动器,直接驱动。   人体参数采集部分,使用专用的血压,血氧,或者血糖用的传感器,传感器分有数字式也有模拟式,各有优点,单片机采集到数据后,经过算法滤波,提取信号,并经过计算算法,算出人体参数。   半医疗单片机器械要数心率心跳测量仪,如今我们的手环已具有此项功能;   那一次看上海一家医院的自动化医疗器械把我震惊了。首先,单片机的一个完美应用实在配药上。以前很多试剂需要护理人员花上半天时间去配置。他们要精确掌握好每一剂的用量,“全副武装”(因为很多试剂对人体是有害的),后来这些配药过程改成用自动化器械来生产了,不进提高了效率,提高了精准度,而且在完全无菌的情况下更安全。   另一个应用好像属于针对病人的化疗在用。我举一个例子,对于患有甲状腺的病人,初期化疗时,因为处在一个放射性的环境,这是一个危险期,护理人员不能直接接触病人,以往对于病人每天的体征检查就是电话呼叫,护士在这边说怎么怎么操作,病人在那边按照操作来自己处理。现在是引进了机器人,可以每个病房每个病房巡查,给病人进行体征检测了。

  • 发表了主题帖: 单片机复位的原理说明

           单片机的复位电路使单片机进入复位状态。通过复位操作可以完成单片机的初始化,也可使处于死机状态下的单片机程序重新开始运行。   单片机复位的原理是,在时钟电路开始工作后,在单片机的RST复位引脚施加24个以上的时钟振荡脉冲的高电平,单片机便可以实现复位。当RST引脚从高电平跳变为低电平后,单片机便从0000H地址开始执行程序。   单片机的复位电路可以有上电复位、手动加上电复位、看门狗复位以及一些复杂的复位电路。在实际应用中,一般采用外部复位电路来进行单片机复位。此时,在RST引脚保持10ms以上的高电平即可保证单片机能够可靠地复位。   最典型的上电复位电路如图1所示,其基本原理是利用RC电路的充放电效应。当单片机上电的时候,复位电路通过电容加载RST引脚一个短暂的高电平信号,这个高电平信号随着电容的充电而逐渐降低,这个高电平持续的时间和RC电路的充放电时间有关。用户在使用时,需要选择合适的电容和电阻来使高电平的持续时间大于单片机的复位时间。     图1 上电复位电路   在实际应用的电路中经常需要手工复位,因此使用最多的便是既可以手动复位又可以上电复位的电路,如图2所示。上电复位部分的原理同样是RC电路的充放电效应。当按下复位开关的时候,VCC通过一个电阻之间连接到RST引脚,给RST一个高电平,按键松开的时候,RST引脚恢复为低电平,从而完成复位。   图2 手动加上电复位电路   在一些复杂的单片机系统中,还经常用到定时监视器复位,它采用单片机内部的看门狗来实现复位操作。应用程序在运行过程中,由于外界的干扰而进入非正常工作状态时,WDT定时计数器产生溢出信号,复位单片机,重新恢复正常运行。对于自身不带看门狗WDT功能的单片机,可以采用专门的复位电路芯片来实现。

  • 发表了主题帖: 一文知道keil编译程序的过程

    首先我们简单了解下MDK的编译过程,它与其它编译器的工作过程是类似的,如下图。      编译过程生成的不同文件将在后面的小节详细说明,此处先抓住主要流程来理解。   (1)编译,MDK软件使用的编译器是armcc和armasm,它们根据每个c/c++和汇编源文件   编译成对应的以“.o”;为后缀名的对象文件(ObjectCode,也称目标文件),其内容主要是从源文件编译得到的机器码,包含了代码、数据以及调试使用的信息;   (2)链接,链接器armlink把各个.o文件及库文件链接成一个映像文件“.axf”;或“.elf”;   (3)格式转换,一般来说Windows或Linux系统使用链接器直接生成可执行映像文件elf后,内核根据该文件的信息加载后,就可以运行程序了,但在单片机平台上,需要把该文件的内容加载到芯片上,所以还需要对链接器生成的elf映像文件利用格式转换器fromelf转换成“.bin”或&“.hex”文件,交给下载器下载到芯片的FLASH或ROM中。   一般情况下高端的嵌入式系统使用的都是基于Linux系统,包括Android都是基于Linux内核,不过ios系统是基于Unix系统内核。但是移动端硬件方面ARM有着绝对的话语权,目前工业控制类或者手机,强如iPhone8/iPhoneX同样都使用ARM内核的IP,只是由不同的厂商对它进行封装。

  • 发表了主题帖: 为什么单片机的I/O口需要驱动

    为什么单片机的I/O口需要驱动呢?这个问题需要从I/O口的电气特性上进行解释。   首先,给出单片机典型的I/O口,即Pl口电气结构图,如图所示。P1口通常是作为通用I/O口使用,不需要多路转换电路MUX。其输出级电路内部有上拉电阻,与场效应管共同组成输出驱动电路。因此,P1口作为输出时,不需要再外接上拉电阻,而当P1口作为输入口使用时,仍然需要先向锁存器写“1”,截止场效应管。   内部上拉电阻阻值很大,经过测量大致在330KΩ左右,而内部电源Vcc仅仅+5V,这样以P1.X高电平驱动发光二极管为例,场效应管截止,相当于Vcc通过330KΩ的电阻向二极管提供电流,5/330*10-3=0.015mA,而二极管的点亮电流为5mA至10mA,这就说明单片机的端口只是驱动TTL电平,不提供或提供很小的驱动电流,所以在带负载时,单片机应当在I/O口加上驱动芯片。

  • 发表了主题帖: 单片机的死循环有什么作用

       单片机是可编程器件,在使用时需要编写满足需求的程序。其C语言程序在各个端口、配置初始化完成后,会进入一个死循环,一般用while(1){;}的形式。初始化完成后,单片机就在死循环内一遍又一遍的执行程序逻辑。复位后,就从头开始,初始化完成后,再次进入死循环。   单片机在执行程序是从上到下一条一条语句执行的,对于定时器的配置、端口的初始化等内容,只需要执行一次就可以,所以初始化内容放在while(1)循环之外,而对于任务之类需要实时检测的逻辑就需要放在死循环内,让单片机不停的去执行。   单片机的程序分为查询式和中断式。所谓查询,就是需要不停的去扫描,比较耗费资源;而中断具有中断标志位,只有中断标志位置位后才去处理中断内容,比较节省资源。所以,查询就是通过while(1)循环来保证的。 单片机的死循环有什么作用   单片机在执行主程序时,如果发生了中断,则会优先处理中断内容,处理完成后再从刚才的断点处继续执行,如果发生了多个中断,则先执行中断优先级较高的中断。

  • 2020-08-09
  • 发表了主题帖: msp430fr2311单片机adc序列通道采样

    使用P1.2、P1.3、P1.4、P1.5为采样通道,以demo的msp430fr231x_adc10_10.c文件为例。 1、将上述4个管脚配置为ADC模式: P1SEL0 |= BIT2 + BIT3 + BIT4 + BIT5; P1SEL1 |= BIT2 + BIT3 + BIT4 + BIT5; 2、查看资料可知,有4种adc采样模式,单通道单次,序列通道单次,单通道多次,序列通道多次; 本例选择序列通道单次,将ADCCT寄存器设为L1ADCCONSEQ_1;430读取通道数据时是由最高通道开始,直至A0,因此将ADCMCTL0设置为ADCINCH_5(通道5), ADCMCTL0 |= ADCINCH_5; //参考电压为ADCC。 adc采样值保存在ADCMEM0寄存器中,类似串口接收区。当配置为序列通道时,循环读取ADCMEM的值,即为采样的数据。 注意:序列通道时,需要从最高通道一直读到通道0,总共6个通道。因此定义数组u16 ADC_Result[6],在ADC的中断处理函数中,进行赋值: //初始化函数 void adc_init() {        // Configure ADC A0~2 pins     P1SEL0 |= BIT2 + BIT3 + BIT4 + BIT5;     P1SEL1 |= BIT2 + BIT3 + BIT4 + BIT5;     // Disable the GPIO power-on default high-impedance mode to activate     // previously configured port settings     PM5CTL0 &= ~LOCKLPM5;    // Configure ADC      ADCCTL0 |= ADCSHT_2 | ADCMSC | ADCON; // 16ADCclks, MSC, ADC ON     ADCCTL1 |= ADCSHP | ADCCONSEQ_1 | ADCSSEL_1;   // ADC clock ACLK, sampling timer, s/w trig.,single sequence     ADCCTL2 = ADCRES;   // 10-bit conversion results     ADCMCTL0 |= ADCINCH_5;   // A5~2(EoS); Vref=avcc=3.3v     ADCIE |= ADCIE0;       // Enable ADC conv complete interrupt           // Configure reference     PMMCTL0_H = PMMPW_H;         // Unlock the PMM registers     PMMCTL2 |= INTREFEN;          // Enable internal reference     __delay_cycles(400);           // Delay for reference settling     __no_operation();     } // ADC interrupt service routine #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=ADC_VECTOR __interrupt void ADC_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(ADC_VECTOR))) ADC_ISR (void) #else #error Compiler not supported! #endif {     switch(__even_in_range(ADCIV,ADCIV_ADCIFG))     {         case ADCIV_NONE:              break;                                       case ADCIV_ADCOVIFG:              break;                      case ADCIV_ADCTOVIFG:              break;                     case ADCIV_ADCHIIFG:              break;                      case ADCIV_ADCLOIFG:              break;                      case ADCIV_ADCINIFG:              break;                      case ADCIV_ADCIFG:             ADC_Result = ADCMEM0;             if(i == 0)             {                 __bic_SR_register_on_exit(LPM0_bits);   // Exist LPM0             }             else             {                 i--;             }             break;                                                      default:              break;      }   } 此时,ADC_Result[0]为通道0,ADC_Result[1]为通道1,依次。 3、采样值的转换 2311的ADC是10位的,参考电压为3.3V,因此 ADC_Result[6]定义为u16,不要定义为 u8 噢。 4、注意事项 上述设置,ADC完成单次转换后需要退出低功耗重新开启。在定时器或者while(1)中循环开启,   while(ADCCTL1 & ADCBUSY);     // Wait if ADC core is active     ADCCTL0 |= ADCENC | ADCSC;    // Sampling and conversion start   i = 5;  //数组索引重新赋值 在调试过程中,开始将 i=5 放在重新开启之前,发现数组中通道的数据会发生错位的现象,如通道3的数据在ADC_Result[2]中,本应在ADC_Result[3]中。放在此处更好! 5 后续 因选用的芯片fram太小了,没有对adc的采样数据进行平均化处理。 若需平均化,将采样模式配置为序列多次采样通道,ADCCONSEQ_3. 重复的次数在通过数据的大小来限制,定义 u16 ADC_Result[30], 执行ADC_Result = ADCMEM0, 当i=30时,跳出低功耗即可。 数组中存放的数据依次为[A5,A4,A3,A2,A1,A0,A5,A4,A3,A2,A1,A0,… ], 读者自己进行数据处理即可。

  • 发表了主题帖: MSP430G2xx3_Code_Examples Manifest

    DISCLAIMERS   Export Control Classification Number (ECCN)   Any use of ECCNs listed in the Manifest is at the user’s risk and without recourse to TI.   Your company, as the exporter of record, is responsible for determining the correct classification of any item at the time of export. Any export classification by TI of Software is for TI’s internal use only and shall not be construed as a representation or warranty regarding the proper export classification for such Software or whether an export license or other documentation is required for exporting such Software.    Links in the Manifest   Any links appearing on this Manifest (for example in the “Obtained from” field) were verified at the time the Manifest was created. TI makes no guarantee that any listed links will remain active in the future. Open Source License References Your company is responsible for confirming the applicable license terms for any open source Software listed in this Manifest that was not “Obtained from” TI.  Any open source license specified in this Manifest for Software that was not “Obtained from” TI is for TI’s internal use only and shall not be construed as a representation or warranty regarding the proper open source license terms for such Software.     Export Information   ECCN for Software included in this release:  Publicly Available   ECCN for Technology (e.g., user documentation, specifications) included in this release:  Publicly Available     Manifest   See Legend above for a description of the columns and possible values.   Software Name Version License Type Delivered As Modified by TI   MSP430G2xx3_Code_Examples 1.00.00.00 BSD_EX Source Texas Instruments Location  [installed path]/MSP430G2xx3_Code_Examples Obtained from Texas Instruments       Credits   Licenses Copyright (c) 2012, Texas Instruments Incorporated All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Texas Instruments Incorporated nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************************************************************** MSP430 CODE EXAMPLE DISCLAIMER MSP430 code examples are self-contained low-level programs that typically demonstrate a single peripheral function or device feature in a highly concise manner. For this the code may rely on the device's power-on default register values and settings such as the clock configuration and care must be taken when combining code from several examples to avoid potential side effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware for an API functional library-approach to peripheral configuration.  

  • 2020-08-08
  • 发表了主题帖: MSP430的中断优先级、打开关闭、中断嵌套

    优先级顺序从高到低为:     PORT2_VECTOR (1 * 2u) /* 0xFFE2 Port 2 */     PORT1_VECTOR (4 * 2u) /* 0xFFE8 Port 1 */     TIMERA1_VECTOR (5 * 2u) /* 0xFFEA Timer A CC1-2, TA */     TIMERA0_VECTOR (6 * 2u) /* 0xFFEC Timer A CC0 */     ADC_VECTOR (7 * 2u) /* 0xFFEE ADC */     USART0TX_VECTOR (8 * 2u) /* 0xFFF0 USART 0 Transmit */     USART0RX_VECTOR (9 * 2u) /* 0xFFF2 USART 0 Receive */     WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */     COMPARATORA_VECTOR (11 * 2u) /* 0xFFF6 Comparator A */    TIMERB1_VECTOR (12 * 2u) /* 0xFFF8 Timer B CC1-2, TB */    TIMERB0_VECTOR (13 * 2u) /* 0xFFFA Timer B CC0 */    NMI_VECTOR (14 * 2u) /* 0xFFFC Non-maska××e */    RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priority] */     当同时有多个中断来的时候才有优先级的考虑(优先级顺序可查看向量表)     有中断响应以后自动关闭总中断,这个时候即使来更高优先级的中断都不会响应     要中断嵌套的话,就必须在中断中打开总中断!    msp430的指令中,DINT和EINT分别指关和开所有中断,也就是包涵P1IE、P2IE、WDTIE、TAIE、TBIE、ADC12IE、串口中断允许的所有中断允许位为“0”和为“1”。 实现中断嵌套需要注意以下几点:       1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT;       2)当进入中断程序时,只要不在中断中再次开中断,则总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行;       3)若在中断A中开了总中断,则可以响应后来的中断B(不管B的优先级比A高还是低),B执行完再继续执行A。注意:进入中断B后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动打开;      4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来时才起做用!中断服务不执行抢先原则。      5)对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;      对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用"EINT();"开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关.

  • 发表了主题帖: MSP430单片机的中断

         中断是MSP430微处理器的一大特色,有效地利用中断可以简化程序和提高执行效率。MSP430的几乎每个外围模块都能够产生中断,为MSP430针对事件(即外围模块产生的中断)进行的编程打下基础。MSP430在没有事件发生时进入低功耗模式,事件发生时,通过中断唤醒CPU,事件处理完毕后,CPU再次进入低功耗状态。由于CPU的运算速度和退出低功耗的速度很快,所以在应用中,CPU大部分时间都处于低功耗状态。 MSP430的中断分为3种:系统复位、不可屏蔽中断、可屏蔽中断。 (1)系统复位的中断向量为0xFFFE。 (2)不可屏蔽中断的中断向量为0xFFFC。响应不可屏蔽中断时,硬件自动将OFIE、NMIE、ACCVIE复位。软件首先判断中断源并复位中断标志,接着执行用户代码。退出中断之前需要置位OFIE、NMIE、ACCVIE,以便能够再次响应中断。需要特别注意点:置位OFIE、NMIE、ACCVIE后,必须立即退出中断相应程序,否则会再次触发中断,导致中断嵌套,从而导致堆栈溢出,致使程序执行结果的无法预料。 (3)可屏蔽中断的中断来源于具有中断能力的外围模块,包括看门狗定时器工作在定时器模式时溢出产生的中断。每一个中断都可以被自己的中断控制位屏蔽,也可以由全局中断控制位屏蔽。 多个中断请求发生时,响应最高优先级中断。响应中断时,MSP430会将不可屏蔽中断控制位SR.GIE复位。因此,一旦响应了中断,即使有优先级更高的可屏蔽中断出现,也不会中断当前正在响应的中断,去响应另外的中断。但SR.GIE复位不影响不可屏蔽中断,所以仍可以接受不可屏蔽中断的中断请求。 中断响应的过程:(1)如果CPU处于活动状态,则完成当前指令;(2)若CPU处于低功耗状态,则退出低功耗状态;(3)将下一条指令的PC值压入堆栈;(4)将状态寄存器SR压入堆栈;(5)若有多个中断请求,响应最高优先级中断;(6)单中断源的中断请求标志位自动复位,多中断源的标志位不变,等待软件复位;(7)总中断允许位SR.GIE复位。SR状态寄存器中的CPUOFF、OSCOFF、SCG1、V、N、Z、C位复位;(8)相应的中断向量值装入PC寄存器,程序从此地址开始执行。 中断返回的过程:(1)从堆栈中恢复PC值,若响应中断前CPU处于低功耗模式,则可屏蔽中断仍然恢复低功耗模式;(2)从堆栈中恢复PC值,若响应中断前CPU不处于低功耗模式,则从此地址继续执行程序。

  • 发表了主题帖: HEX文件格式

    HEX文件格式 开打Hex文件,如下所示: :020000040800F2 :100000001013002089010008950C00088D0C0008D1 :10001000910C00084302000835140008000000009D ............. :08CAD000050002040608000045 :04000005080000ED02 :00000001FF 文件格式 1、以行为单位。 2、每行开头是“:“(0x3A),结尾”回车换行“(0x0D,0x0A.)。 3、中间所有内容都是一字符形式表现的。若数据是”0x1A“,在HEX中就是”0x31 0x41“。 4、HEX文件格式:”LLAAAATT【DD.----】CC“。   代号 字段 长度 : : 1字节 LL 数据长度 1字节 AAAA 数据地址 2字节 TT 数据类型 1字节 DD-- 数据 N字节 CC 校验 1字节 回车换行 0x0D 0x0A 2字节回车换行 TT数据类型: 00->数据记录 01->用来标识文件记录的结束 02->用来标识扩展段地址 03->开始段地址 04->用来标识扩展线性地址(虚地址) 05->开始线性地址(虚地址)  CC校验和: 校 验和的计算是通过将记录当中所有十六进制编码数字对的值相加, 以256 为 模 进 行以下 补 足. 例如:  :10246200464C5549442050524F46494C4500464C33 33 是这个记录的校 验和即0x33;计算方法如下:100H-(10H+24H+62H+00H+46H+4CH+55H+49H+44H+20H+50H+52H+4FH+46H+49H+4CH+45H+00H+46H+4CH) % 100H=33H; 扩展线性地址记录(HEX386)   扩展线性地址记录又称为32位地址记录或者HEX386记录。 这些记录包含了数据地址的高16位。T扩展线性地址记录总是有两个数据,格式如下 :020000040800F2 这里: 02 是记录的数据位数 0000 对于扩展线性地址记录,这部分都是零。 04 代表记录类型是扩展线性地址记录。 0800 是地址的高16位。 F2 是以下计算结果的和:01h + NOT(02h + 00h + 00h + 04h + 08h + 00h). 当一个扩展线性地址被读取时,在数据域中的扩展线性地址被储存并且运用到后来的记录的读取中。线性地址保持有效直到被另外一个扩展地址所改变。数据的绝对地址由扩展线性地址和偏移地址相加获得。 下面这个例子可以说明这个过程。 数据记录的地址域中的地址                          2462 扩展线性地址记录的数据域                      0800                                               -------- 绝对地址:                                    08002462   扩展段地址记录(HEX86) 扩展段地址记录(也称HEX86)包括数据地址段的4-19位。扩展段地址记录总有两个数据位。一般如下: :020000021200EA 这里: 02 在本记录中的数据的位数。 0000对于扩展段地址记录,这部分都是零。 02是记录类型,也就是扩展段地址记录。 1200 是地址段 EA 是如下计算的结果01h + NOT(02h + 00h + 00h + 02h + 12h + 00h). 当一个扩展段地址被读取时,储存在数据域的扩展段地址被保存,应用到后面的记录,并且保持有效,直到被新的扩展地址所代替。绝对地址的获得是段地址乘以16加上偏移地址。 以下这个例子说明这个过程。 记录地址域获得的地址:                2462 扩展段地址的数据域:                   1200                                   -------- 绝对存储地址:                    00014462   结束文件记录: 一个英特尔HEX文件必须由一个EOF文件来结束。一个结束文件记录一般这样出现: :00000001FF 这里: 00是记录的数据位数. 0000 是数据在存储器中定位的数据的地址.在结束文件中的地址是没有意义和可以忽略的。一个 0000h 的地址是很典型的。 01是记录类型,结束文件记录 FF 由这样计算得出:01h + NOT(00h + 00h + 00h + 01h) 起始线性地址类型记录:  只使用于803386.x86的寻址方面的知识。 起始段地址类型记录: 只适用于8086/800186.

  • 发表了主题帖: 了解一点J-Link驱动下载和JLINK下载Hex程序

    J-LINK驱动下载 1、首先拥有硬件J-Link硬件。 2、安装J-Link驱动程序SEGGER 下载地址如下 https://www.segger.com/downloads/jlink/JLink_Windows_V620h.exe 直接下载就可以了。 如何使用JLINK向STM32烧写程序 1、安装好以后打开J-LINK Flash的图标: 打开软件可能提示建了工程,随便建立一个就可以了。 2、下面进行设置配置,如下如所示: 打开配置界面,点击Options->Project settings 3、进入界面如图所示: 4、点击MCU,进行单片机型号的设置。 5、将JLINK和目标板进行连接。 6、到了这一步,看到MCU的型号是自己设置的了,表示目标板和仿真器已经连接好了。 7、打开需要烧录的HEX文件,加载进工程里面。 8、点击烧写按钮,如图所示: 根据下方提示可以看出烧写成功和失败的结果。  9、如果有需要可以对程序进行加密,防止别人读取程序。 程序加密后,要想修改程序只能先将程序擦除,才能烧写新的程序。 注:JLINK无视加密,对加密的程序可以直接擦除,再烧写。 STLINK对加密的MCU有要想下载程序必须先通过解除加密,才能再烧写。

  • 发表了主题帖: 在CCS上生成.bin .hex .txt文件并烧录到MSP430 使LCD灯亮

    1,在CCS上正确创建工程文件。 新建工程:File-New-CCS Project 2,在main.c文件中编写程序并保存。  1 #include <msp430f169.h>  2 /*  3  * 软件延时  4  */  5 #define CPU_F1 ((double)1000000)  6 #define delay_us1M(x) __delay_cycles((long)(CPU_F1*(double)x/1000000.0))  7 #define delay_ms1M(x) __delay_cycles((long)(CPU_F1*(double)x/1000.0))  8   9 /** 10  * main.c 11  */ 12 int main(void) 13 { 14     unsigned char j,k; 15     WDTCTL = WDTPW + WDTHOLD;//关看门狗 16     P6DIR = 0xff;//设置P4端口为输出端口 17     while(1) 18     { 19         k = 1; 20         for(j=0;j<8;j++)//循环8次,即D1~D8轮流点亮 21         { 22             P6OUT = ~k;//反相输出,低电平点亮LED 23             delay_ms1M(300);//延时 24             k=k<<1;//左移一位 25         } 26     } 27  28 } 3编译程序:Project-Build All 4,配置CCS使其产生.hex可执行文件(用Protues仿真时下载芯片的是.hex文件) Project-Properties-MSP430 Hex Utility  勾选 Enable MSP430 Hex Utility 再 Apply and Close 运用并关闭 5,此时再次去编译程序,会产生.hex文件 结果: **** Build of configuration Debug for project LCD **** "D:\\TI\\ccsv8\\utils\\bin\\gmake" -k -j 4 all -O  gmake[1]: 'LCD.out' is up to date. Building files: "LCD.out" Invoking: MSP430 Hex Utility "D:/TI/ccsv8/tools/compiler/ti-cgt-msp430_18.1.2.LTS/bin/hex430" --memwidth=8 --romwidth=8 -o "LCD.hex""LCD.out"  Translating to Extended Tektronix format... "LCD.out" .text ==> .text "LCD.out" DACDMA ==> DACDMA "LCD.out" PORT2 ==> PORT2 "LCD.out" USART1TX ==> USART1TX "LCD.out" USART1RX ==> USART1RX "LCD.out" PORT1 ==> PORT1 "LCD.out" TIMERA1 ==> TIMERA1 "LCD.out" TIMERA0 ==> TIMERA0 "LCD.out" ADC12 ==> ADC12 "LCD.out" USART0TX ==> USART0TX "LCD.out" USART0RX ==> USART0RX "LCD.out" WDT ==> WDT "LCD.out" COMPARATORA ==> COMPARATORA "LCD.out" TIMERB1 ==> TIMERB1 "LCD.out" TIMERB0 ==> TIMERB0 "LCD.out" NMI ==> NMI "LCD.out" .reset ==> .reset Finished building: "LCD.out" **** Build Finished **** 6,再次对CCS进行配置,将.hex文件转换成.txt文件,具体步骤如下: a、 点击Project ,选择Properties;  b、选择  Build - Steps  c、在Post-build steps中加入下列语句,运用并关闭即可: "${CG_TOOL_HEX}" --ti_txt "${BuildArtifactFileName}" -o "${BuildArtifactFileBaseName}.txt" -order MS -romwidth 16 7,再次编译程序,将产生.txt文件(可能会有编译无效,再进去看看配置的情况,然后在编译。也可以去工程文件夹中看看是否生成.txt文件) 结果: **** Build of configuration Debug for project LCD **** "D:\\TI\\ccsv8\\utils\\bin\\gmake" -k -j 4 all -O  gmake[1]: 'LCD.out' is up to date. Building files: "LCD.out" Invoking: MSP430 Hex Utility "D:/TI/ccsv8/tools/compiler/ti-cgt-msp430_18.1.2.LTS/bin/hex430" --memwidth=8 --romwidth=8 -o "LCD.hex" "LCD.out"  Translating to Extended Tektronix format... "LCD.out" .text ==> .text "LCD.out" DACDMA ==> DACDMA "LCD.out" PORT2 ==> PORT2 "LCD.out" USART1TX ==> USART1TX "LCD.out" USART1RX ==> USART1RX "LCD.out" PORT1 ==> PORT1 "LCD.out" TIMERA1 ==> TIMERA1 "LCD.out" TIMERA0 ==> TIMERA0 "LCD.out" ADC12 ==> ADC12 "LCD.out" USART0TX ==> USART0TX "LCD.out" USART0RX ==> USART0RX "LCD.out" WDT ==> WDT "LCD.out" COMPARATORA ==> COMPARATORA "LCD.out" TIMERB1 ==> TIMERB1 "LCD.out" TIMERB0 ==> TIMERB0 "LCD.out" NMI ==> NMI "LCD.out" .reset ==> .reset Finished building: "LCD.out" "D:/TI/ccsv8/tools/compiler/ti-cgt-msp430_18.1.2.LTS/bin/hex430" --ti_txt "LCD.out" -o "LCD.txt" -order MS -romwidth 16 Translating to TI-TXT format... "LCD.out" .text ==> .text "LCD.out" DACDMA ==> DACDMA "LCD.out" PORT2 ==> PORT2 "LCD.out" USART1TX ==> USART1TX "LCD.out" USART1RX ==> USART1RX "LCD.out" PORT1 ==> PORT1 "LCD.out" TIMERA1 ==> TIMERA1 "LCD.out" TIMERA0 ==> TIMERA0 "LCD.out" ADC12 ==> ADC12 "LCD.out" USART0TX ==> USART0TX "LCD.out" USART0RX ==> USART0RX "LCD.out" WDT ==> WDT "LCD.out" COMPARATORA ==> COMPARATORA "LCD.out" TIMERB1 ==> TIMERB1 "LCD.out" TIMERB0 ==> TIMERB0 "LCD.out" NMI ==> NMI "LCD.out" .reset ==> .reset **** Build Finished ****

  • 2020-08-06
  • 发表了主题帖: MSP430F5438A中断系统实现

    1、MSP430F5438A有三个定时器: TA0、TA1 和 TB0。 2、CCR0单独用一个中断向量,且优先级最高。其他CCR1--CCR5用公用一个中断向量。3 3、中断向量: #define TIMER1_A1_VECTOR    (48 * 2u) /* 0xFFE0 TImer1_A3 CCR1-2, TA1 */     #define TIMER1_A0_VECTOR    (49 * 2u) /* 0xFFE2 TImer1_A3 CCR0 */     #define TIMER0_A1_VECTOR    (53 * 2u) /* 0xFFEA Timer0_A5 CCR1-4, TA0 */     #define TIMER0_A0_VECTOR    (54 * 2u) /* 0xFFEC Timer0_A5 CCR0 */     #define TIMER0_B1_VECTOR    (59 * 2u) /* 0xFFF6 Timer0_B7 CCR1-6, TB */     #define TIMER0_B0_VECTOR    (60 * 2u) /* 0xFFF8 Timer0_B7 CCR0 */     4、编写代码时可参考 中断矢量名称 中断向量 定时器 含义 操作寄存器 TIMER1_A1_VECTOR 0xFFE0 TA1 TA1CCR1-2, TA1IFG 比较匹配通道1和2,溢出中断 TA1CCTL1,TA1CCR1 TA1CCTL2,TA1CCR2 TA1CTL(溢出中断) TIMER1_A0_VECTOR 0xFFE2 TA1 TA1CCR0 比较匹配通道0 TA1CCTL0,TA1CCR0 TIMER0_A1_VECTOR 0xFFEA TA0 TA0CCR1-4, TA0IFG 比较匹配通道1到4 溢出中断 TA0CCTL1,TA0CCR1 TA0CCTL2,TA0CCR2 TA0CCTL3,TA0CCR3 TA0CCTL4,TA0CCR4 TA0CTL(溢出中断) TIMER0_A0_VECTOR 0xFFEC TA0 TA0CCR0 比较匹配通道0 TA0CCTL0,TA0CCR0 TIMER0_B1_VECTOR 0xFFF6 TB TBCCR1-6, TBIFG 比较匹配通道1到6 溢出中断 TIMER0_B0_VECTOR

  • 发表了主题帖: MSP430F5438A的串口

    设置串口,最关键的是波特率的设置,推荐一个网站,很方便地计算波特率, 1 P3SEL |= (BIT4 + BIT5);                      // P3.4,5 = USCI_A0 TXD/RXD 2   UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset** 3   UCA0CTL1 |= UCSSEL_2;                     // CLK = SMCLK 4   UCA0BR0 = 26;                           // 24MHz/57600=26,1,0,1 5   UCA0BR1 = 0;                           // 6   UCA0MCTL = UCBRF_1+UCBRS_0+UCOS16;        // Modulation UCBRSx=0, UCBRFx=0,UCOS16 = 1 7   UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine** 8   UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt #pragma vector=USCI_A0_VECTOR __interrupt void USCI_A0_ISR(void) {   switch(__even_in_range(UCA0IV,4))   {   case 0:break;   case 2:break;   case 4:break;   default:break;   } } 关键就是UCA0IV 寄存器,通过看文档得知,这是 USCI_Ax Interrupt Vector Register,具体功能如下: 00h = No interrupt pending,0是无中断 02h = Interrupt Source: Data received; Interrupt Flag: UCRXIFG; Interrupt Priority: Highest,2是数据接收触发中断 04h = Interrupt Source: Transmit buffer empty; Interrupt Flag: UCTXIFG; Interrupt Priority: Lowest,4是数据发送中断 经常使用的是接收中断,没用过发送中断

  • 发表了主题帖: MSP430F5438 ADC12学习笔记

    1.前言 这几天实践了MSP430的ADC12功能,虽然片内AD功能比较简单但是还学出了点“门道”来,这个“门道”便是MSP430F5438A和MSP430F5438的区别。这里通过一个例子说明片内ADC的使用,首先实现UART和定时器1S溢出的功能,在上述功能的基础上每1S打印一次AD转换结果,转换通道定向到通道11,该通道对应AVCC和AVSS插值的一半,由于AVCC和LDO的输出之间只有一个电感连接,可以理解转换的结果为LDO输出电压的一般,若扩大两倍便是LDO的实际输出结果,在本文所用的开发板LDO输出为3.3V,所有打印的结果越接近3.3V越好。 2.代码实现和输出结果 代码实现 // 时钟默认情况 // FLL时钟      FLL选择 XT1 // 辅助时钟     ACLK选择 XT1          32768Hz // 主系统时钟   MCLK选择 DCOCLKDIV    8000000Hz // 子系统时钟   SMCLK选择 DCOCLKDIV   8000000Hz // TA1选择ACLK,最大计数值为32768,中断频率为1HZ   #include <msp430.h> #include <stdio.h> #include <stdint.h> void clock_config(void); void select_xt1(void); void dco_config(void); void adc12_config(void); void uart_config(void); char second_flag  = 0;                          // 1S标志   int main(void) {     clock_config();                             // 初始化时钟     adc12_config();                             // 初始化ADC12     uart_config();       TA1CCTL0 = CCIE;                            // 使能TA1CCR0,比较匹配中断     TA1CCR0 = 32768;                            // 初始化最大值,发生比较匹配中断频率 32768/32768 = 1Hz     TA1CTL = TASSEL_1 + MC_1 + TACLR;           // 选择ACLK,最大值为CCR0,清除计数值       _EINT();                                    // 初始化全局中断       while(1)     {         if( second_flag )         {             second_flag = 0;                        // 1s时间到               ADC12CTL0 |= ADC12SC;                   // 启动转换             while ( !(ADC12IFG & BIT0) );           // 等待转换完成               // 被转换的通道为通道11 (AVCC-AVSS)/2;             // 此时转换的精度为12位——4096             // AVCC通过一个电感和LDO的输出端连接             // 打印LDO输出电压,保留3位精度             float ldo_voltage = ADC12MEM0  / 4096.0 * 3.3 * 2;             printf("LDO Voltage %.3f\r\n",ldo_voltage);         }     } }   void clock_config(void) {     WDTCTL = WDTPW + WDTHOLD;                   // 停止看门狗     select_xt1();                               // 选择XT1     dco_config();                               // ACLK = XT1 = 32.768K                                                 // MCLK = SMCLK = 8000K }   void select_xt1(void) {     // 启动XT1     P7SEL |= 0x03;                              // P7.0 P7.1 外设功能     UCSCTL6 &= ~(XT1OFF);                       // XT1打开     UCSCTL6 |= XCAP_3;                          // 内部电容     do     {         UCSCTL7 &= ~XT1LFOFFG;                  // 清楚XT1错误标记     }while (UCSCTL7&XT1LFOFFG);                 // 检测XT1错误标记 }   void dco_config(void) {     __bis_SR_register(SCG0);                    // 禁止FLL功能     UCSCTL0 = 0x0000;                           // Set lowest possible DCOx, MODx     UCSCTL1 = DCORSEL_5;                        // DCO最大频率为16MHz     UCSCTL2 = FLLD_1 + 243;                     // 设置DCO频率为8MHz                                                 // MCLK = SMCLK= Fdcoclkdiv = (N+1)X(Ffllrefclk/n)                                                 // N为唯一需要计算的值                                                 // Ffllrefclk FLL参考时钟,默认为XT1                                                 // n取默认值,此时为1                                                 // (243 + 1) * 32768 = 8MHz     __bic_SR_register(SCG0);                    // 使能FLL功能       // 必要延时     __delay_cycles(250000);       // 清楚错误标志位     do     {         UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);                                                 // 清除所有振荡器错误标志位         SFRIFG1 &= ~OFIFG;                      // 清除振荡器错误     }while (SFRIFG1&OFIFG);                     // 等待清楚完成 }   void adc12_config(void) {     // 只有在ADC12ENC复位的情况下才可以操作     // ADC12SHT1X ADC12SHT0X ADC12MSC ADC12REF2_5V ADC12REFON ADC12ON     ADC12CTL0 &= ~ADC12ENC;       // 设置采样保持时间,最大时间周期以提高转换精度     // 注意MSP430F5438没有REF模块,片内基准无效     // 操作ADC12REF2_5V ,ADC12REFON并无意义     ADC12CTL0 = ADC12SHT0_15 + ADC12SHT1_15 + ADC12ON; //    ADC12CTL0 = ADC12SHT0_15 + ADC12SHT1_15 + ADC12ON + //                ADC12REF2_5V + ADC12REFON;     // 采样保持脉冲来自采样定时器     ADC12CTL1 = ADC12SHP;     // 关闭内部内部温度检测以降低功耗,注意或操作否则修改转换精度     ADC12CTL2 |= ADC12TCOFF ;     // 基准电压选择AVCC,并选择11通道——(AVCC-AVSS)/2     ADC12MCTL0 = ADC12SREF_0 + ADC12INCH_11;       __delay_cycles(75);     // ADC12使能     ADC12CTL0 |= ADC12ENC; }   void uart_config(void) {     P3SEL = 0x30;                               // 选择P3.4和P3.5的复用功能       UCA0CTL1 |= UCSWRST;                        // 软件复位     UCA0CTL1 |= UCSSEL_1;                       // 选择ACLK时钟     UCA0BR0 = 3;                                // 查表获得     UCA0BR1 = 0;                                // UCA0BRX和UCA0MCTL数值     UCA0MCTL |= UCBRS_3 + UCBRF_0;              //     UCA0CTL1 &= ~UCSWRST;                       //       UCA0IE |= UCRXIE;                           // 使能接收中断 }   int putchar(int ch) {     UCA0TXBUF = ch;     while(!(UCA0IFG & UCTXIFG));     return ch; }   #pragma vector=TIMER1_A0_VECTOR __interrupt void TIMER1_A0_ISR(void) {     second_flag = 1; } 图1 参考电压AVCC(3.3V) 3.一些注意点 3.1 提高采样时间 如果条件允许,可以尽可能的提高采样时间,这样转换结果可以更稳定一些。 3.2 MSP430F5438没有REF模块 现在(2013年10月)可以在TI官网上下载得到的示例代码或数据手册参考手册等,都是围绕MSP430F5438A的。但是市面上很多MCU还是MSP430F5438,其实MSP430F5438A和MSP4305438是有区别的,MSP430F5438没有REF模块,所以使用片内的2.5参考电源还是有些不稳定的因素。可以通过以下的实现测试一下,AD转换的目标依然是LDO输出。 需要修改以下几个部分的代码 第一: ADC12CTL0 = ADC12SHT0_15 + ADC12SHT1_15 + ADC12ON; 修改为 ADC12CTL0 = ADC12SHT0_15 + ADC12SHT1_15 + ADC12ON + ADC12REF2_5V + ADC12REFON; 使用打开片内2.5V参考电源 第二: ADC12MCTL0 = ADC12SREF_0 + ADC12INCH_11;修改为 ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_11; 转换参考电压为Vref,即修改1设置的2.5V参考电源 第三: float ldo_voltage = ADC12MEM0 / 4096.0 * 3.3 * 2;修改为 float ldo_voltage = ADC12MEM0 / 4096.0 * 2.5 * 2; 替换转换公式,参考电压由3.3V变为2.5V 输出结果如下,结果发现LDO的输出电压为3.4V,比实际电压高0.1V。 图2 参考电压VREF(2.5V) 图3 MSP430参考手册说明

  • 发表了主题帖: 关于MSP430F5438A升级失败

    项目过程遇到一个棘手问题:升级成功后,再次升级时,快升级结束时(APP程序一共123包,每次都是死在120、121包)程序跑飞。经过单步跟踪,发现跑到0x0000,然后往下执行到0x0004,进入死循环。 想到在MSP430F5438A无线升级中遇到的同样问题,开始找中断的原因。找了一遍,发现所有中断都写了中断服务程序,并且对APP中的中断都做了重映射。 然后通过打断点运行,发现问题跟断点位置也有关系。而且更奇怪的是:偶尔BSL程序复位,而不是跳到0x0000。在网上搜索相关问题,有说是时序的问题,有说是内存异常问题。 根据之前遇到的中断的问题,主要在中断和时序上寻找问题原因。想到APP程序跳转到BSL时,没有对APP程序中的中断进行屏蔽。跳转之前,屏蔽APP程序中的中断之后,无线升级运行正常。问题解决。 之后琢磨,是不是BSL做升级时,APP里的中断得到响应,然后BSL程序做了中断向量重映射,最终跳到重映射地址。由于APP的中断向量表放在存储APP程序末尾的flash中。而120、121包正好需要擦除存放APP中断向量表的flash。擦除后的数据为0x0000。因此经常跳到0x000地址,导致升级失败。

最近访客

< 1/3 >

统计信息

已有24人来访过

  • 芯币:289
  • 好友:--
  • 主题:355
  • 回复:16
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言