《基於Cortex-M4的虛擬機制做與測試》課程設計 結題報告

  • 小組成員姓名:20165219王彥博 20165220葛宇豪 20165239其米仁增
  • 指導教師:婁嘉鵬
  • 提交時間:2019年5月27日

任務簡介

任務內容:

跑馬燈實驗;按鍵輸入實驗;串口實驗;tft lcd顯示實驗;
web服務器例程實驗web

任務要求

先在主機上完成實驗,成功之後在win7虛擬機上完成實驗,最後提交win7虛擬機。算法

具體要求:數組

跑馬燈實驗: 學習LED二極管原理
 掌握ARM的GPIO口工做原理瀏覽器

按鍵輸入實驗: 學習按鍵檢測原理
 掌握ARM的GPIO口工做原理安全

串口實驗: 學習串口通訊原理
 掌握SP3232芯片的使用方法
 掌握ARM的串行口工做原理服務器

TFT LCD顯示實驗: 學習4.3寸TFT LCD使用方法
 掌握ARM的GPIO口工做原理網絡

Web服務器例程實驗: 學習uIP-1.0協議棧相關知識
 學習以太網控制器DM9000A的使用方法函數

實踐操做
環境搭建

JLINK下載與調試:學習

把JLINK用USB線鏈接到電腦usb接口和實驗箱板子的JTAG接口上測試

安裝JLINK的驅動,如圖

安裝CH340G的驅動,便於串口的使用

在驅動安裝成功以後,拔掉USB線,而後從新插入電腦,此時電腦就會自動給其安裝驅動了。在安裝完成以後,能夠在電腦的設備管理器裏面找到USB串口(若是找不到,則重啓下電腦)

MDK5.11安裝與破解:

婁老師給了咱們mdk5的安裝與破解的軟件包,只須要按照步驟逐個安裝就能夠了。其中,破解軟件只能在實驗室中電腦上運行。

MDK的配置:

一樣,在咱們本身的win10系統的mdk檢測不到jink的連接,在實驗室的電腦,成功識別,如圖

MDK5會根據咱們新建工程時選擇的目標器件,自動設置flash算法。咱們使用的是STM32F407ZGT6,FLASH容量爲1M字節,因此Programming Algorithm裏面默認會有1M型號的STM32F4xx FLASH算法。(這一步特別重要,不然沒法進行實驗)

實踐過程
跑馬燈實驗:
int main(void)
{
    delay_init(168);//初始化延時函數
    LED_Init();//初始化LED端口
    /**下面是經過直接操做庫函數的方式實現IO控制**/ 
  while(1)
    {
        GPIO_ResetBits(GPIOB,GPIO_Pin_9);
//LED對應引腳GPIOB.9拉低,亮,等同LED0=0;
        GPIO_ResetBits(GPIOB,GPIO_Pin_8);
//LED對應引腳GPIOB.8拉低,亮,等同LED1=0;      
        GPIO_ResetBits(GPIOB,GPIO_Pin_7);
//LED對應引腳GPIOB.7拉低,亮,等同LED2=0;
        GPIO_ResetBits(GPIOB,GPIO_Pin_6);
//LED對應引腳GPIOB.6拉低,亮,等同LED3=0;      
        GPIO_ResetBits(GPIOB,GPIO_Pin_1);
//LED對應引腳GPIOB.1拉低,亮,等同LED4=0;
        GPIO_ResetBits(GPIOB,GPIO_Pin_0);
//LED對應引腳GPIOB.0拉低,亮,等同LED5=0;      
        delay_ms(500);
        GPIO_SetBits(GPIOB,GPIO_Pin_9);
//LED對應引腳GPIOB.9拉高,滅,等同於LED0=1;
        GPIO_SetBits(GPIOB,GPIO_Pin_8);
//LED對應引腳GPIOB.8拉高,滅,等同於LED1=1;
        GPIO_SetBits(GPIOB,GPIO_Pin_7);
//LED對應引腳GPIOB.7拉高,滅,等同於LED2=1;
        GPIO_SetBits(GPIOB,GPIO_Pin_6);
//LED對應引腳GPIOB.6拉高,滅,等同於LED3=1;
        GPIO_SetBits(GPIOB,GPIO_Pin_1);
//LED對應引腳GPIOB.1拉高,滅,等同於LED4=1;
        GPIO_SetBits(GPIOB,GPIO_Pin_0);
//LED對應引腳GPIOB.0拉高,滅,等同於LED5=1;
        delay_ms(500);
    }
}

先調用delay_init()函數初始化延時,接着就是調用LED_Init()函數來初始化GPIOB各口爲輸出,最後再死循環裏面實現LED0~LED5交替閃爍,間隔500ms。函數GPIO_SetBits用來設置一組IO口中的一個或者多個IO口爲高電平。GPIO_ResetBits用來設置一組IO口中的一個或者多個IO口爲低電平。

先編譯,後下載。下載成功後,開發板上的6個燈會同時點亮,而後500ms後又同時熄滅,而後500ms後又從新點亮,循環往復。

按鍵輸入實驗:
int main(void)
{ 
    u8 key=0;           //保存鍵值
    delay_init(168);  //初始化延時函數
    LED_Init();             //初始化LED端口 
    KEY_Init();       //初始化與按鍵鏈接的硬件接口
    LED0=1;       //先將燈關閉
    LED1=1;
    LED2=1;
    LED3=1;
    LED4=1;
    LED5=1;
    while(1)
    {
        if(KEY0==0)
        {
            delay_ms(30);
            if(KEY0==0)  key=key|0x01;
        }
        if(KEY0==1)
        {
            delay_ms(30);
            if((KEY0==1) && (key&0x01 ))  {LED0=!LED0; key=key&0xfe;}
        }
        if(KEY1==0)
        {
            delay_ms(30);
            if(KEY1==0)  key=key|0x02;
        }
        if(KEY1==1)
        {
            delay_ms(30);
            if((KEY1==1) && (key&0x02 ))  {LED1=!LED1; key=key&0xfd;}
        }
        if(KEY2==0)
        {
            delay_ms(30);
            if(KEY2==0)  key=key|0x04;
        }
        if(KEY2==1)
        {
            delay_ms(30);
            if((KEY2==1) && (key&0x04 ))  {LED2=!LED2; key=key&0xfb;}
        }   
        if(WK_UP==0)
        {
            delay_ms(30);
            if(WK_UP==0)  key=key|0x08;
        }
        if(WK_UP==1)
        {
            delay_ms(30);
            if((WK_UP==1) && (key&0x08 ))  {LED3=!LED3; key=key&0xf7;}
        }
    }
}

先調用delay_init()函數初始化延時,接着就是調用LED_Init()函數來初始化GPIOB各口爲輸出,而後是KEY_Init()函數初始化按鍵,最後在大循環裏使用查詢的方式判斷哪一個獨立按鍵被按下,注意使用的是延時消抖。

程序下載成功後,令按鍵從右到左依次爲按鍵一、按鍵二、按鍵三、按鍵4。則按鍵1控制最左邊第一個燈的翻轉,也就是按一下燈亮,再按一下燈滅;按鍵2控制最左邊第二個燈的翻轉;按鍵3控制最左邊第三個燈的翻轉;按鍵4控制最左邊第四個燈的翻轉。

串口實驗:
int main(void)
{ 
    u8 t;
    u8 len; 
//  u16 times=0;  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
    delay_init(168);             //延時初始化 
    uart_init(9600);             //串口初始化波特率爲9600
    LED_Init();             //初始化與LED鏈接的硬件接口  
    while(1)
    {
        if(USART_RX_STA&0x8000)
        {                      
            USART_ITConfig(USART1, USART_IT_RXNE,DISABLE);//關閉相關中斷
            len=USART_RX_STA&0x3fff;//獲得這次接收到的數據長度
            printf("\r\n您發送的消息爲:\r\n");
            for(t=0;t<len;t++)
            {
                USART_SendData(USART1, USART_RX_BUF[t]);    //向串口1發送數據
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
//等待發送結束
            }
            printf("\r\n\r\n");//插入換行
            USART_RX_STA=0;
            USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);//開啓相關中斷
        }
    }
}

本次實驗使用的是丁丁串口助手—SSCOM 3.3觀測串口通訊收發的數據。硬件上使用USB轉9針串口線的USB端鏈接電腦USB口,串口端鏈接板卡的RS232串口。

程序下載成功後,打開串口助手,因爲咱們在程序上面設置了輸入任意字符後必須輸入回車,串口才承認接收到的數據,因此必須在發送數據後再發送一個回車符,這裏XCOM提供的發送方法是經過勾選發送新行實現。只要勾選了這個選項,每次發送數據後,XCOM都會自動多發一個回車(0X0D+0X0A)。設置好了發送新行,咱們再在發送區輸入你想要發送的文字,而後單擊發送,就能夠在顯示窗口顯示「您發送的消息爲:xxxxxx」。

TFT LCD顯示實驗
int main(void)
{ 
    u8 x=0;
    u8 lcd_id[12];              //存放LCD ID字符串
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
    delay_init(168);      //初始化延時函數
    uart_init(115200);      //初始化串口波特率爲115200
    LED_Init();                   //初始化LED
    LCD_Init();           //初始化LCD FSMC接口
    LCD_Scan_Dir(U2D_R2L);
    POINT_COLOR=RED;      //畫筆顏色:紅色
    sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//將LCD ID打印到lcd_id數組。
    LCD_Clear(BLUE);
    while(1) 
    {        
        switch(x)
        {
            case 0:LCD_Clear(WHITE);break;
            case 1:LCD_Clear(BLACK);break;
            case 2:LCD_Clear(BLUE);break;
            case 3:LCD_Clear(RED);break;
            case 4:LCD_Clear(MAGENTA);break;
            case 5:LCD_Clear(GREEN);break;
            case 6:LCD_Clear(CYAN);break; 
            case 7:LCD_Clear(YELLOW);break;
            case 8:LCD_Clear(BRRED);break;
            case 9:LCD_Clear(GRAY);break;
            case 10:LCD_Clear(LGRAY);break;
            case 11:LCD_Clear(BROWN);break;
        }
        POINT_COLOR=RED;      
        LCD_ShowString(30,40,210,24,24,"Explorer STM32F4"); 
        LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
        LCD_ShowString(30,90,200,16,16,"HELLO");
        LCD_ShowString(30,110,200,16,16,lcd_id);        //顯示LCD ID           
        LCD_ShowString(30,130,200,12,12,"2016/5/4");                             
        x++;
        if(x==12)x=0;
        LED0=!LED0;  
        delay_ms(1000); 
    } 
}

程序下載成功後,經過把LCD模塊插入TFTLCD模塊接口,按下電源開關以後,就能夠看到LCD模塊不停地切換底色。同時該屏幕會顯示LCD驅動器的ID以及其餘一些固定字符

Web服務器例程實驗
int main(void)
{
    /*ST固件庫中的啓動文件已經執行了 SystemInit() 函數,該函數在 system_stm32f4xx.c 文件,主要功能是配置CPU系統的時鐘,內部Flash訪問時序,配置FSMC用於外部SRAM*/
    bsp_Init();     /* 硬件初始化 */
    PrintfLogo();   /* 打印例程信息到串口1 */
    /* 檢測網卡芯片 */
    {
        uint32_t vid;
        vid = dm9k_ReadID();
        bsp_DelayMS(2);
        if (vid == DM9000A_ID_OK)
        {
            printf("DM9000AE Detect Ok, vid&pid = %08X\n\r", vid);
        }
        else
        {
    printf("DM9000AE Detect Failed, vid&pid = %08X, Expected = %08X\n\r", vid, DM9000A_ID_OK);
        }
    }
    /* 啓動webserver */
    WebServer();
}

實驗前要將先將筆記本或者臺式機的網絡ip和實驗平臺裏M4模塊內的網絡服務器的ip設置爲同一局域網網段內

配置好ip之後,打開IE瀏覽器,在地址欄輸入http://192.168.1.11,能夠看到uIP內置的web測試頁面

課程設計總結

此次課程設計,咱們小組遇到了不少的問題與挑戰,首先,在實驗環境搭建上,因爲咱們以前歷來沒有接觸arm實驗箱的m4模塊,在搭建jlink的時候,出現了問題,首先是在設備管理器的串口中檢測不到實驗箱,以及沒有設置好算法,致使打開工程之後沒法編譯下載程序,以及在代碼的理解中,遇到了咱們以前學習中的盲區,在虛擬機的製做過程當中,由於有了主機實驗的經驗教訓,還算比較順利的,咱們總結了一下,這種實驗仍是在實驗室中比較好,由於本身的電腦系統版本太高,和好多實驗須要的軟件並不能很好的兼容。

經過此次實驗,提升了咱們的動手能力,這也是咱們在平時實驗中缺失的。

參考資料

信息安全系統實驗箱指導書

相關文章
相關標籤/搜索