嵌入式軟件設計第09實驗報告

學號:140201133 ? ? ? ? ? ? ? ? ? 姓名:李宇昕

?組別:第3組 ? ? ? ? ? 實驗地點:D19

一、實驗目的:

1.熟悉WWW技術中的SSI(Server Side Include)技術。

2.學會使用SSI技術編寫代碼把當前開發板內RTC的時鐘及日期數據送往PC機瀏覽器顯示。

3.學會使用SSI技術把當前開發板的按鍵(KEY2、KEY1)次數信息送往PC機瀏覽器顯示。

二、實驗內容:

1.編寫代碼完成Web服務器端發送RTC實時時 鐘信息的任務。

2.編寫代碼完成Web服務器端發送按鍵(KEY2、KEY1)按鍵次數的任務。

?

三、實驗過程描述及結果展示:

SSI技術簡介 服務器端嵌入SSI(Server Side Include)是一種基于服務器的網頁制作技術。大多數的WEB服務器等均支持SSI命令。將內容發送到瀏覽器之前,可以使用“SSI”指令將文本、圖形或應用程序信息包含到網頁中。因為包含SSI指令的文件要求特殊處理,所以必須為所有SSI文件賦予SSI文件擴展名。默認的擴展名是.stm、.shtm、.shtml。

SSI是為WEB服務器提供的一套命令,這些命令只要直接嵌入到HTML文檔的注釋內容之中即可。如:<!=--#include file = “info.htm”-->就是一條SSI指令,其作用是將“info.htm”的內容拷貝到當前頁面中。 <!=-- -->是HTML語法中的注釋,當WEB服務器不支持SSI時,會忽略這些信息。

按鍵與STM32的硬件連接圖

STM32F407芯片與鍵盤的連接電路圖如下所示

代碼展示:

?

#include "sys.h"

#include <string.h>

#include "delay.h"

#include "httpd.h"

#include "lwip/tcp.h"

#include "fs.h"

#include "lwip_comm.h"

?

?

void system_init(void);

?void RTCTime_Handler(char *pcInsert);

?void RTCDate_Handler(char *pcInsert);

?void RTCKey1_Handler(char *pcInsert);

?void RTCKey2_Handler(char *pcInsert);

const char *ppcTAGs[]=

{

??"time",

"date",

"key2",

"key1"

};

?

u8 key1=0,key2=0;

?

void EXTI2_IRQHandler(void){

delay_ms(10);

key1++;

printf("%d\n",key1);

EXTI_ClearITPendingBit(EXTI_Line2);

}

void EXTI3_IRQHandler(void){

delay_ms(10);

key2++;

printf("%d\n",key2);

EXTI_ClearITPendingBit(EXTI_Line3);

}

void EXTIX_Init(void)

{

NVIC_InitTypeDef ??NVIC_InitStructure;

EXTI_InitTypeDef ??EXTI_InitStructure;

?

KEY_Init(); //按鍵對應的I/O初始化?

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時鐘

?

?

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);//PE2?連接到中斷線2

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);//PE3 連接到中斷線3

?

/*配置EXTI_Line2,3,4 */

EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3 /*| EXTI_Line4*/;

??EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷事件

??EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發

??EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中斷線使能

??EXTI_Init(&EXTI_InitStructure);//配置

?

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//外部中斷2

??NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//搶占優先級3

??NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優先級2

??NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道

??NVIC_Init(&NVIC_InitStructure);//配置

?

?

NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//外部中斷3

??NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//搶占優先級2

??NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優先級?2

??NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道

??NVIC_Init(&NVIC_InitStructure);//配置

?

???

}

int main(void)

{

???system_init();//系統化初始化

//以下代碼對RTC進行初始化

?

{

RTC_InitTypeDef RTC_InitStructure;

?

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能電源接口時鐘

PWR_BackupAccessCmd(ENABLE);//使能RTC+SRAM區域

?

RCC_LSEConfig(RCC_LSE_ON);//開啟LSE時鐘

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //選擇LSE時鐘作為RTC時鐘

while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); //等待LSE準備好

?

RCC_RTCCLKCmd(ENABLE);//使能RTC時鐘

?

while(RTC_Wait_Synchro());//等待RTC和APB同步

?

RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;//24小時格式

RTC_InitStructure.RTC_SynchPrediv = 0xFF;//同步預分頻器

RTC_InitStructure.RTC_AsynchPrediv = 0x7F;//異步預分頻器

?

RTC_Set_Time(10,0,0,0);//設置時間

RTC_Set_Date(17,3,20,1);//設置日期

?

?

?

}

????EXTIX_Init();

//uart_init(115200); //串口初始化

?

while(1)

{

????

?????lwip_periodic_handle();//LWIP輪詢任務

?

}

}

//SSI的Handler

u16_t SSIHandler(int iIndex,char *pcInsert,int iInsertLen)

{

?

switch(iIndex)//iIndex索引號

{

case 0:

????????RTCTime_Handler(pcInsert);

??????????break;

case 1:

??????RTCDate_Handler(pcInsert);

??????????break;

case 2:

??????RTCKey2_Handler(pcInsert);

??????????break;

case 3:

??????RTCKey1_Handler(pcInsert);

??????????break;

}

return strlen(pcInsert);

}

?

//SSIHandler中需要用到的處理RTC時間的函數

void RTCTime_Handler(char *pcInsert)

{

?

??u8 hour,min,sec,ampm;

RTC_Get_Time(&hour,&min,&sec,&m);

?

*(pcInsert+0) = (char)((hour/10)+0x30);

*(pcInsert+1) = (char)((hour%10)+0x30);

*(pcInsert+2) = ':';

??*(pcInsert+3) = (char)((min/10)+0x30);

*(pcInsert+4) = (char)((min%10)+0x30);

*(pcInsert+5) = ':';

*(pcInsert+6) = (char)((sec/10)+0x30);

*(pcInsert+7) = (char)((sec%10)+0x30);

}

?

void RTCDate_Handler(char *pcInsert)

{

u8 year,month,day,week;

RTC_Get_Date(&year,&month,&day,&week);

?

*(pcInsert+0) = '2';

*(pcInsert+1) = '0';

*(pcInsert+2) = (char)((year/10)+0x30);

*(pcInsert+3) = (char)((year%10)+0x30);

*(pcInsert+4) = '-';

*(pcInsert+5) = (char)((month/10)+0x30);

*(pcInsert+6) = (char)((month%10)+0x30);

*(pcInsert+7) = '-';

*(pcInsert+8) = (char)((day/10)+0x30);

*(pcInsert+9) = (char)((day%10)+0x30);

*(pcInsert+10) = ' ';

*(pcInsert+11) = 'w';

*(pcInsert+12) = 'e';

*(pcInsert+13) = 'e';

*(pcInsert+14) = 'k';

*(pcInsert+15) = ':';;

*(pcInsert+16) = (char)(week+0x30);

}

void RTCKey1_Handler(char *pcInsert)

{

if (key1<10)

{

*(pcInsert+0) = (char)(key1+0x30);

*(pcInsert+1) = '\0';

}

else

{

*(pcInsert+0) = (char)((key1/10)+0x30);

*(pcInsert+1) = (char)((key1%10)+0x30);

*(pcInsert+2) = '\0';

}

}

void RTCKey2_Handler(char *pcInsert)

{

if (key2<10)

{

*(pcInsert+0) = (char)(key2+0x30);

*(pcInsert+1) = '\0';

}

else

{

*(pcInsert+0) = (char)((key2/10)+0x30);

*(pcInsert+1) = (char)((key2%10)+0x30);

*(pcInsert+2) = '\0';

}

}

?

實驗心得:

這次實驗課主要是熟悉WWW技術中的SSI(Server Side Include)技術。學會使用SSI技術編寫代碼把當前開發板內RTC的時鐘及日期數據送往PC機瀏覽器顯示。學會使用SSI技術把當前開發板的按鍵(KEY2、KEY1)次數信息送往PC機瀏覽器顯示。經過老師的指導和同學的幫助。讓我對整個過程有了一定的了解和自己的認識,但是這次課上的實驗我認為還是有一點難度的,經過和同組人員的討論以及老師的指點。我們攻克了難題,有自己代碼的問題,對機器使用的不熟練。重點還是自信心不足。最好也參考了其他的組。總之這次課受益匪淺。明白了這個課之后應該怎么學習可以提高自己的效率。今后的課程會繼續努力。

轉載于:https://www.cnblogs.com/lyxdbk/p/6623835.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372573.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372573.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372573.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TeamCity工件:HTTP,Ant,Gradle和Maven

您可以通過幾種方式檢索TeamCity工件&#xff1f; 我說有很多選擇 &#xff01; 如果您使用的是Java構建工具&#xff0c;那么可以使用簡單的HTTP請求&#xff0c;Ant Ivy&#xff0c;Gradle和Maven下載和使用TeamCity構建配置生成的二進制文件。 怎么樣&#xff1f; 繼續閱讀…

linux中hadoop命令大全,hadoop常用命令

啟動Hadoop進入HADOOP_HOME目錄。執行sh bin/start-all.sh關閉Hadoop進入HADOOP_HOME目錄。執行sh bin/stop-all.sh1、查看指定目錄下內容hadoop dfs –ls [文件目錄]eg: hadoop dfs –ls /user/wangkai.pt2、打開某個已存在文件hadoop dfs –cat [file_path]eg:hadoop dfs -ca…

Uber從Postgres切換到MySQL

Uber工程師在官方博客上描述了他們為什么要從 Postgres 切換到 MySQL 數據庫。Uber的早期架構是由 Python編寫的后端應用構成&#xff0c;使用了 Postgres 數據庫。但此后&#xff0c;Uber的架構發生了顯著的改變&#xff0c;轉變到了微服務模型和新的數據平臺。以前他們使用 P…

AutoCAD如何方便截圖放到Word文檔,改成白底黑字

將模型視圖切換到布局2即可 比如下圖所示的效果 先回到模型視圖把所有線條顏色都改成白色&#xff0c;然后添加適當的標注&#xff08;比如要受力分析&#xff0c;則在CAD中繪制箭頭也很方便的&#xff09;&#xff0c;文字說明。然后切換到布局2就OK 可以截圖了。 轉載于:http…

在Hotspot JVM中跟蹤過多的垃圾回收

由于內存泄漏或其他內存問題&#xff0c;經常導致應用程序凍結&#xff0c;僅使垃圾收集器&#xff08;GC&#xff09;進程運行失敗&#xff0c;試圖釋放一些空間。 直到看門狗&#xff08;或沮喪的管理員&#xff09;重新啟動應用程序并且問題從未解決之前&#xff0c;這種情況…

linux 網絡在線升級,linux在線升級

//前提信息&#xff1a;1.系統分區信息SPI-Flash:[0] 0x000000000000-0x000000020000 : "SPL,128KB"[1] 0x000000020000-0x0000000e0000 : "U-Boot,768KB"[2] 0x0000000e0000-0x000000100000 : "U-Boot Env,128KB"[3] 0x000000100000-0x00000020…

XML反序列化出錯,XML 文檔(2, 2)中有錯誤

XML轉換為實體類的錯誤處理方案 一.錯誤描述&#xff1a; XML反序列化出錯&#xff0c;XML 文檔(2, 2)中有錯誤二.解決方案&#xff1a; 在實體類的字段要加上XmlElement屬性三.具體實現: 1.XML文檔 <EVENT_INSTANCE><EventType>ALTER_TABLE</EventType><…

iOS--支付寶環境集成

1.下載支付寶SDK以及Demo https://doc.open.alipay.com/doc2/detail?treeId54&articleId103419&docType1 2.新建文件夾“AliSDK”&#xff0c;將壓縮包內的文件拷貝到該文件夾下&#xff0c;完成后如下圖所示&#xff1a; 3.將文件夾拷貝到項目中&#xff0c; 4.執行完…

再見,再見,5 * 60 * 1000 //五分鐘,再見,再見

在這篇文章中&#xff0c;我將討論一個在1.5版中首次引入的類&#xff0c;我使用了太多&#xff0c;但是與一些人交談&#xff0c;他們說他們不知道它的存在。 此類是TimeUnit 。 TimeUnit類表示給定粒度單位的持續時間&#xff0c;還提供了轉換為不同單位的實用方法以及執行計…

windows如何調用Linux的API,Windows和Native API中的系統調用?

最近&#xff0c;我在* NIX操作系統中使用了很多匯編語言。我想知道Windows域。Linux中的調用約定&#xff1a;mov $SYS_Call_NUM, %eaxmov $param1 , %ebxmov $param2 , %ecxint $0x80而已。這就是我們應該如何在Linux中進行系統調用。linux中所有系統調用的參考&#xff1a;關…

maven生命周期和插件

maven生命周期和插件 生命周期 maven的生命周期有三套&#xff0c;互相獨立。每個生命周期含有不同階段&#xff0c;常用如下 clean 清理項目 pre-clean 執行清理前需要完成的工作clean 清理上一次構建生成的文件post-clean 執行清理后需要完成的工作default 構建項目 validate…

Java EE 6測試第二部分– Arquillian和ShrinkWrap簡介

在Java EE 6測試的第一部分中&#xff0c;我簡要介紹了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API&#xff0c;以演示如何啟動該容器&#xff0c;如何在項目類路徑中查找bean以及運行非常簡單的集成測試。 這篇文章重點介紹Arquillian和ShrinkWrap以及為什么它們是用于企…

linux內存分配堆棧數據段代碼段,linux – LD_PRELOAD堆棧和數據段內存分配

你好,我正在編寫一個Linux模塊(基于名為“Ccontrol”的GitHub項目)來創建緩存分區(a.k.a頁面著色),以減輕定時側通道攻擊(用于防止Prime Probe等攻擊).我已經使用LD_PRELOAD系統env變量來覆蓋所有malloc(),calloc()和free()調用,并用顏色感知調用替換它們.現在我正在尋找顏色堆…

【騰訊Bugly干貨分享】Android內存優化總結實踐

本文來自于騰訊Bugly公眾號&#xff08;weixinBugly&#xff09;&#xff0c;未經作者同意&#xff0c;請勿轉載&#xff0c;原文地址&#xff1a;https://mp.weixin.qq.com/s/2MsEAR9pQfMr1Sfs7cPdWQ 導語 智能手機發展到今天已經有十幾個年頭&#xff0c;手機的軟硬件都已經發…

以編程方式向OpenJPA注冊實體類型

我剛剛開始為Isis開發 OpenJPA對象庫 。 在一般情況下&#xff0c;可以在persistence.xml文件中注冊實體類型。 但是&#xff0c;Isis是一個框架&#xff0c;可以構建自己的元模型&#xff0c;并且可以自行確定哪些類構成實體。 因此&#xff0c;我不想強??迫開發人員重復自己…

linux redis客戶端,Redisson 3.4.0和2.9.0發布,Redis客戶端

Redisson 3.4.0和2.9.0發布&#xff0c;Redis客戶端發布時間:2017-04-27 09:12:16來源:紅聯作者:baihuoRedisson于2017年4月26日發布了3.4.0和2.9.0版本Redisson是架設在Redis基礎上的一個Java駐內存數據網格(In-Memory Data Grid)。充分的利用了Redis鍵值數據庫提供的一系列優…

LeetCode 349 Intersection of Two Arrays

Given two arrays, write a function to compute their intersection. Example: Given nums1 [1, 2, 2, 1], nums2 [2, 2], return [2]. 思路&#xff1a; 利用ArrayList的contains(Object o)方法進行交集的查詢。 解法&#xff1a; 1 import java.util.ArrayList;2 3 publi…

shell腳本1——變量 $、read、``

與Shell變量相關的幾個命令&#xff1a; 變量只在當前Shell中生效. source 這個命令讓腳本影響他們父Shell的環境&#xff08;. 可以代替source命令&#xff09; export 這個命令可以讓腳本影響其子Shell的環境 () unset 從環境中刪除變量 其他幾個與變量有關的命令&#xff1…

令人印象深刻的第一個Apache Camel版本

為了準備下周的CamelOne會議&#xff0c;我花了一些時間回顧一下Apache Camel項目的歷史。 因此&#xff0c;除其他外&#xff0c;我了解了Apache Camel的第一個正式1.0版本 。 Apache Camel 1.0 – 5年前 我看的越多&#xff0c;這個版本的事實給我留下了深刻的印象。 現在您…

Linux禁用user01賬戶,Linux?管理用戶?useradd

創建用戶、設置密碼、修改用戶、刪除用戶&#xff1a;useradd testuser 創建用戶testuseruseradd [選項]useradd 命令選項-u uid:指定新用戶的uid,默認用當前最大uid加1-g group:指定新用戶所在的組(私有組),該組必須存在-G group:指定新用戶的附加組-d dir:指定新用戶的自家目…