嵌入式综合实验周.docx
《嵌入式综合实验周.docx》由会员分享,可在线阅读,更多相关《嵌入式综合实验周.docx(20页珍藏版)》请在冰豆网上搜索。
![嵌入式综合实验周.docx](https://file1.bdocx.com/fileroot1/2022-10/13/29919c1c-f584-4f15-a41e-766bc717a55e/29919c1c-f584-4f15-a41e-766bc717a55e1.gif)
嵌入式综合实验周
嵌入式系统原理及应用
综合实验报告
专业班级:
姓 名:
学号:
__
时间:
_
指导教师:
_____________
2017年9月17日
嵌入式系统原理及应用
综合实验报告
摘要:
信盈达电子产品——信盈达智能穿戴开发平台,广泛应用于嵌入式生产实训教学中。
该文通过分析STM32F40xxx系列微控制器的架构和操作原理,通过使用信盈达智能穿戴开发平台,给出了相关的编程设计方法和注意事项
关键词:
嵌入式STM32智能穿戴
。
1引言
IEEE(InstituteofElectricalandElectronicsEngineers,美国电气和电子工程师协会)对嵌入式系统的定义:
“用于控制、监视或者辅助操作机器和设备的装置”。
原文为:
DevicesUsedtoControl,MonitororAssisttheOperationofEquipment,MachineryorPlants)。
嵌入式系统,通常指一种专用的计算机设备,或作为装置和设备的一部分,亦或是指单纯的一块控制电路板。
事实上带有数字接口的设备都使用了嵌入式系统。
从应用对象上加以定义,嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。
国普遍认同的嵌入式系统定义为:
以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
本次实训采用了信盈达智能穿戴开发平台,通过为期一周的学习,快速掌握了STM32F40XXX系列微控制器的基础使用方法,并通过编程实现了相关的功能。
2总体设计方案
2.1设计思路
2.1.1
设计一个智能穿戴系统,实现下列功能:
显示小组、班级、学号;显示实时温度、湿度;测量并显示心率;测量并显示血压;返回初始界面。
2.2设计方框图
3系统硬件设计
3.1微控制器电路的设计
图1STM32F11微控制器电路
3.2按键电路的设计
图2按键电路
3.3温湿度检测电路
图3SHT20温湿度检测电路
SHT20是新一代sensirion湿度和温度传感器,采用数字输出方案,带有I2C接口,具有优异的长期稳定性,本电路采用I2C方案进行通讯。
3.4OLED显示电路
图4OLED显示电路
平台搭载了一款132×64大小的OLED屏幕。
OLED是有机发光二极管的缩写,又称有机电激光显示、有机发光半导体。
其具有自发光、广视角、超高对比度、低耗电的优良性能,为一种高端的显示设备。
4系统软件设计
图5系统流程图
相关程序编写:
①main函数所需头文件:
#include"stm32f4xx.h"
#include"key.h"
#include"led.h"
#include"exti.h"
#include"uart.h"
#include"delay.h"
#include"timer.h"
#include"oled.h"
#include"spi.h"
#include"bmp.h"
#include"iic.h"
#include"sht20.h"
②按键程序:
在main函数中,按键程序采用switch语句,按下后累计按下次数,以此选择软件功能模块。
switch(page)
{
case1:
OLED_clear();
name_page();
break;
case2:
OLED_clear();
clock_page();
break;
case3:
OLED_clear();
pulse_page();
break;
case4:
OLED_clear();
bp_page();
break;
case5:
OLED_clear();
kal_km_page();
break;
default:
break;
}
③SPI程序:
SPI是一种全双工串行接口,英文全称:
SerialPeripheralInterface,可处理多个连接到指定总线上的主机和从机。
在数据传输过程中,总线上只能有一个主机和一个从机通信。
在数据传输中,主机总是会向从机发送一帧8到16个位的数据,而从机也总会向主机发送一帧字节数据。
“全双工”意义为:
主机、从机同时给对方发送数据。
SPI,是一种高速的,全双工,同步的通信总线(“同步”的意思是数据传输需要时钟线),并且在芯片的管脚上只占用四根线,“信盈达智能穿戴设备开发平台”上的OLED屏使用的是SPI接口。
SPI控制器的初始化步骤有以下几步:
(1)使能SPI复用功能所映射的GPIO口时钟。
(2)SPI控制器时钟使能。
(3)配置GPIO为复用功能。
(MOSI/MISO/CLK)
(4)GPIO复用功能为第几复用功能(AFx)。
(5)配置GPIO输出速率为50MHz。
(6)配置SPIx->CR1寄存器。
相关代码如下所示:
voidSpi1_init(void)
{
RCC->AHB1ENR|=1<<1;//PB时钟使能
RCC->APB2ENR|=1<<12;//SPI1
/*PB3/4/5AF5功能*/
GPIOB->MODER&=~(0X3F<<6);
GPIOB->MODER|=0X2A<<6;
GPIOB->AFR[0]&=~(0XFFF<<12);
GPIOB->AFR[0]|=0X555<<12;//af5功能
GPIOB->OSPEEDR&=~(0X3F<<6);//io输出速度50MHZ
GPIOB->OSPEEDR|=0X2A<<6;
/*SPI1配置*/
SPI1->CR1=0;
SPI1->CR1|=3<<8;//SSMSSI
SPI1->CR1|=1<<2;//主模式
//SPI1->CR1|=4<<3;//速度100/64MHZ
SPI1->CR1|=1<<6;//使能SPI1
}
u8Spi1_RevSendByte(u8val)
{
while((SPI1->SR&(1<<1))==0)
{
;//等待发送缓存区为空
}
SPI1->DR=val;
while((SPI1->SR&(1<<0))==0)
{
;//等待接收缓存区非空
}
return(SPI1->DR);
}
④SHT20芯片程序:
#include"iic.h"
#include"delay.h"
#include"sht20.h"
#defineSHT20ADDR0x80//SHT20写地址
#defineACK0//应答信号
#defineNACK1//非应答信号
#defineFAIL1//读取温湿度失败的返回值。
#defineREAD_TEMP_COMD0xf3//读取温度命令
#defineREAD_HUMI_COMD0xf5//读取湿度命令
TempHumiValue_ttemp_humi_Value;
staticvoidSHT20_setResolution(void);
staticvoidSHT20_setResolution(void);
voidSHT20_softReset(void);
staticu8SHT20_writeOneByte(u8dataToWrite)
{
u8ack;
ack=IIC_WriteByte(dataToWrite);//发送字节
returnack;
}
voidSHT20_softReset(void)
{
IIC_Start();//startI2C
SHT20_writeOneByte(SHT20ADDR&0xfe);//I2Caddress+write
SHT20_writeOneByte(0xfe);//softreset
IIC_Stop();//stopI2C
}
voidSHT20_Init(void)
{
SHT20_softReset();
}
staticu8SHT20_readOneByte(u8ack)
{
u8temp;
temp=IIC_ReadByte(ack);
returntemp;
}
staticvoidSHT20_setResolution(void)
{
IIC_Start();//StartI2C
if(SHT20_writeOneByte(SHT20ADDR&0xfe)==ACK)//I2Caddress+write+ACK
{
if(SHT20_writeOneByte(0xe6)==ACK)//写用户寄存器
{
if(SHT20_writeOneByte(0x83)==ACK);//设置分辨率11bitRH%测量时间:
12ms(typ.)&11bitT℃测量时间:
9ms(typ.)
}
}
IIC_Stop();//StopI2C
}
floatSHT20_readTemOrHum(u8commod)
{
floattemp;//温度
u8ack=1;
u8MSB,LSB;//温度、相对湿度的寄存器数据
floatHumidity,Temperature;//温湿度的转换结果
SHT20_setResolution();//设置帧率8bit,9bit,10bit,11bit,12bit,13bit,14bit
IIC_Start();//iic开始信号
ack=SHT20_writeOneByte(SHT20ADDR&0xfe);
if(ack==ACK)//写地址,并等待ACK
{
if(SHT20_writeOneByte(commod)==ACK)//写命令
{
do
{
delay_ms(6);//延时
IIC_Start();//发送开始信号
}while(SHT20_writeOneByte(SHT20ADDR|0x01)==NACK);//无应答则整形,还在测量中,如果有应答,则结束当前循环
MSB=SHT20_readOneByte(ACK);//读Data(MSB),给应答ACK
LSB=SHT20_readOneByte(ACK);//读Data(LSB),给应答ACK
SHT20_readOneByte(NACK);//读Checksum,不给应答NACK
IIC_Stop();//StopI2C
LSB&=0xfc;//Data(LSB)的后两位在进行物理计算前前须置‘0’
temp=MSB*256+LSB;//十六进制转成十进制
i