5.打開exp2\軟件資料\keil-MDK註冊機\keil mdk474註冊機路徑下的KEIL MDK4.74crack.exe,運行Keil-MDK註冊機,將剛纔複製的CID粘貼到「CID」中,TARGET選擇ARM,而後點擊Generate,生成LIC
6.將LIC複製並將其粘貼到剛纔License Management窗口中的New License ID Code(LID)一欄中便可獲得結果算法
7.用USB公對公線鏈接電腦和試驗箱;
打開exp2\軟件資料\Z32下載調試工具目錄下的NZDloadTool.exe;
8.按住Reboot按鈕的同時兩次開關試驗箱左上角部分的電源開關;
9.左側顯示「1設備已鏈接」後,下載LED項目編輯後生成的Z32HUA.bin文件,目錄是exp2\LED閃爍\bin;安全
10.下載成功後關閉-打開電源開關,便可看到LED燈L2閃爍的實驗現象。
併發
主函數代碼的執行過程爲:函數
1) 系統初始化,中斷設置使能全部;工具
SystemInit ();
2) 判斷按鍵,返回 boot 條件,確認是否進行程序下載;性能
if(0 == GPIO_GetVal(0)) { BtApiBack(0x55555555, 0xAAAAAAAA); }
3) 設置 GPIO0 狀態爲上拉輸出;測試
GPIO_PuPdSel(0,0); // 設置 GPIO0 爲上拉 GPIO_InOutSet(0,0); // //設置 GPIO0爲輸出
4) 進入循環程序, LED 燈間隔 100ms 閃爍。加密
while(1) { delay(100); GPIO_SetVal(0,0); // 輸出低電平,點亮 LEDLED delay(100); GPIO_SetVal(0,1); // 輸出高電平,熄滅 LEDLED }
1.打開exp2\UART發送與中斷接收目錄下的Z32HUA.uvproj工程文件並編譯;將生成的.bin文件下載到實驗箱設計
2.將實驗箱接入電源,鏈接實驗箱與電腦,用 9 針串口線將 Z32 模塊的串口與電腦 USB 接口鏈接,打開Z32下載調試工具軟件資料\Z32下載調試工具\NZDownloadTool.exe打開Z32的電源開關前,按住Reboot按鍵不放,兩次打開電源開關,Z32便可被電腦識別,顯示1設備已鏈接後,點擊瀏覽,選擇\實驗 2-UART 發送與中斷接收\bin\Z32HUA.bin,點擊下載,綠色進度條加載完成後,程序下載成功。
3.打開串口助手,設置相應參數。3d
4.關閉Z32電源,再打開,下載完的程序自動運行,在串口調試助手的字符串輸入框輸入字符串abcdefgh,而後點擊發送按鈕。
串口相關函數包括中斷服務、波特率設置初始化發送 /接收單 字節、發送符串單個十進制整數、發送某一長度的字符串、接收多字節函數:
1) void UART_IrqService(void) 是串口中 斷服務函數,本實驗現斷執行子程序,從 PC 端串口調試助手發送數據至 Z32 ,Z32 再經串口 發送給 PC 機;
void UART_IrqService(void) { //*****your code*****/ UARTCR &= ~TRS_EN; { do { shuju[uart_rx_num] = UARTDR; if(shuju[uart_rx_num]=='\r'||shuju[uart_rx_num]=='\n') { shuju_lens = uart_rx_num; uart_rx_num=0; uart_rx_end=1; } else uart_rx_num++; } while(FIFO_NE & UARTISR); } UARTCR |= TRS_EN; }
2) void UART_BrpSet(UINT16 set) 是波特率設置 函數,串口實驗波特率設置爲 115200115200 ;
void UART_BrpSet(UINT16 set) { UINT16 brp=0; UINT8 fd=0; if(0 == set) { //uartband@115200bps fd = SCU->UARTCLKCR & 0x80; switch(fd) { case 0x80: /*內部時鐘12M晶振*/ brp = 0x0068; break; case 0x00: /*內部時鐘*/ brp = 0x00AD; break; default: brp = 0x00AD; break; } fd = SCU->UARTCLKCR & 0x7f ; brp = brp/(fd+1); } else { brp = set; } UARTBRPH = (UINT8)((brp >> 8) & 0xFF); UARTBRPL = (UINT8)((brp) & 0xFF); }
3) void UART_Init(void) 是串口初始化函數,,實現配 置串口時鐘、使能中斷;
void UART_Init(void) { IOM->CRA |= (1<<0); //使能Uart接口 SCU->MCGR2 |= (1<<3); //使能Uart總線時鐘 /******配置Uart時鐘(建議使用外部晶振)******/ SCU->SCFGOR |= (1<<6);//使用外部晶振 SCU->UARTCLKCR |= (1<<7);//使用外部時鐘 // SCU->UARTCLKCR &= ~(1<<7);//使用默認OSC時鐘 UART_BrpSet(0); //設置波特率爲默認115200 UARTISR = 0xFF; //狀態寄存器所有清除 UARTCR |= FLUSH; //清除接收fifo UARTCR = 0; //偶校驗 /******配置中斷使能******/ UARTIER |= FIFO_NE; // UARTIER |= FIFO_HF; // UARTIER |= FIFO_FU; // UARTIER |= FIFO_OV; // UARTIER |= TXEND; // UARTIER |= TRE; ModuleIrqRegister(Uart_Exception, UART_IrqService); //掛載終端號 }
4) void UART_SendByte(UINT8 dat) 是發送單字節函數,使用此函數一次發 送一個字節數據 ;
void UART_SendByte(UINT8 dat) { UARTCR |= TRS_EN; UARTDR = dat; do { if(UARTISR & TXEND) { UARTISR |= TXEND;//清楚發送完成標誌,寫1清除 break; } } while (1); UARTCR &= (~TRS_EN); }
5) void UART_SendString(UINT8 * str) 是發送字符串函數 ,使用此函數發送 字符串數據 ;
void UART_SendString(UINT8 * str) { UINT8 *p ; p=str; while(*p!=0) { UART_SendByte(*p++); } }
6) void uart_SendString(UINT8 buf[],length) 是發送某一長度的字符 串函數,實現發送必定長度的字符據。
void uart_SendString(UINT8 buf[],UINT8 length) { UINT8 i=0; while(length>i) { UART_SendByte(buf[i]); i=i+1; } }
7) void UART_SendNum(INT32 num) 是發送單個十進制整數 函數,使用此 函數 發送一個十進制整數;
void UART_SendNum(INT32 num) { INT32 cnt = num,k; UINT8 i,j; if(num<0) {UART_SendByte('-');num=-num;} //計算出i爲所發數據的位數 for(i=1;;i++) { cnt = cnt/10; if(cnt == 0) break; } //算出最大被除數從高位分離 k = 1; for(j=0;j<i-1;j++) { k = k*10; } //分離併發送各位 cnt = num; for(j=0;j<i;j++) { cnt = num/k; num = num%k; UART_SendByte(0x30+cnt); k /= 10; } }
8) void UART_SendHex(UINT8 dat) 是發送單個十六進制整數 函數,使用此 函數 發送一個十六進制整數;
void UART_SendHex(UINT8 dat) { UINT8 ge,shi; UART_SendByte('0'); UART_SendByte('x'); ge = dat%16; shi = dat/16; if(ge>9) ge+=7; //換成大寫字母 if(shi>9) shi+=7; UART_SendByte(0x30+shi); UART_SendByte(0x30+ge); UART_SendByte(' '); }
9) UINT8 UART_GetByte(*data) 是接收單字節函數 是接收單字節函數 數,使用此函數接 收單字節數據 ;
UINT8 UART_GetByte(UINT8 *data) { UINT8 ret= 0; if(0 != (UARTISR & FIFO_NE)) { *data = UARTDR; ret = 1; } return ret; }
10) void UART_Receive(UINT8 *receive, len) 是接收多字節函數 ,使 用此函數接收多個字節據 ;
void UART_Receive(UINT8 *receive, UINT8 len) { while(len != 0) { if(len >= 4) { while (!(UARTISR & FIFO_FU)); *receive++ = UARTDR; *receive++ = UARTDR; *receive++ = UARTDR; *receive++ = UARTDR; len -= 4; } else if(len >= 2) { while (!(UARTISR & FIFO_HF)); *receive++ = UARTDR; *receive++ = UARTDR; len -= 2; } else { while (!(UARTISR & FIFO_NE)); *receive++ = UARTDR; len--; } } }
主函數代碼的執行過程爲:
1) 系統初始化,中斷設置使能全部;(同任務二)
2) 判斷按鍵,返回 boot 條件,確認是否進行程序下載;(同任務二)
3) 初始化 Uart ,使能 Uart 接口,配置 Uart 中斷並使能;
UART_Init(); //初始化Uart
4) 先發送單個字符「 A」,換行,再發送字符串「 Welcome to Z32HUA! 」,換行,發送數字串「 換行,發送數字串「 1234567890 」,換行,再發送 16 位數「 位數「 0xAA」,換行。
UART_SendByte('A'); //Uart發送一個字符 A UART_SendByte('\r');UART_SendByte('\n');//換行 UART_SendString("Welcome to Z32HUA!"); //Uart發送字符串 UART_SendByte('\r');UART_SendByte('\n');//換行 UART_SendNum(1234567890); //Uart發送一個十進制數 UART_SendByte('\r');UART_SendByte('\n');//換行 UART_SendHex(0xAA); //Uart發送一個十六進制數 UART_SendByte('\r');UART_SendByte('\n');//換行
5) 進入 while 循環程序,等待串口中斷到來並判數據是否接收完畢若 中斷到來, 轉入執行串口服務程序待接收數據完畢,Z32將數據 發回串口助手
while(1) { if(uart_rx_end) { uart_rx_end=0; uart_SendString(shuju,shuju_lens); } } //等待接收中斷
1.打開exp2\SM1目錄下的Z32HUA.uvproj工程文件並編譯;將生成的.bin文件下載到實驗箱
2.用9針串口線將電腦與Z32部分鏈接
3.打開exp2\軟件資料\串口調試助手目錄下的sscom42.exe串口助手,完成相關設定後關閉再打開實驗箱Z32部分的電源開關
4.按照電子屏的提示插入IC卡。
5.插入正確的卡後顯示相應信息,而後按A校驗密碼
6.按照步驟進行進一步的加解密。
在實驗過程當中咱們選擇使用了虛擬機做爲實驗環境,出現了虛擬機沒法識別實驗箱的USB公對公線。
解決方法:虛擬機工具欄設置斷開主機鏈接。