跑馬燈實驗;按鍵輸入實驗;串口實驗;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」。
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以及其餘一些固定字符
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的時候,出現了問題,首先是在設備管理器的串口中檢測不到實驗箱,以及沒有設置好算法,致使打開工程之後沒法編譯下載程序,以及在代碼的理解中,遇到了咱們以前學習中的盲區,在虛擬機的製做過程當中,由於有了主機實驗的經驗教訓,還算比較順利的,咱們總結了一下,這種實驗仍是在實驗室中比較好,由於本身的電腦系統版本太高,和好多實驗須要的軟件並不能很好的兼容。
經過此次實驗,提升了咱們的動手能力,這也是咱們在平時實驗中缺失的。
信息安全系統實驗箱指導書