開發(fā)環(huán)境
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 timer
P1DIR |= BIT0; // Set P1.0 to output direction
P1DIR &= ~BIT3; //輸入
P1REN |= BIT3; //上拉下拉使能
P1OUT |= BIT3; //上拉
while (1) // Test P1.4
{
if ((BIT3 & P1IN) == 0) // 按鍵按下
P1OUT |= BIT0;
else
P1OUT &= ~BIT0;
}
}
WDTCTL = WDTPW + WDTHOLD;
這一行代碼停止了看門狗定時器(Watchdog Timer),以防止系統(tǒng)復位。WDTCTL是一個特殊寄存器,用于配置和控制看門狗定時器。通過將WDTPW和WDTHOLD的值相加,可以將看門狗定時器設置為停止狀態(tài)。
P1DIR |= BIT0;
這一行代碼將P1.0引腳的方向設置為輸出。P1DIR是P1端口的方向寄存器,BIT0是一個宏定義,表示二進制數1。使用按位或操作符(|=)可以將P1DIR寄存器的BIT0位置1,將P1.0設置為輸出方向。
在循環(huán)中,程序通過檢查P1.3引腳的輸入狀態(tài)來控制P1.0引腳的輸出狀態(tài)。如果P1.3引腳的輸入為低電平(按鍵按下),則將P1.0引腳設置為高電平。如果P1.3引腳的輸入為高電平(按鍵未按下),則將P1.0引腳設置為低電平。
IO口外部中斷
IO口外部中斷是一種特殊的中斷,它允許外部事件觸發(fā)微控制器的中斷服務程序。它的存在有以下幾個意義和用途:
事件檢測和響應:外部中斷可以用于檢測和響應外部事件,例如按鍵按下、傳感器狀態(tài)變化、信號邊沿等。當外部事件發(fā)生時,觸發(fā)外部中斷,微控制器可以立即中斷當前任務,執(zhí)行與事件相關的中斷服務程序,從而及時響應外部事件。
節(jié)省處理器資源:通過使用外部中斷,可以節(jié)省處理器資源。相比于不斷地輪詢輸入狀態(tài),使用外部中斷可以在外部事件發(fā)生時立即中斷處理,避免了處理器不斷輪詢的浪費。這樣,處理器可以繼續(xù)執(zhí)行其他任務,而無需關注外部事件,只有在事件發(fā)生時才會中斷處理。
實時性和精確性:外部中斷的響應速度很快,可以實現實時性要求高的應用。它可以在微秒級別的時間內檢測到外部事件,并立即中斷處理。這對于需要高精度和及時響應的應用非常重要,如控制系統(tǒng)、測量和采樣系統(tǒng)等。
多任務處理:外部中斷允許多任務處理。通過將不同的外部事件分配給不同的中斷服務程序,可以同時處理多個任務。這樣,可以在同一個微控制器上實現多個功能模塊的并行處理,提高系統(tǒng)的效率和靈活性。
WDTCTL = WDTPW + WDTHOLD;:停止看門狗定時器。MSP430微控制器通常配備了一個看門狗定時器,用于在程序執(zhí)行期間檢測和防止系統(tǒng)鎖死。
P1DIR |= BIT0;:將P1.0引腳設置為輸出方向。這意味著P1.0被配置為輸出引腳,可以控制外部設備。
P1IE |= BIT3;:啟用P1.3引腳的中斷功能。當發(fā)生與P1.3引腳相關的中斷時,將觸發(fā)相應的中斷服務程序。
P1IES |= BIT3;:配置P1.3引腳的中斷觸發(fā)邊沿。在本例中,配置為高電平到低電平的觸發(fā)邊沿。
P1REN |= BIT3;:啟用P1.3引腳的上拉電阻。這意味著P1.3引腳與上拉電阻連接,可以檢測外部連接的開關狀態(tài)。
P1IFG &= ~BIT3;:清除P1.3引腳的中斷標志位。確保在進入中斷服務程序之前,將中斷標志位重置為未觸發(fā)狀態(tài)。
__bis_SR_register(LPM4_bits + GIE);:將微控制器設置為低功耗模式4(LPM4),并啟用全局中斷(GIE)。進入低功耗模式后,微控制器將等待中斷事件的發(fā)生。
#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 timer
P1DIR |= BIT0; // Set P1.0 to output direction
P1IE |= BIT3; // P1.3 interrupt enabled
P1IES |= BIT3; // P1.3 Hi/lo edge
P1REN |= 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 = toggle
P1IFG &= ~BIT3; // P1.3 IFG cleared
}
MSP430時鐘系統(tǒng)
基本時鐘模塊+支持低系統(tǒng)成本和超低功耗。使用三個內部時鐘信號,用戶可以選擇性能和低功耗之間的最佳平衡?;緯r鐘模塊+可以在完全軟件控制下配置為不需要任何外部元件、一個外部電阻、一個或兩個外部晶體,或者諧振器進行操作。
基本時鐘模塊+包括兩個、三個或四個時鐘源:
? 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和系統(tǒng)使用。
? SMCLK:子主時鐘。SMCLK可在軟件中選擇LFXT1CLK、VLOCLK、XT2CLK(如果芯片上可用)或DCOCLK。SMCLK可被1、2、4或8分頻。SMCLK可針對各個外設模塊進行軟件選擇。
該代碼的作用是配置 MSP430G2xx3 微控制器的時鐘信號輸出,其中 P1.0 引腳輸出 ACLK 時鐘信號,P1.4 引腳輸出 SMCLK 時鐘信號,P1.1 引腳輸出 MCLK/10 時鐘信號。在無限循環(huán)中,不斷地在 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
//1Mhz
if (CALBC1_1MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */
/* //8Mhz
if (CALBC1_8MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_8MHZ; // Set range
DCOCTL = CALDCO_8MHZ; // Set DCO step + modulation */
/* //12Mhz
if (CALBC1_12MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_12MHZ; // Set range
DCOCTL = CALDCO_12MHZ; // Set DCO step + modulation*/
/* //16Mhz
if (CALBC1_16MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_16MHZ; // Set range
DCOCTL = CALDCO_16MHZ; // Set DCO step + modulation*/
P1DIR |= 0x13; // P1.0,1 and P1.4 outputs
P1SEL |= 0x11; // P1.0,4 ACLK, SMCLK output
while(1)
{
P1OUT |= 0x02; // P1.1 = 1
P1OUT &= ~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
//16Mhz
if (CALBC1_16MHZ == 0xFF) // If calibration constant erased
{
while (1)
; // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_16MHZ; // Set range
DCOCTL = CALDCO_16MHZ; // Set DCO step + modulation
P1DIR |= 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
//1Mhz
if (CALBC1_1MHZ == 0xFF) // If calibration constant erased
{
while (1)
; // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */
P1DIR |= 0x01; // P1.0 output
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 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 WDT
P1DIR |= 0x01; // P1.0 output
TACTL = 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 used
case 4: break; // CCR2 not used
case 10: P1OUT ^= 0x01; // overflow
break;
}
}
針對于CCR1之類的溢出也是不常用的,下面的代碼看看就好。
#include <msp430.h>
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1SEL |= 0x06; // P1.1 - P1.2 option select
P1DIR |= 0x07; // P1.0 - P1.2 outputs
CCTL0 = OUTMOD_4 + CCIE; // CCR0 toggle, interrupt enabled
CCTL1 = OUTMOD_4 + CCIE; // CCR1 toggle, interrupt enabled
TACTL = 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 CCR1
break;
case 10: P1OUT ^= 0x01; // Timer_A3 overflow
break;
}
}
MSP430定時器_PWM波形產生
PWM(Pulse Width Modulation,脈寬調制)波形在電子和控制系統(tǒng)中有著廣泛的應用,它具有以下幾個重要的作用:
模擬信號生成:PWM波形可以通過調整脈沖的占空比來模擬產生連續(xù)的模擬信號。通過改變脈沖的寬度(占空比),可以實現不同的平均電平值,從而生成與輸入信號強度或控制信號相關的模擬輸出。這使得PWM成為模擬電壓和模擬電流控制的一種常見技術。
電機控制:PWM廣泛應用于電機驅動和速度控制中。通過在電機繞組上施加PWM波形,可以控制電機的轉速和扭矩。通過調整脈沖的占空比,可以改變電機驅動電壓的平均值,從而控制電機的轉速。
LED亮度控制:PWM被廣泛用于LED亮度調節(jié)。通過改變PWM波形的占空比,可以控制LED的亮度。當PWM波形的占空比較大時,LED處于高亮度狀態(tài);當占空比較小時,LED處于低亮度狀態(tài)。通過快速調整PWM波形的占空比,可以實現燈光的平滑過渡和精確亮度控制。
電源管理:PWM被用于電源管理和節(jié)能控制中。通過在開關電源中采用PWM控制,可以調整開關管的通斷時間,從而調節(jié)輸出電壓或電流。這種方式可以提高電源的效率和穩(wěn)定性,并減少功耗。
數字信號傳輸: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
//1Mhz
if (CALBC1_1MHZ == 0xFF) // If calibration constant erased
{
while (1)
; // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */
P1DIR |= BIT2;
P1SEL |= BIT2;
CCR0 = 1000; // PWM Period/2
CCTL1 = OUTMOD_7; // CCR1 toggle/set
CCR1 = 500; // CCR1 PWM duty cycle
TACTL = TASSEL_2 + MC_3; // SMCLK, up-down mode
__bis_SR_register(LPM0_bits); // Enter LPM0
}
MSP430串口_收發(fā)
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 WDT
if (CALBC1_1MHZ == 0xFF) // If calibration constant erased
{
while (1)
; // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
P1SEL = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 104; // 1MHz 9600
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
UCA0CTL1 &= ~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 WDT
if (CALBC1_1MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2;
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 8; // 1MHz 115200
UCA0BR1 = 0; // 1MHz 115200
UCA0MCTL = UCBRS2 + UCBRS0; // Modulation UCBRSx = 5
UCA0CTL1 &= ~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單通道轉換代碼。多通道較為復雜,這里不敘述。文章來源:http://www.zghlxwxcb.cn/news/detail-600558.html
#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 enabled
ADC10CTL1 = INCH_4; // input A4
ADC10AE0 |= BIT4; // PA.4 ADC option select
while (1)
{
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
while ((ADC10IFG & ADC10CTL0)==0)
; //MEM5觸發(fā)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 timer
if (CALBC1_1MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set DCO to 1MHz
DCOCTL = CALDCO_1MHZ;
FCTL2 = FWKEY + FSSEL0 + FN1; // MCLK/3 for Flash Timing Generator
value = 0; // initialize value
while(1) // Repeat forever
{
write_SegC(value++); // Write segment C, increment value
copy_C2D(); // Copy segment C to D
__no_operation(); // SET BREAKPOINT HERE
}
}
void write_SegC (char value)
{
char *Flash_ptr; // Flash pointer
unsigned int i;
Flash_ptr = (char *) 0x1040; // Initialize Flash pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptr = 0; // Dummy write to erase Flash segment
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<64; i++)
{
*Flash_ptr++ = value; // Write value to flash
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
void copy_C2D (void)
{
char *Flash_ptrC; // Segment C pointer
char *Flash_ptrD; // Segment D pointer
unsigned int i;
Flash_ptrC = (char *) 0x1040; // Initialize Flash segment C pointer
Flash_ptrD = (char *) 0x1000; // Initialize Flash segment D pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptrD = 0; // Dummy write to erase Flash segment D
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<64; i++)
{
*Flash_ptrD++ = *Flash_ptrC++; // copy value segment C to segment D
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
PS: 有代碼需要做可以私信。文章來源地址http://www.zghlxwxcb.cn/news/detail-600558.html
到了這里,關于【MSP430單片機】MSP430G2553程序,MSP430G2553單片機教程,MSP430G2553實戰(zhàn)演練的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!