实验9
嵌入式软件设计第9次实验报告
学号:120201109 姓名:陈瑶
组别:第4组 实验地点: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时,会忽略这些信息。
实验过程:完成Web服务器端发送RTC实时时钟信息以及按键(KEY2、KEY1)按键次数的任务。
网页页面设计:
<HTML>
<HEAD>
<META http-equiv="refresh" content="1">
<TITLE>嵌入式Web服务器测试网页</TITLE>
</HEDA>
<BODY>
<DIV align = "center">
<TABLE border = "3" cellpadding="15">
<CAPTION><H3>RTC实时时钟<H3></CAPTION>
<TR>
<TD width="200">现在时间</TD>
<TD width="200"><!--#time--></TD>
</TR>
<TR>
<TD width="200">现在日期</TD>
<TD width="200"><!--#date--></TD>
</TR>
<TR>
<TD width="200">Key2</TD>
<TD width="200"><!--#key2--></TD>
</TR>
<TR>
<TD width="200">key1</TD>
<TD width="200"><!--#key1--></TD>
</TR>
</TABLE>
</DIV>
</BODY>
</HTML>
实验代码设计:(main函数设计)
#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();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);//PE2
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);//PE3
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;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
system_init();
{
RTC_InitTypeDef RTC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_LSEConfig(RCC_LSE_ON);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
RCC_RTCCLKCmd(ENABLE);
while(RTC_Wait_Synchro());
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_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();
while(1)
{
lwip_periodic_handle();
//printf("asdfsadfsadfinit\n");
}
}
u16_t SSIHandler(int iIndex,char *pcInsert,int iInsertLen)
{
switch(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);
}
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';
}
}
Pin通设备,运行结果:
运行后显示界面:
四、总结及实验心得:
通过本次实验我学习到了WWW技术中使用SSI(Server Side Include)技术编写代码把当前开发板内RTC的时钟、日期数据以及开发板的按键(KEY2、KEY1)次数信息送往PC机浏览器显示。
每一次实验都让我有许多收获,今天又学习到了新的内容。通过网页设计及嵌入式编码的编写实现了时钟与日期的数据运行,还有开发板按键的次数信息的显示。让我更进一步学习了SSI技术,我渐渐的明白了要想学好专业课,熟练掌握相关软件的运用也是非常重要的。所以,在条件允许的情况下,我想在以后的学习过程中结合课程过多的做相关实验的设计。或用不同方法来实现同一功能。最后感谢老师的辅导及积极的教学方法,相信在老师的正确带领下,我们定会实现这门课的进一步提高,无论是在理论上还是在运用上都会有很大的收获,感谢老师!