【MSP430单片机】MSP430G2553程序,MSP430G2553单片机教程,MSP430G2553实战演练

article/2025/10/25 21:50:05

文章目录

  • 开发环境
  • 板子介绍
  • 官网示例代码下载
  • MSP430普通IO口控制
  • IO口外部中断
  • MSP430时钟系统
  • MSP430不精确延时之delay_ms
  • MSP430定时器_CCR0溢出中断
  • MSP430定时器_定时器计数溢出中断
  • MSP430定时器_PWM波形产生
  • MSP430串口_收发
    • 9600波特率
    • 115200 波特率
  • MSP430ADC
  • MSP430 Flash读写

开发环境

CCS软件下载:https://www.ti.com/tool/download/CCSTUDIO
建议别搞太高版本。
在这里插入图片描述

板子介绍

P1.0 接了LED 输出低电平点亮小灯
P1.6 接了LED
P1.3 接了KEY 按键按下是低电平
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

官网示例代码下载

https://www.ti.com.cn/product/cn/MSP430G2553#software-development
在这里插入图片描述

MSP430普通IO口控制

使用按键控制灯。学习常用的IO口寄存器。

//******************************************************************************
//  MSP430G2xx3 Demo - Software Poll P1.4, Set P1.0 if P1.4 = 1
//
//  Description: Poll P1.4 in a loop, if hi P1.0 is set, if low, P1.0 reset.
//  ACLK = n/a, MCLK = SMCLK = default DCO
//
//               MSP430G2xx3
//            -----------------
//        /|\|              XIN|-
//         | |                 |
//         --|RST          XOUT|-
//     /|\   |                 |
//      --o--|P1.3         P1.0|-->LED
//     \|/
//
//  D. Dang
//  Texas Instruments, Inc
//  December 2010
//   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************
#include <msp430.h>int main(void)
{WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timerP1DIR |= BIT0;                            // Set P1.0 to output directionP1DIR &= ~BIT3;                            //输入P1REN |= BIT3;                            //上拉下拉使能P1OUT |= BIT3;                            //上拉while (1)                                 // Test P1.4{if ((BIT3 & P1IN) == 0) // 按键按下P1OUT |= BIT0;elseP1OUT &= ~BIT0;}
}

WDTCTL = WDTPW + WDTHOLD;
这一行代码停止了看门狗定时器(Watchdog Timer),以防止系统复位。WDTCTL是一个特殊寄存器,用于配置和控制看门狗定时器。通过将WDTPW和WDTHOLD的值相加,可以将看门狗定时器设置为停止状态。

P1DIR |= BIT0;
这一行代码将P1.0引脚的方向设置为输出。P1DIR是P1端口的方向寄存器,BIT0是一个宏定义,表示二进制数1。使用按位或操作符(|=)可以将P1DIR寄存器的BIT0位置1,将P1.0设置为输出方向。

在循环中,程序通过检查P1.3引脚的输入状态来控制P1.0引脚的输出状态。如果P1.3引脚的输入为低电平(按键按下),则将P1.0引脚设置为高电平。如果P1.3引脚的输入为高电平(按键未按下),则将P1.0引脚设置为低电平。

IO口外部中断

IO口外部中断是一种特殊的中断,它允许外部事件触发微控制器的中断服务程序。它的存在有以下几个意义和用途:

事件检测和响应:外部中断可以用于检测和响应外部事件,例如按键按下、传感器状态变化、信号边沿等。当外部事件发生时,触发外部中断,微控制器可以立即中断当前任务,执行与事件相关的中断服务程序,从而及时响应外部事件。

节省处理器资源:通过使用外部中断,可以节省处理器资源。相比于不断地轮询输入状态,使用外部中断可以在外部事件发生时立即中断处理,避免了处理器不断轮询的浪费。这样,处理器可以继续执行其他任务,而无需关注外部事件,只有在事件发生时才会中断处理。

实时性和精确性:外部中断的响应速度很快,可以实现实时性要求高的应用。它可以在微秒级别的时间内检测到外部事件,并立即中断处理。这对于需要高精度和及时响应的应用非常重要,如控制系统、测量和采样系统等。

多任务处理:外部中断允许多任务处理。通过将不同的外部事件分配给不同的中断服务程序,可以同时处理多个任务。这样,可以在同一个微控制器上实现多个功能模块的并行处理,提高系统的效率和灵活性。

WDTCTL = WDTPW + WDTHOLD;:停止看门狗定时器。MSP430微控制器通常配备了一个看门狗定时器,用于在程序执行期间检测和防止系统锁死。
P1DIR |= BIT0;:将P1.0引脚设置为输出方向。这意味着P1.0被配置为输出引脚,可以控制外部设备。
P1IE |= BIT3;:启用P1.3引脚的中断功能。当发生与P1.3引脚相关的中断时,将触发相应的中断服务程序。
P1IES |= BIT3;:配置P1.3引脚的中断触发边沿。在本例中,配置为高电平到低电平的触发边沿。
P1REN |= BIT3;:启用P1.3引脚的上拉电阻。这意味着P1.3引脚与上拉电阻连接,可以检测外部连接的开关状态。
P1IFG &= ~BIT3;:清除P1.3引脚的中断标志位。确保在进入中断服务程序之前,将中断标志位重置为未触发状态。
__bis_SR_register(LPM4_bits + GIE);:将微控制器设置为低功耗模式4(LPM4),并启用全局中断(GIE)。进入低功耗模式后,微控制器将等待中断事件的发生。

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1OUT ^= BIT0; // P1.0 = toggle
P1IFG &= ~BIT3; // P1.3 IFG cleared
}
这是一个中断服务程序,是固有写法,其中PORT1_VECTOR是中断向量入口,Port_1是中断函数名称。

#include <msp430.h>int main(void)
{WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timerP1DIR |= BIT0;                            // Set P1.0 to output directionP1IE |= BIT3;                            // P1.3 interrupt enabledP1IES |= BIT3;                            // P1.3 Hi/lo edgeP1REN |= BIT3;							// Enable Pull Up on SW2 (P1.3)P1IFG &= ~BIT3;                           // P1.3 IFG cleared//BIT3 on Port 1 can be used as Switch2__bis_SR_register(LPM4_bits + GIE);       // Enter LPM4 w/interrupt
}#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{P1OUT ^= BIT0;                            // P1.0 = toggleP1IFG &= ~BIT3;                           // P1.3 IFG cleared
}

MSP430时钟系统

基本时钟模块+支持低系统成本和超低功耗。使用三个内部时钟信号,用户可以选择性能和低功耗之间的最佳平衡。基本时钟模块+可以在完全软件控制下配置为不需要任何外部元件、一个外部电阻、一个或两个外部晶体,或者谐振器进行操作。

基本时钟模块+包括两个、三个或四个时钟源:
• LFXT1CLK:低频/高频振荡器,可与低频手表晶体或外部时钟源(32768 Hz)或标准晶体、谐振器或外部时钟源(400 kHz至16 MHz范围内)一起使用。
• XT2CLK:可选的高频振荡器,可与标准晶体、谐振器或外部时钟源(400 kHz至16 MHz范围内)一起使用。
• DCOCLK:内部数字控制振荡器(DCO)。
• VLOCLK:内部超低功耗低频振荡器,典型频率为12 kHz。

基本时钟模块+提供三个时钟信号:
• ACLK:辅助时钟。ACLK可在软件中选择LFXT1CLK或VLOCLK。ACLK可被1、2、4或8分频。ACLK可针对各个外设模块进行软件选择。
• MCLK:主时钟。MCLK可在软件中选择LFXT1CLK、VLOCLK、XT2CLK(如果芯片上可用)或DCOCLK。MCLK可被1、2、4或8分频。MCLK由CPU和系统使用。
• SMCLK:子主时钟。SMCLK可在软件中选择LFXT1CLK、VLOCLK、XT2CLK(如果芯片上可用)或DCOCLK。SMCLK可被1、2、4或8分频。SMCLK可针对各个外设模块进行软件选择。

在这里插入图片描述

在这里插入图片描述

该代码的作用是配置 MSP430G2xx3 微控制器的时钟信号输出,其中 P1.0 引脚输出 ACLK 时钟信号,P1.4 引脚输出 SMCLK 时钟信号,P1.1 引脚输出 MCLK/10 时钟信号。在无限循环中,不断地在 P1.1 引脚上输出高电平和低电平信号,形成一个方波输出,模拟了MCLK时钟快慢。

//******************************************************************************
//  MSP430G2xx3 Demo - Basic Clock, Output Buffered SMCLK, ACLK and MCLK/10
//
//  Description: Buffer ACLK on P1.0, default SMCLK(DCO) on P1.4 and MCLK/10 on
//  P1.1.
//  ACLK = LFXT1 = 32768, MCLK = SMCLK = default DCO
//  //* External watch crystal installed on XIN XOUT is required for ACLK *//	
//
//               MSP430G2xx3
//             -----------------
//         /|\|              XIN|-
//          | |                 | 32kHz
//          --|RST          XOUT|-
//            |                 |
//            |       P1.4/SMCLK|-->SMCLK = Default DCO
//            |             P1.1|-->MCLK/10 = DCO/10
//            |        P1.0/ACLK|-->ACLK = 32kHz
//
//  D. Dang
//  Texas Instruments Inc.
//  December 2010
//   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************#include <msp430.h>int main(void)
{WDTCTL = WDTPW +WDTHOLD;                  // Stop Watchdog Timer//1Mhzif (CALBC1_1MHZ==0xFF)					// If calibration constant erased{											while(1);                               // do not load, trap CPU!!	} DCOCTL = 0;                               // Select lowest DCOx and MODx settingsBCSCTL1 = CALBC1_1MHZ;                    // Set rangeDCOCTL = CALDCO_1MHZ;                     // Set DCO step + modulation *//* //8Mhzif (CALBC1_8MHZ==0xFF)					// If calibration constant erased{											while(1);                               // do not load, trap CPU!!	}DCOCTL = 0;                               // Select lowest DCOx and MODx settingsBCSCTL1 = CALBC1_8MHZ;                    // Set rangeDCOCTL = CALDCO_8MHZ;                     // Set DCO step + modulation *//* //12Mhzif (CALBC1_12MHZ==0xFF)					// If calibration constant erased{											while(1);                               // do not load, trap CPU!!	}DCOCTL = 0;                               // Select lowest DCOx and MODx settingsBCSCTL1 = CALBC1_12MHZ;                   // Set rangeDCOCTL = CALDCO_12MHZ;                    // Set DCO step + modulation*//* //16Mhzif (CALBC1_16MHZ==0xFF)					// If calibration constant erased{											while(1);                               // do not load, trap CPU!!	}DCOCTL = 0;                               // Select lowest DCOx and MODx settingsBCSCTL1 = CALBC1_16MHZ;                   // Set rangeDCOCTL = CALDCO_16MHZ;                    // Set DCO step + modulation*/P1DIR |= 0x13;                            // P1.0,1 and P1.4 outputsP1SEL |= 0x11;                            // P1.0,4 ACLK, SMCLK outputwhile(1){P1OUT |= 0x02;    	                    // P1.1 = 1P1OUT &= ~0x02;                         // P1.1 = 0}
}

MSP430不精确延时之delay_ms

__delay_cycles是编译器内置的空指令运算,通过宏定义包装,成为不精确延时之delay_ms。

#include <msp430.h>#define CPU_F ( (double) 16000000)
#define delay_us( x )   __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x )   __delay_cycles( (long) (CPU_F * (double) x / 1000.0) )int main(void)
{WDTCTL = WDTPW + WDTHOLD;                  // Stop Watchdog Timer//16Mhzif (CALBC1_16MHZ == 0xFF)				// If calibration constant erased{while (1);                               // do not load, trap CPU!!}DCOCTL = 0;                          // Select lowest DCOx and MODx settingsBCSCTL1 = CALBC1_16MHZ;                   // Set rangeDCOCTL = CALDCO_16MHZ;                    // Set DCO step + modulationP1DIR |= BIT0;while (1){P1OUT ^= BIT0;                    //亦或计算delay_ms(100);}
}

MSP430定时器_CCR0溢出中断

下面的设置是50ms的中断。

SMCLK是1MHZ,此时CCR0 = 50000,定时器计数到CCR0 即是等于50ms。

#include <msp430.h>int main(void)
{WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT//1Mhzif (CALBC1_1MHZ == 0xFF)                   // If calibration constant erased{while (1);                               // do not load, trap CPU!!}DCOCTL = 0;                          // Select lowest DCOx and MODx settingsBCSCTL1 = CALBC1_1MHZ;                    // Set rangeDCOCTL = CALDCO_1MHZ;                     // Set DCO step + modulation */P1DIR |= 0x01;                            // P1.0 outputCCTL0 = CCIE;                             // CCR0 interrupt enabledCCR0 = 50000;TACTL = TASSEL_2 + MC_1;                  // SMCLK, Up to CCR0__bis_SR_register(LPM0_bits + GIE);       // Enter LPM0 w/ interrupt
}// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A(void)
{P1OUT ^= BIT0;                            // Toggle P1.0
}

下面是四种计数模式,我们刚才的选择是让其计数到CCR0就 产生溢出中断。

在这里插入图片描述

MSP430定时器_定时器计数溢出中断

定时器计数溢出中断的中断向量是TIMER0_A1_VECTOR,这个中断向量入口也是CCR1 、CCR2 溢出的入口,在内部依靠TA0IV 寄存器判断具体的中断来源。

#include <msp430.h>int main(void)
{WDTCTL = WDTPW + WDTHOLD;                 // Stop WDTP1DIR |= 0x01;                            // P1.0 outputTACTL = TASSEL_2 + MC_2 + TAIE;           // SMCLK, contmode, interrupt__bis_SR_register(LPM0_bits + GIE);       // Enter LPM0 w/ interrupt
}// Timer_A3 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{switch( TA0IV ){case  2: break;                          // CCR1 not usedcase  4: break;                          // CCR2 not usedcase 10: P1OUT ^= 0x01;                  // overflowbreak;}
}

针对于CCR1之类的溢出也是不常用的,下面的代码看看就好。

#include <msp430.h>int main(void)
{WDTCTL = WDTPW + WDTHOLD;                 // Stop WDTP1SEL |= 0x06;                            // P1.1 - P1.2 option selectP1DIR |= 0x07;                            // P1.0 - P1.2 outputsCCTL0 = OUTMOD_4 + CCIE;                  // CCR0 toggle, interrupt enabledCCTL1 = OUTMOD_4 + CCIE;                  // CCR1 toggle, interrupt enabledTACTL = TASSEL_2 +  MC_2 + TAIE;          // SMCLK, Contmode, int enabled__bis_SR_register(LPM0_bits + GIE);       // Enter LPM0 w/ interrupt
}// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{CCR0 += 200;                              // Add Offset to CCR0
}// Timer_A2 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A1(void)
{switch( TA0IV ){case  2: CCR1 += 1000;                    // Add Offset to CCR1break;case 10: P1OUT ^= 0x01;                   // Timer_A3 overflowbreak;}
}

MSP430定时器_PWM波形产生

PWM(Pulse Width Modulation,脉宽调制)波形在电子和控制系统中有着广泛的应用,它具有以下几个重要的作用:

模拟信号生成:PWM波形可以通过调整脉冲的占空比来模拟产生连续的模拟信号。通过改变脉冲的宽度(占空比),可以实现不同的平均电平值,从而生成与输入信号强度或控制信号相关的模拟输出。这使得PWM成为模拟电压和模拟电流控制的一种常见技术。

电机控制:PWM广泛应用于电机驱动和速度控制中。通过在电机绕组上施加PWM波形,可以控制电机的转速和扭矩。通过调整脉冲的占空比,可以改变电机驱动电压的平均值,从而控制电机的转速。

LED亮度控制:PWM被广泛用于LED亮度调节。通过改变PWM波形的占空比,可以控制LED的亮度。当PWM波形的占空比较大时,LED处于高亮度状态;当占空比较小时,LED处于低亮度状态。通过快速调整PWM波形的占空比,可以实现灯光的平滑过渡和精确亮度控制。

电源管理:PWM被用于电源管理和节能控制中。通过在开关电源中采用PWM控制,可以调整开关管的通断时间,从而调节输出电压或电流。这种方式可以提高电源的效率和稳定性,并减少功耗。

数字信号传输:PWM波形还可以用作数字信号传输的一种方式。在某些应用中,可以使用PWM波形来编码和传输数字信息。通过改变脉冲的频率或占空比,可以表示不同的数字值,从而实现简单的数字通信。

下面是MSP430的PMW输出模式:

在这里插入图片描述

下面的代码是让P1.2输出50%占空比的1kHZ波形。


//           |         P1.2/TA1|--> CCR1 - 50% PWM#include <msp430.h>int main(void)
{WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT//1Mhzif (CALBC1_1MHZ == 0xFF)                   // If calibration constant erased{while (1);                               // do not load, trap CPU!!}DCOCTL = 0;                          // Select lowest DCOx and MODx settingsBCSCTL1 = CALBC1_1MHZ;                    // Set rangeDCOCTL = CALDCO_1MHZ;                     // Set DCO step + modulation */P1DIR |= BIT2;P1SEL |= BIT2;CCR0 = 1000;                               // PWM Period/2CCTL1 = OUTMOD_7;                         // CCR1 toggle/setCCR1 = 500;                                // CCR1 PWM duty cycleTACTL = TASSEL_2 + MC_3;                  // SMCLK, up-down mode__bis_SR_register(LPM0_bits);             // Enter LPM0
}

MSP430串口_收发

9600波特率

//   MSP430G2xx3 Demo - USCI_A0, 9600 UART Echo ISR, DCO SMCLK
//
//   Description: Echo a received character, RX ISR used. Normal mode is LPM0.
//   USCI_A0 RX interrupt triggers TX Echo.
//   Baud rate divider with 1MHz = 1MHz/9600 = ~104.2
//   ACLK = n/a, MCLK = SMCLK = CALxxx_1MHZ = 1MHz
//
//                MSP430G2xx3
//             -----------------
//         /|\|              XIN|-
//          | |                 |
//          --|RST          XOUT|-
//            |                 |
//            |     P1.2/UCA0TXD|------------>
//            |                 | 9600 - 8N1
//            |     P1.1/UCA0RXD|<------------
//
//   D. Dang
//   Texas Instruments Inc.
//   February 2011
//   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************
#include <msp430.h>void Send_Byte(char data)
{while (!(IFG2 & UCA0TXIFG));                // USCI_A0 TX buffer ready?UCA0TXBUF = data;                    // TX -> RXed character
}void Print_Str(char *s)
{while (*s != '\0'){Send_Byte(*s++);}
}int main(void)
{WDTCTL = WDTPW + WDTHOLD;                 // Stop WDTif (CALBC1_1MHZ == 0xFF)				// If calibration constant erased{while (1);                               // do not load, trap CPU!!	}DCOCTL = 0;                          // Select lowest DCOx and MODx settingsBCSCTL1 = CALBC1_1MHZ;                    // Set DCODCOCTL = CALDCO_1MHZ;P1SEL = BIT1 + BIT2;                     // P1.1 = RXD, P1.2=TXDP1SEL2 = BIT1 + BIT2;                    // P1.1 = RXD, P1.2=TXDUCA0CTL1 |= UCSSEL_2;                     // SMCLKUCA0BR0 = 104;                            // 1MHz 9600UCA0BR1 = 0;                              // 1MHz 9600UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1UCA0CTL1 &= ~UCSWRST;                   // **Initialize USCI state machine**IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt__bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
}//  Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{while (!(IFG2 & UCA0TXIFG));                // USCI_A0 TX buffer ready?UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
}

115200 波特率

//   MSP430G2xx3 Demo - USCI_A0, 115200 UART Echo ISR, DCO SMCLK
//
//   Description: Echo a received character, RX ISR used. Normal mode is LPM0.
//   USCI_A0 RX interrupt triggers TX Echo.
//   Baud rate divider with 1MHz = 1MHz/115200 = ~8.7
//   ACLK = n/a, MCLK = SMCLK = CALxxx_1MHZ = 1MHz
//
//                MSP430G2xx3
//             -----------------
//         /|\|              XIN|-
//          | |                 |
//          --|RST          XOUT|-
//            |                 |
//            |     P1.2/UCA0TXD|------------>
//            |                 | 115200 - 8N1
//            |     P1.1/UCA0RXD|<------------
//
//   D. Dang
//   Texas Instruments Inc.
//   February 2011
//   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************
#include <msp430.h>void Send_Byte(char data)
{while (!(IFG2 & UCA0TXIFG));                // USCI_A0 TX buffer ready?UCA0TXBUF = data;                    // TX -> RXed character
}void Print_Str(char *s)
{while (*s != '\0'){Send_Byte(*s++);}
}int main(void)
{WDTCTL = WDTPW + WDTHOLD;                 // Stop WDTif (CALBC1_1MHZ==0xFF)					// If calibration constant erased{											while(1);                               // do not load, trap CPU!!	}DCOCTL = 0;                               // Select lowest DCOx and MODx settingsBCSCTL1 = CALBC1_1MHZ;                    // Set DCODCOCTL = CALDCO_1MHZ;P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXDP1SEL2 = BIT1 + BIT2;                      UCA0CTL1 |= UCSSEL_2;                     // SMCLKUCA0BR0 = 8;                              // 1MHz 115200UCA0BR1 = 0;                              // 1MHz 115200UCA0MCTL = UCBRS2 + UCBRS0;               // Modulation UCBRSx = 5UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt__bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
}// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
}

MSP430ADC

下面是ADC单通道转换代码。多通道较为复杂,这里不叙述。

#include <msp430.h>#define CPU_F ( (double) 1000000)
#define delay_us( x )	__delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x )	__delay_cycles( (long) (CPU_F * (double) x / 1000.0) )unsigned int volt;
int main(void)
{WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */ADC10CTL0 = ADC10SHT_2 + ADC10ON ; // ADC10ON, interrupt enabledADC10CTL1 = INCH_4;                       // input A4ADC10AE0 |= BIT4;                         // PA.4 ADC option selectwhile (1){ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion startwhile ((ADC10IFG & ADC10CTL0)==0);                   //MEM5触发IFG5  意味着有了新的转换结果volt = ADC10MEM;volt=volt*3.3*100/1024;delay_ms(100);}
}

MSP430 Flash读写

#include <msp430.h>char  value;                                // 8-bit value to write to segment A// Function prototypes
void write_SegC (char value);
void copy_C2D (void);int main(void)
{WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timerif (CALBC1_1MHZ==0xFF)					// If calibration constant erased{											while(1);                               // do not load, trap CPU!!	}DCOCTL = 0;                               // Select lowest DCOx and MODx settingsBCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1MHzDCOCTL = CALDCO_1MHZ;FCTL2 = FWKEY + FSSEL0 + FN1;             // MCLK/3 for Flash Timing Generatorvalue = 0;                                // initialize valuewhile(1)                                  // Repeat forever{write_SegC(value++);                    // Write segment C, increment valuecopy_C2D();                             // Copy segment C to D__no_operation();                       // SET BREAKPOINT HERE}
}void write_SegC (char value)
{char *Flash_ptr;                          // Flash pointerunsigned int i;Flash_ptr = (char *) 0x1040;              // Initialize Flash pointerFCTL1 = FWKEY + ERASE;                    // Set Erase bitFCTL3 = FWKEY;                            // Clear Lock bit*Flash_ptr = 0;                           // Dummy write to erase Flash segmentFCTL1 = FWKEY + WRT;                      // Set WRT bit for write operationfor (i=0; i<64; i++){*Flash_ptr++ = value;                   // Write value to flash}FCTL1 = FWKEY;                            // Clear WRT bitFCTL3 = FWKEY + LOCK;                     // Set LOCK bit
}void copy_C2D (void)
{char *Flash_ptrC;                         // Segment C pointerchar *Flash_ptrD;                         // Segment D pointerunsigned int i;Flash_ptrC = (char *) 0x1040;             // Initialize Flash segment C pointerFlash_ptrD = (char *) 0x1000;             // Initialize Flash segment D pointerFCTL1 = FWKEY + ERASE;                    // Set Erase bitFCTL3 = FWKEY;                            // Clear Lock bit*Flash_ptrD = 0;                          // Dummy write to erase Flash segment DFCTL1 = FWKEY + WRT;                      // Set WRT bit for write operationfor (i=0; i<64; i++){*Flash_ptrD++ = *Flash_ptrC++;          // copy value segment C to segment D}FCTL1 = FWKEY;                            // Clear WRT bitFCTL3 = FWKEY + LOCK;                     // Set LOCK bit
}

PS: 有代码需要做可以私信。


http://chatgpt.dhexx.cn/article/sWlI2ZGv.shtml

相关文章

LPC4357JET256/LPC4337FET256/LPC4337JET256 32位MCU 204MHz 1MB

【详情】LPC4300系列微控制器(MCU)拥有全世界首款非对称双核数字信号控制器体系结构&#xff0c;配有ARM Cortex-M4和Cortex-M0处理器。这些NXP Cortex-M4 MCU配有Cortex-M0协处理器&#xff0c;优势在于&#xff0c;可在单一体系结构、开发环境中&#xff0c;开发数字信号处理…

STM32MP157驱动开发——Linux I2C驱动

相关文章&#xff1a;正点原子教程第四十章——Linux I2C驱动实验 0.前言 为了简化笔记的编写以及降低工作量&#xff0c;本节开始相关的基础知识部分通过引入原子哥的教材链接来完成&#xff0c;有兴趣的可以进入学习。   上一节学完 RGB LCD 本来想直接学习 RGB 转 HDMI 实…

SPI转can芯片mcp2515

开发环境 CPU&#xff1a;RK3399 ARCH: aarch64 KERNEL&#xff1a;Linux4.4 OS&#xff1a;ubuntu18.04 mcp2515芯片相关信息 CAN、SPI接口控制电路图 修改设备树文件 文件路径&#xff1a;kernel/arm64/boot/dts/rockchip/rk3399.dts 增加spi节点&#xff0c;具体增加那…

MSP432 TFTLCD ILI9481 软件SPI

下面是我用的LCD屏的图片 CS : PF1 RS : PF2 RST: PF3 MOSI: PL4 SCK: PL5 代码&#xff1a; SPI.h #ifndef _SPI_…

MPC5744P-SPI

1.结构 5744的SPI模块支持全双工三线同步传输&#xff0c;可运行在主机或从机模式&#xff0c;分别含有深度为5的FIFO发送和接收缓存区。其结构如下图。SPI配置允许模块发送和接收串行数据&#xff0c;同时也支持带FIFO缓存区的的进行扩展队列操作的数据传输。模块接收和发送的…

SPI协议、MCP2515裸机驱动详解----主流SPI总线接口原理

最近看到一个介绍SPI接口原理的帖子&#xff0c;看完觉得甚好。特来分析给大家一起学习。 SPI概述 Serial Peripheral interface 通用串行外围设备接口 是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM&#xff0c;FLASH&#xff0c;实时时钟&#…

MP2451 使能脚电阻判断

MP2451使能脚(EN)内部接一个稳压管&#xff0c;防止EN所接电压过大。 EN输入的电压范围&#xff1a;从PDF文档中找到EN的开启电压和最高电压。 Enable up Threshold 1.4-1.7 因为计算时需要考虑其极端现象&#xff0c;所以开启电压的临界电压选择最高&#xff0c;1.7v。最高…

CSM3416SF兼容MP2451,MCP16301HT-E,LT1933ES6,AOZ1282CI

CSM3416SF是一颗高耐压DC-DC降压芯片&#xff0c;宽电压范围输入&#xff0c;完美兼容MP2451,MCP16301HT-E,LT1933ES6,AOZ1282CI&#xff0c;助力智能电表市场&#xff0c;赋能车库门驱动系统。

S32K144开发笔记5 - SPI驱动MCP2515

1、接线图 PTB13 — INT 接收数据中断引脚 PTB14 — CLK 时钟 PTB15 — MISO 接收 PTB16 — MOSI 发送 PTB17 — CSN 片选 2、软件SPI 2.1、GPIO口配置 鼠标放在如下位置右击选择Pin Functional Properities&#xff0c;进入引脚属性配置 PTB13引脚配置如下&#xff1a; PT…

nRF52笔记(26)QSPI接口液晶显示屏

1 平台条件 硬件&#xff1a;nrf52840 软件&#xff1a;sdk17.0 2 QSPI概述 QSPI 外设支持使用 SPI 与外部闪存设备进行通信 此处列出了 QSPI 外设的主要特性&#xff1a; • 单/双/四通道 SPI 输入/输出 • 2–32 MHz 可配置时钟频率 • 从/到外部闪存的单字读/写访问 • …

MPC5744-LINFlexD

目录 一、基本介绍1.功能2.时钟源3.外设控制器4.中断向量5.基地址 二、寄存器介绍1.LIN控制寄存器1 LINFlexD_LINCR12.LIN中断使能寄存器LINFlexD_LINIER3.LIN状态寄存器LINFlexD_LINSR4.LIN错误状态寄存器LINFlexD_LINESR5.UART控制寄存器LINFlexD_UARTCR6.UART状态寄存器LINF…

MP2456的芯片的学习

本章将讲述MP2456的特征、性能、参数、应用电路、以及使用时的注意事项。小白总结&#xff0c;如有错误&#xff0c;请大神指教。 目录 一、MP2456的特征 二、MP2456的性能和参数 四、MP2456使用时的注意事项 五、名词解释 一、MP2456的特征 &#xff08;1&#xff09;MP…

硬件电路-MP2451组成的电压反转/极性反转电路设计

板上要集成一个18V供电的模拟信号处理电路&#xff0c;包括线圈驱动、小信号拾取、滤波、二级放大等部分。因此&#xff0c;需要板上提供18V电源。正负电压需要分开控制&#xff0c;因为正电压需要兼作485传感器供电&#xff0c;此时关闭负电压部分节省耗电以及保护模拟端。 b…

MP2451的应用电路

电阻R32和电阻R23是怎么实现的电压&#xff0c;FB口的输出是0.8V。 正确的计算应该是&#xff1a; 0.8/10*(1027)这样就是输出的电压。 SS14是大电流二极管&#xff0c;可以用5819完全替代。还有续流二极管。 SS14是40V的耐压&#xff0c;SS12是20V的耐压。 8050可以替代BC8…

MP2451问题记录

数据手册 https://pan.baidu.com/s/1ggJs0y3 MP2451应用电路如下图 在我自己的应用电路中R1120K&#xff0c;R224k 问题一、 电源输出0.42V V(FB)手册中应等于0.8V&#xff0c;但在测试中发现该引脚电压仅为0.07V 0.07 * (12024) / 24 0.42V 判断是芯片损坏 问题二、FB引脚输…

MP2451的BUCK电路

5V的稳压模块经常会用得到&#xff0c;普通的AMS1117-5.0虽然电压输出非常稳定&#xff0c;但是只适合低压降&#xff0c;小电流的场合。笔者曾经用AMS1117-5.0把8.4V稳压到5V,电流160mA&#xff08;8.4V端&#xff09;&#xff0c;芯片一会儿就非常烫手了&#xff0c;即使并联…

MP2451使用注意事项

MP2451使用注意事项 MP2451是一个高速2M的高效的降压芯片&#xff0c;提供0.6A的电流输出&#xff0c;输入电压范围3.3V-36V可调&#xff0c;有关闭芯片引脚&#xff0c;关闭电流3uA&#xff0c;用起来还不错&#xff0c;分享一下经验&#xff0c;如下原理图已经制成了板子&am…

类间关系和内部类和数组

Final关键词 定义Pepole类&#xff0c;运用了final修饰方法eat()&#xff0c;该方法不能被改写&#xff0c;但可以随类进行继承。 用final修饰的类&#xff0c;不能有子类。 内部成员类定义方式 外部类.成员类 对象名 new 外部类&#xff08;&#xff09;.new 内部类。 局部…

UML六种关系图示(过目不忘版)

图中&#xff0c;从左到右分别是依赖、关联、聚合、组合、实现、继承六种关系在UML图中的画法&#xff0c;有箭头&#xff0c;有菱形&#xff0c;有三角&#xff0c;他们为什么这么画呢&#xff0c;之间有什么联系呢&#xff0c;这要从全局来看。 首先&#xff0c;依赖关联关系…

类图有哪些关系?

此刻是最佳时间&#xff0c;抓住当下&#xff01;最近在学习设计模式的时候&#xff0c;时常要用到类图及它们的关联&#xff0c;所以学习了UML类图及类图之间的关系&#xff0c;转载记录一下。 首先我们需要知道什么是类图。 类图&#xff08;ClassDiagram&#xff09;是UML图…