嵌入式软件设计第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.mzph.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:指定新用户的自家目…