MSP430單片機實踐篇---內(nèi)部FALSH的操作
//******************************************************************************
// 測試MSP430單片機向FLASH中寫入操作
//
// 描述; 每次掉電或復位后都能看到數(shù)碼管上顯示的數(shù)值增1,說明對flash的寫入與讀取成功
//
// 注意:修改flash中的內(nèi)容必須首先執(zhí)行擦除操作,
// 因為對FLASH的操作只能將1寫成0,而不能將0寫成1只有擦除才能將0寫回1
// 擦除操作至少將擦除1個段
//
// 如果使用其它型號的單片機,只需將頭文件改為相應的
// 并在Option的Target中的device改為相應的cpu即可。
//
// 硬件連接:如下圖
// MSP430F13x
// -----------------
// /|| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P5.0|-->LED_DOUT
// | P5.2|-->LED_CLK
// | P5.4|-->LED_LATCH
//
//
// 硬件電路:MSP430F135核心實驗板-I型 + TY-DIS1(8位數(shù)碼管顯示模塊)
// 硬件連接:
//
// 調(diào)試器:MSP430FET全系列JTAG仿真器
// 調(diào)試軟件: IAR Embedded Workbench Version: 3.41A 編譯
//******************************************************************************
#include
////預定義函數(shù)//////////////////////////////////////////////////////////////////
void LED_595(char SMG1,char SMG2,char SMG3,char SMG4);//4位LED數(shù)碼管顯示子程序
void Led_out(unsigned char X);//74HC595串行輸出子程序
void A16(unsigned int dd);// 16進制到4位10進制轉(zhuǎn)換
const unsigned char LED_0_F[];//LED數(shù)碼管段碼轉(zhuǎn)換表
void Flash_clr( int *Data_ptr );
void Flash_ww( int *Data_ptr, int word );
void Flash_wb( char *Data_ptr, char byte );
////變量定義////////////////////////////////////////////////////////////////////
unsigned char Buffer[4];
void main(void)
{
char *point,*readaa;// 定義2個指針,分別指向flash和變量aa
char aa;
//初始化IO口用于顯示
P5DIR =0; //P5口全部設為輸入口
P5SEL =0; //將P5口所有的管腳設置為一般I/O口
P5DIR |= BIT0; //將P5.0 P5.2 P5.4設置為輸出方向
P5DIR |= BIT2;
P5DIR |= BIT4;
WDTCTL = WDTPW + WDTHOLD;//停止watchdog
_DINT();//對FLASH操作之前必須關閉中斷
readaa=&aa;//讀取變量aa的地址;
//在watch觀察窗中可以通過readaa看到aa所在的地址及內(nèi)容
point=(char*)0xcb10;//設置要讀取的flash地址為“0xcb10”
//在watch觀察窗中可以通過point看到0xcb10所在地址的內(nèi)容
*readaa=*point;//將flash數(shù)據(jù)讀入aa
aa=*point;//另一種將flash數(shù)據(jù)讀入aa的方法
aa++;
Flash_clr((int*)0xcb00);//擦除0xcb00所在段,只有擦除才能將0寫回1
Flash_wb((char*)0xcb10,aa);//向0xcb10寫入新的aa(字節(jié))
while(1)
{
A16(aa);
LED_595(Buffer[0],Buffer[1],Buffer[2],Buffer[3]);
}
}
//***FLASH操作類函數(shù)集**********************************************************
//-----------------------------------------------------------------
// Flash_wb
//-----------------------------------------------------------------
// 將1個字節(jié)(8 bit)寫入到flash memory中
void Flash_wb( char *Data_ptr, char byte )
{
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A540; /* WRT = 1 */
*Data_ptr=byte; /* program Flash word */
FCTL1 = 0x0A500; /* WRT = 0 */
FCTL3 = 0x0A510; /* Lock = 1 */
}
//-----------------------------------------------------------------
// Flash_ww
//-----------------------------------------------------------------
// 將1個字節(jié)(16 bits)寫入到flash memory中
void Flash_ww( int *Data_ptr, int word )
{
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A540; /* WRT = 1 */
*Data_ptr=word; /* program Flash word */
FCTL1 = 0x0A500; /* WRT = 0 */
FCTL3 = 0x0A510; /* Lock = 1 */
}
//-----------------------------------------------------------------
// Flash_clr
//-----------------------------------------------------------------
// 擦除1個段的flash memory
void Flash_clr( int *Data_ptr )
{
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A502; /* ERASE = 1 */
*Data_ptr=0; /* erase Flash segment */
FCTL1 = 0x0A500; /* ERASE = 0 */
FCTL3 = 0x0A510; /* Lock = 1 */
}
//***顯示類函數(shù)集***************************************************************
//------------------------------------------------------
// 4位LED數(shù)碼管顯示子程序
//
// 人口參數(shù):SMG1,SMG2,SMG3,SMG4——待顯示的數(shù)據(jù)
//
void LED_595(char SMG1,char SMG2,char SMG3,char SMG4)
{
char z;
//最高位(最左側(cè))LED數(shù)碼管顯示---------------------
z = LED_0_F[SMG1];
Led_out(z); //段碼輸出
z = 0xFE; //位碼
Led_out(z); //位碼輸出
P5OUT &=~(BIT4); //顯示輸出
P5OUT |=BIT4;
//次高位(左數(shù)第2個)LED數(shù)碼管顯示---------------------
z = LED_0_F[SMG2];
Led_out(z); //段碼輸出
z = 0xFD; //位碼
Led_out(z); //位碼輸出
P5OUT &=~(BIT4); //顯示輸出
P5OUT |=BIT4;
//次低位(左數(shù)第3位)LED數(shù)碼管顯示---------------------
z = LED_0_F[SMG3];
Led_out(z); //段碼輸出
z = 0xFB; //位碼
Led_out(z); //位碼輸出
P5OUT &=~(BIT4); //顯示輸出
P5OUT |=BIT4;
//最低位(左數(shù)第4位)LED數(shù)碼管顯示---------------------
z = LED_0_F[SMG4];
Led_out(z); //段碼輸出
z = 0xF7; //位碼
Led_out(z); //位碼輸出
P5OUT &=~(BIT4); //顯示輸出
P5OUT |=BIT4;
}
//------------------------------------------------------
// 用于74HC595的LED串行移位子程序
//
// 人口參數(shù):X——待輸出的數(shù)據(jù)
//
void Led_out(unsigned char X)
{
unsigned char i;
for(i=8;i>0;i--)
{
if (X&0x80) P5OUT |=BIT0; else P5OUT &=~(BIT0);
X<<=1;
P5OUT &= ~(BIT2);//P5.2管腳輸出低電平
P5OUT |= BIT2;//P5.2管腳輸出高電平
}
}
//------------------------------------------------------ // LED段碼轉(zhuǎn)換表0——F //------------------------------------------------------const unsigned char LED_0_F[] = {// 0 1 2 3 4 5 6 7 8 9 A b c d E F 不顯示 - o(18)H(19)h(20)C(21)0(22)n(23) 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8e,0xFF,0xbf,0xa3,0x89,0x8b,0xc6,0xc0,0xab };