河海大学计算机及信息工程学院(常州)
课程设计报告
题 目 物联网信息采集
专业、学号 通信工程1162310120
授课班号
学生姓名
指导教师 金纪东
完成时间
课程设计(报告)任务书
(理 工 科 类)
Ⅰ、课程设计(报告)题目:
Ⅱ、课程设计(论文)工作内容
一、课程设计目标
1、掌握AD数据采样的原理,同时在实验箱上实现串口输出;
2、掌握网络协议建立的原理;
3、将采样的数据能够在同一网络下通过浏览器查看;
4、培养学生理论联系实际的能力;
5、培养学生的自我学习和解决问题的能力;
6、培养学生的团队合作能力;
二、研究方法及手段应用
1、将任务分成若干模块,查阅相关论文资料,分模块调试和完成任务;
2、对已有程序认真阅读理解,并调试;
3、在独立思考的基础上,模仿已有程序根据自己想法改写程序;
4、反复编译调试、总结经验、排除差错;
三、课程设计预期效果
1、完成实验环境搭建;
2、掌握AD数据采样的原理,同时在实验箱上实现串口输出;
3、掌握网络协议建立的原理;
4、将采样的数据能够在同一网络下通过浏览器查看;
学生姓名: 刘国庆 专业年级: 11级通信工程
目录
前 言 ............................................................. 4
第一章 系统设计 ................................................... 5
第一节 课题目标及总体方案 ........................................ 5
第二节 系统简介................................................... 5
一. ZE-stm32v7e实验平台介绍 ................................. 5
二. ZE-stm32v7e硬件设计分类 .................................... 5
1.stm32v7e平台应用区域 ...................................... 5
2.无线传感协议区域 ........................................... 5
第三节 实验步骤................................................... 6
一.熟悉设备 ..................................................... 6
二.ADC数据采样 ................................................. 6
三.远程浏览器网页修改 ........................................... 7
四.ADC数据定位 ................................................. 7
第二章 实验(测试)结果及讨论 ..................................... 8
第一节 预期实验结果 .............................................. 8
第二节 实验出现的问题及调试 ...................................... 8
第三节 实验现象 .................................................. 9
第三章 结 论 ...................................................... 9
心得体会 ........................................................ 10
参考文献 .......................................................... 10
附 录 ............................................................ 11
前 言
物联网是新一代信息技术的重要组成部分,顾名思义,物联网就是物物相连
的互联网。它是一种利用局域网络或互联网等通信技术把传感器、控制器、机器、
人员和物等通过新的方式连在一起,形成人与物、物与物相连,实现信息化、远
程管理控制和智能化的网络。
而嵌入式系统是综合了计算机软硬件、传感器技术、集成电路技术、电子应
用技术为一体的复杂技术。经过几十年的演变,以嵌入式系统为特征的智能终端
产品随处可见;小到人们身边的MP3、手机,大到航天航空的卫星系统,嵌入式
系统正在改变着人们的生活,推动着工业生产以及国防工业的发展。如果把物联
网用人体做一个简单比喻,传感器相当于人的眼睛、鼻子、皮肤等感官,网络就
是神经系统用来传递信息,嵌入式系统则是人的大脑,在接收到信息后进行分类
处理。可见嵌入式系统的应用广泛,并在物联网中占有重要的位置和作用。
目前嵌入式系统技术已经成为了最热门的技术之一,吸引了大批的优秀人才
投入其中。通过本次实验,让我们充分认识嵌入式系统与物联网系统的联系,并
且了解网络协议在嵌入式系统中的应用及编程方法,掌握AD采样数据在浏览器
查看过程中的定位、显示。
第一章 系统设计
第一节 课题目标及总体方案
物联网技术的发展对现代社会各个领域都有着重要的作用,本课题目的是
AD数据采集,在实验平台上提供web服务,相当于服务器,PC机上可以访问
IP地址来查看采集的数据,具体框图如下:
192.168.0.8 192.168.0.100
平台与PC通过网线连接,PC设置与服务器同一局域网下的IP,在浏览器中访
问服务器IP以查看采集的数据值。
第二节 系统简介
一. ZE-stm32v7e实验平台介绍
ZE-stm32v7e实验平台是一款高端的多功能嵌入式教学产品,能够学习ARM
开发的嵌入式知识,以及各种主流无线传感协议IPV6、Zigbee、WIFI、Bluetooth
等,通过构建项目案例来实现感知层(传感器技术/嵌入式技术)、传输层(WSN
无线传感网/IPV6无线传感网/Zigbee无线传感网/WIFI无线传感网/Bluetooth
无线传感网)、网关层(嵌入式Linux /ZIGBEE/IPv6)等教学解决方案。
二. ZE-stm32v7e硬件设计分类
1. STM32V7E平台应用区域
1) 采用高性能的ST STM32F107处理器,主频72MHz,Flash 256KB,
4.3寸真彩液晶屏,分辨率480*272,带4.3寸触摸屏。
2) 1个4*4的可编程扫描键盘,2个可编程按键,4个可编程LED灯,1个RTC,
1个JTAG&DEBUG接口;
3) 集成丰富的外围扩展接口,4路RS232串口(一个调试串口,另外三个
串口分别作为LCD触摸屏、GSM、ZIGBEE和RFID使用),集成以太网
接口、音频接口、CAN、485、蜂鸣器和外接ADC接口等外设。
4) 提供两组12PIN传感器应用扩展接口,包含以下信号:串口、SPI、IIC、
GPIO(可用于中断)、ADC接口、PWM接口,5V/3.3V电源;
5) 板载集成GSM通信插座,无线ZIGBEE通信插座、无线RFID通信插座;
6) 软件上采用嵌入式操作系统Contiki-OS,提供Contiki系统的一些基础实
验、基于Contiki系统的无线通信实验和基于Contiki系统的综合DEMO实
验。
2. 无线传感协议区域:
1) 无线传感协议区域包含6组无线传感网节点,每组无线传感网节点包含四
个部分:STM32嵌入式底板、无线节点核心板、传感器接口板、LCD显
示板;
2) 可以配置四组不同无线协议的节点:IPV6、Zigbee、WIFI、Bluetooth;
3) 实验平台提供稳定的12V稳压电源,可以支持6组无线传感节点和
STM32V7E平台同时工作。
4) 每个无线传感网节点的STM32嵌入式底板包含一个ARM Cortex-M3
STM32F103处理器芯片,提供稳定的5V/3.3V电源输入,4个可编程按
键,4个可编程LED灯,1个RTC,1个JTAG&DEBUG接口,1个LCD接
口,1个24PIN的传感器接口;
第三节 实验步骤
一.熟悉设备
本实验使用实验教学系统STM32V7E平台实验箱,应用的主要是利用实验箱
的应用扩展接口,利用ADC的14通道对开发板上单圈电位器的电压值作AD转换,
并通过串口输出到PC机上。实验前根据已给的实验例程,掌握串口数据的传送
和查看,以及网络建立的基本过程。
二.ADC数据采样
1. 程序修改
在ADC配置中加入时钟信号,以使数据采样过程中能够实时性采集
2. 线路连接
将实验平台和PC机通过串口线,网线,J-Link相连,设置PC机的网络
IPV4地址(IP地址初始化为192.168.0.100,子网掩码255.255.255.0),
编译下载程序,运行PC机上CMD输入ping 192.168.0.8查看网络连接是否
正常。
3. 浏览器查看
打开浏览器,在地址栏中输入192.168.0.8查看ADC采集界面是否有数
据跳动。
三.远程浏览器网页修改
由于实验例程中给的ADC采样只有一个进度条,为了更加直观,我们把数据
显示加入到浏览的网页中。
打开fs.c下的fsdata.c文件找到data_STM32_StatusBar_html网页的十六
进制编码。
通过先前的修改,将新网页的十六进制编码替换。
四.ADC数据定位
在httpd.c中查找AD数据转换的相关公式,利用软件Ultraedit在网页中
定位数据显示的位置,将具体的偏移数值对httpd.c进行修改,同时添加数值显
示位以初始化数值。在其他的文件中进行相应的修改(必要时可在main中添加
延时),使数值能够正常显示。
第二章 实验(测试)结果及讨论
第一节 预期实验结果
网络建立,浏览器访问192.168.0.8进入ADC数据界面,有进度条和数值的
跳动,并且在一定的范围内变化。
第二节 实验出现的问题及调试
1. 根据步骤连接电脑和实验箱,浏览器无法连接。解决方法:查看线路是否连
接完好,PC的网络连接Ipv4地址是否正确。
2. 浏览器中查看数据的进度条固定,并不跳变。解决方法:修改时钟,在main.c
中加入延时。
3. 浏览器跳变的数据显示位置不正确。解决方法: 改正httpd.c中数据的偏
移量。
第三节 实验现象
在浏览器中输入192.168.0.8后点击进入ADC数据采集界面,网页中显示如
下界面:
其中进度条和中间的数据是实时跳变的。
第三章 结 论
本次课设实现的物联网信息采集是物联网技术中比较简单的,现代社会中应
用传感、RFID进行物联网建立,无线通信的设计可以在此基础上进行扩展,发
散创新。整个程序的基础是实验平台自带的例程,通过对程序各个模块的理解,
以及通过修改程序实现课题的功能,对网络建立和AD数据采集的原理都有了一
定的了解。
心得体会
由于嵌入式课程课时有限,我们所掌握的知识并不够,只能参考已给的实
验例程,进行学习。并且通过翻阅许多资料,以及请教学长,对于物联网技术和
嵌入式系统技术也有了一定的了解。通过对实验例程的程序进行编译理解,
从最初的对程序的局部修改,到最后我们逐渐掌握了如何建立网络,使用
网络协议和AD数据采集。这个过程我们收获了许多!在最初阅读程序过程
中,我们根据已给的英文注释,再加上先前对嵌入式系统课程的学习,一
条条上网查阅资料,对于程序的理解也不断的深入。
在编写程序过程中,尤其是AD数据的显示部分的定位,在网页浏览器
中很多次都不能正常显示,然后就在偏移量上一位一位的尝试,仍然没有
很好的效果。在同学之间的讨论中,借鉴其他组的Ultraedit软件,进行
精确的定位,使本项工作事半功倍,同时也说明了合作的重要性。
当浏览器上显示出跳变的数据时,我们内心的喜悦溢于言表。通过此
次课设我不仅对嵌入式的开发有了更加深刻的了解,更对理论联系实际,
以及团队合作与分工,自学能力的重要性有了新的认识。这次课设,为我
以后的发展打下了基础,积累了经验。
在此真诚地感谢老师的指导!谢谢!
参考文献
[1] 王勇,何立民.嵌入式系统原理与设计.杭州:浙江大学大学出版社,2007.
[2] 王田苗.嵌入式系统设计与实例开发[M].北京:清华大学出版社,2003.1-10
[3] 刘强 崔莉 陈海明.物联网关键技术与应用 《计算机科学》2010年6月
附 录
一、 程序:
Main.c:
#include "stm32f10x.h"
#include <stdio.h>
#include "uart.h"
#include "delay.h"
#include "eth.h"
int main(void)
{
/* System Clocks Configuration */
delay_init(72);
uart2_init();
eth_init();
/* uIP stack main loop */
uIPMain();
/* Infinite loop */
while (1)
{
}
}
eth.c: //各种端口初始化配置
#include "stm32f10x.h"
#include "stm32_eval.h"
#include "stm32_eth.h"
#include <stdio.h>
#include "uip.h"
#include "stm32f10x_adc.h"
#include "uart.h"
#include "delay.h"
#include "eth.h"
/* Private define ------------------------------------------------------------*/
#define MESSAGE1 " STM32 ETH EXAMPLE "
#define MESSAGE2 " Line Device "
#define MESSAGE3 "WebServer Demo based"
#define MESSAGE4 " on uIP "
#define MESSAGE5 " IP address is: "
#define MESSAGE6 " 192.168.0.8 "
#define DP83848_PHY /* Ethernet pins mapped on STM3210C-EVAL Board */
#define PHY_ADDRESS 0x0100 /* Relative to STM3210C-EVAL Board */
//#define MII_MODE /* MII mode for STM3210C-EVAL Board (MB784)
(check jumpers setting) */
#define RMII_MODE /* RMII mode for STM3210C-EVAL Board (MB784)
(check jumpers setting) */
#define ETH_RXBUFNB 8
#define ETH_TXBUFNB 2
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
ETH_InitTypeDef ETH_InitStructure;
/* Ethernet Rx & Tx DMA Descriptors */
ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB],
DMATxDscrTab[ETH_TXBUFNB];
/* Ethernet buffers */
u8 Rx_Buff[ETH_RXBUFNB][ETH_MAX_PACKET_SIZE],
Tx_Buff[ETH_TXBUFNB][ETH_MAX_PACKET_SIZE];
ErrorStatus HSEStartUpStatus;
vu32 Value = 0;
void RCC_Configuration(void)
{
/* Enable ETHERNET clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC |
RCC_AHBPeriph_ETH_MAC_Tx |
RCC_AHBPeriph_ETH_MAC_Rx, ENABLE);
/* Enable GPIOs clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE|
RCC_APB2Periph_AFIO, ENABLE);
}
/**
* @brief Configures the different GPIO ports.
* @param None
* @retval None
*/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* ETHERNET pins configuration */
/* AF Output Push Pull:
- ETH_MII_MDIO / ETH_RMII_MDIO: PA2
- ETH_MII_MDC / ETH_RMII_MDC: PC1
- ETH_MII_TX_EN / ETH_RMII_TX_EN: PB11
- ETH_MII_TXD0 / ETH_RMII_TXD0: PB12
- ETH_MII_TXD1 / ETH_RMII_TXD1: PB13 */
/* Configure PA2 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure PC1 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Configure PB11, PB12 and PB13 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/**************************************************************/
/* For Remapped Ethernet pins */
/*************************************************************/
/* Input (Reset Value):
- ETH_MII_RX_CLK / ETH_RMII_REF_CLK: PA1
- ETH_MII_RX_DV / ETH_RMII_CRS_DV: PD8
- ETH_MII_RXD0 / ETH_RMII_RXD0: PD9 */
/* Configure PA1 as input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure PD8, PD9, PD10 as input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
/**
* @brief Configures the ADC.
* @param None
* @retval None
*/
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined
(STM32F10X_HD_VL)
/* ADCCLK = PCLK2/2 */
RCC_ADCCLKConfig(RCC_PCLK2_Div2);
#else
/* ADCCLK = PCLK2/4 */
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
#endif
/* Enable ADC1 and GPIOB clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 |
RCC_APB2Periph_GPIOB, ENABLE);
/* ADC1 Configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel14 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1,
ADC_SampleTime_13Cycles5);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
/**
* @brief Configures the nested vectored interrupt controller.
* @param None
* @retval None
*/
void NVIC_Configuration(void)
{
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
}
void eth_init()
{
/* Initialize LEDs
**********************************************************/
STM_EVAL_LEDInit(LED1);
STM_EVAL_LEDInit(LED2);
STM_EVAL_LEDInit(LED3);
STM_EVAL_LEDInit(LED4);
RCC_Configuration();
/* NVIC configuration */
NVIC_Configuration();
/* ADC configuration */
ADC_Configuration();
/* ETHERNET pins remapp in STM3210C-EVAL board: RX_DV and RxD[3:0] */
GPIO_PinRemapConfig(GPIO_Remap_ETH, ENABLE);
/* MII/RMII Media interface selection */
#ifdef MII_MODE /* Mode MII with STM3210C-EVAL */
GPIO_ETH_MediaInterfaceConfig(GPIO_ETH_MediaInterface_MII);
/* Get HSE clock = 25MHz on PA8 pin(MCO) */
RCC_MCOConfig(RCC_MCO_HSE);
#elif defined RMII_MODE /* Mode RMII with STM3210C-EVAL */
GPIO_ETH_MediaInterfaceConfig(GPIO_ETH_MediaInterface_RMII);
/* Get HSE clock = 25MHz on PA8 pin(MCO) */
/* set PLL3 clock output to 50MHz (25MHz /5 *10 =50MHz) */
RCC_PLL3Config(RCC_PLL3Mul_10);
/* Enable PLL3 */
RCC_PLL3Cmd(ENABLE);
/* Wait till PLL3 is ready */
while (RCC_GetFlagStatus(RCC_FLAG_PLL3RDY) == RESET)
{}
/* Get clock PLL3 clock on PA8 pin */
RCC_MCOConfig(RCC_MCO_PLL3CLK);
#endif
/* Configure the GPIO ports */
GPIO_Configuration();
/* Reset ETHERNET on AHB Bus */
ETH_DeInit();
/* Software reset */
ETH_SoftwareReset();
/* Wait for software reset */
while(ETH_GetSoftwareResetStatus()==SET);
/* ETHERNET Configuration ------------------------------------------------------*/
/* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */
ETH_StructInit(Ð_InitStructure);
/* Fill ETH_InitStructure parametrs */
/*------------------------ MAC -----------------------------------*/
ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable ;
// ETH_InitStructure.ETH_Speed = ETH_Speed_100M; ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
// ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable; ETH_InitStructure.ETH_AutomaticPadCRCStrip =
ETH_AutomaticPadCRCStrip_Disable; ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable;