已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学习资料收集于网络,仅供参考嵌入式系统原理及应用综合实验报告专业班级:姓名: 学 号:_时 间:_指导教师:_2017年 9 月 17 日嵌入式系统原理及应用综合实验报告摘要:信盈达电子有限公司产品信盈达智能穿戴开发平台,广泛应用于嵌入式生产实训教学中。该文通过分析STM32F40xxx系列微控制器的架构和操作原理,通过使用信盈达智能穿戴开发平台,给出了相关的编程设计方法和注意事项关键词:嵌入式 STM32 智能穿戴。1 引言IEEE(Institute of Electrical and Electronics Engineers,美国电气和电子工程师协会)对嵌入式系统的定义:“用于控制、监视或者辅助操作机器和设备的装置”。原文为:Devices Used to Control,Monitor or Assist the Operation of Equipment,Machinery or Plants)。嵌入式系统,通常指一种专用的计算机设备,或作为装置和设备的一部分,亦或是指单纯的一块控制电路板。事实上带有数字接口的设备都使用了嵌入式系统。从应用对象上加以定义,嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。本次实训采用了信盈达智能穿戴开发平台,通过为期一周的学习,快速掌握了STM32F40XXX系列微控制器的基础使用方法,并通过编程实现了相关的功能。2 总体设计方案2.1 设计思路2.1.1设计一个智能穿戴系统,实现下列功能:显示小组姓名、班级、学号;显示实时温度、湿度;测量并显示心率;测量并显示血压;返回初始界面。2.2 设计方框图3 系统硬件设计3.1 微控制器电路的设计图1 STM32F11微控制器电路3.2 按键电路的设计图2 按键电路3.3温湿度检测电路图3 SHT20温湿度检测电路SHT20是新一代sensirion湿度和温度传感器,采用数字输出方案,带有I2C接口,具有优异的长期稳定性,本电路采用I2C方案进行通讯。3.4 OLED显示电路图4 OLED显示电路平台搭载了一款13264大小的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)case 1: OLED_clear();name_page();break;case 2: OLED_clear();clock_page();break;case 3: OLED_clear();pulse_page();break;case 4:OLED_clear();bp_page();break;case 5:OLED_clear();kal_km_page();break; default:break;SPI程序:SPI 是一种全双工串行接口,英文全称: Serial Peripheral Interface,可处理多个连接到指定总线上的主机和从机。在数据传输过程中,总线上只能有一个主机和一个从机通信。在数据传输中,主机总是会向从机发送一帧 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 寄存器。 相关代码如下所示:void Spi1_init(void)RCC-AHB1ENR |= 1APB2ENR |= 1MODER &= (0X3F MODER |= 0X2A AFR0 &= (0XFFF AFR0 |= 0X555 OSPEEDR &= (0X3F OSPEEDR |= 0X2A CR1 = 0;SPI1-CR1 |= 3 CR1 |= 1 CR1 |= 4 CR1 |= 1 SR & (1DR = val;while (SPI1-SR & (1DR); SHT20芯片程序: #include iic.h #include delay.h#include sht20.h#define SHT20ADDR 0x80 /SHT20写地址#define ACK 0 /应答信号#define NACK 1 /非应答信号#define FAIL 1 /读取温湿度失败的返回值。#define READ_TEMP_COMD 0xf3 /读取温度命令#define READ_HUMI_COMD 0xf5 /读取湿度命令TempHumiValue_t temp_humi_Value;static void SHT20_setResolution(void);static void SHT20_setResolution(void);void SHT20_softReset(void);static u8 SHT20_writeOneByte(u8 dataToWrite)u8 ack; ack = IIC_WriteByte(dataToWrite); /发送字节return ack;void SHT20_softReset(void) IIC_Start(); /start I2CSHT20_writeOneByte(SHT20ADDR&0xfe); /I2C address + writeSHT20_writeOneByte(0xfe); /soft resetIIC_Stop(); /stop I2C void SHT20_Init(void)SHT20_softReset();static u8 SHT20_readOneByte(u8 ack)u8 temp;temp=IIC_ReadByte(ack); return temp;static void SHT20_setResolution(void) IIC_Start(); /Start I2C if(SHT20_writeOneByte(SHT20ADDR&0xfe)=ACK) /I2C address + write + ACK if(SHT20_writeOneByte(0xe6)=ACK) /写用户寄存器 if(SHT20_writeOneByte(0x83)=ACK); /设置分辨率 11bit RH% 测量时间:12ms(typ.) & 11bit T 测量时间:9ms(typ.) IIC_Stop(); /Stop I2C float SHT20_readTemOrHum(u8 commod)float temp; /温度u8 ack=1;u8 MSB,LSB; /温度、相对湿度的寄存器数据float Humidity,Temperature; /温湿度的转换结果SHT20_setResolution(); /设置帧率8bit,9bit,10 bit,11bit ,12bit,13bit,14bitIIC_Start(); /iic开始信号ack = SHT20_writeOneByte(SHT20ADDR&0xfe);if( ack = ACK ) /写地址,并等待ACK if(SHT20_writeOneByte(commod)=ACK) /写命令 dodelay_ms(6); /延时IIC_Start(); /发送开始信号while(SHT20_writeOneByte(SHT20ADDR|0x01)=NACK); /无应答则整形,还在测量中,如果有应答,则结束当前循环MSB = SHT20_readOneByte(ACK); /读Data(MSB),给应答ACKLSB = SHT20_readOneByte(ACK); /读Data(LSB),给应答ACKSHT20_readOneByte(NACK); /读Checksum ,不给应答NACK IIC_Stop(); /Stop I2CLSB &= 0xfc; /Data (LSB) 的后两位在进行物理计算前前须置0 temp = MSB*256 + LSB; /十六进制转成十进制if (commod=(u8)READ_HUMI_COMD) /命令为读取湿度的命令 /*- calculate relative humidity %RH -*/ Humidity =(temp*125)/65536-6; /公式: RH%= -6 + 125 * SRH/216return Humidity; /返回值:humidity else if(commod=(u8)READ_TEMP_COMD) /命令为读取温度的命令 /*- calculate temperature C -*/Temperature = (temp*175.72f)/65536-46.85f; /公式:T= -46.85 + 175.72 * ST/216return Temperature; /返回值:temperature return FAIL;TempHumiValue_t * SHT20_readTemAndHum(void)temp_humi_Value.humidity = SHT20_readTemOrHum(READ_HUMI_COMD);/读取湿度temp_humi_Value.temperature = SHT20_readTemOrHum(READ_TEMP_COMD);/读取湿度return &temp_humi_Value; OLED初始化程序: /初始化SSD1306 void Oled_init(void) OLED_pinInit(); OLED_deSelect(); /不选择OLEDOLED_reset();OLED_writeByte(0xAE,OLED_CMD);/-turn off oled panelOLED_writeByte(0x02,OLED_CMD);/-SET low column addressOLED_writeByte(0x10,OLED_CMD);/-SET high column addressOLED_writeByte(0x40,OLED_CMD);/-SET start line address SET Mapping RAM Display Start Line (0x000x3F)OLED_writeByte(0x81,OLED_CMD);/-SET contrast control registerOLED_writeByte(0xCF,OLED_CMD); / SET SEG Output Current BrightnessOLED_writeByte(0xA1,OLED_CMD);/-SET SEG/Column Mapping 0xa0左右反置 0xa1正常OLED_writeByte(0xC8,OLED_CMD);/SET COM/Row Scan Direction 0xc0上下反置 0xc8正常OLED_writeByte(0xA6,OLED_CMD);/-SET normal displayOLED_writeByte(0xA8,OLED_CMD);/-SET multiplex ratio(1 to 64)OLED_writeByte(0x3f,OLED_CMD);/-1/64 dutyOLED_writeByte(0xD3,OLED_CMD);/-SET display offSETShift Mapping RAM Counter (0x000x3F)OLED_writeByte(0x00,OLED_CMD);/-not offSETOLED_writeByte(0xd5,OLED_CMD);/-SET display clock divide ratio/oscillator frequencyOLED_writeByte(0x80,OLED_CMD);/-SET divide ratio, SET Clock as 100 Frames/SecOLED_writeByte(0xD9,OLED_CMD);/-SET pre-charge periodOLED_writeByte(0xF1,OLED_CMD);/SET Pre-Charge as 15 Clocks & Discharge as 1 ClockOLED_writeByte(0xDA,OLED_CMD);/-SET com pins hardware configurationOLED_writeByte(0x12,OLED_CMD);OLED_writeByte(0xDB,OLED_CMD);/-SET vcomhOLED_writeByte(0x40,OLED_CMD);/SET VCOM Deselect LevelOLED_writeByte(0x20,OLED_CMD);/-SET Page Addressing Mode (0x00/0x01/0x02)OLED_writeByte(0x02,OLED_CMD);/OLED_writeByte(0x8D,OLED_CMD);/-SET Charge Pump enable/disableOLED_writeByte(0x14,OLED_CMD);/-SET(0x10) disableOLED_writeByte(0xA4,OLED_CMD);/ Disable Entire Display On (0xa4/0xa5)OLED_writeByte(0xA6,OLED_CMD);/ Disable Inverse Display On (0xa6/a7) OLED_writeByte(0xAF,OLED_CMD);/-turn on oled panelOLED_writeByte(0xAF,OLED_CMD); /*display ON*/ OLED_clear();OLED_setPos(0,0); 5 结束语 通过本次为期五天的嵌入式实训,让我对上个学期学习的嵌入式相关只是有了深一步的了解。通过本次实验,我感觉收获还是蛮多的。可能我对于嵌入式的知识学习的还是不太多,但是这之外的东西收获颇丰。这就是一个自我学习的过程。当我们通过实验去学习理论知识时,自己动手得出的结论,不仅能加深我们对嵌入式的理解,更能加深我们对此的记忆。参考文献1陈志旺.STM32嵌入式微控制器快速上手(第二版).北京:电子工业出版社,2014.52嵌入式系统原理及应用.北京:北京邮电大学出版社,20093 桑楠.嵌入式系统原理及应用开发技术. 北京:北航大学出版社,2003附录电路原理图:Main.c程序#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#include hp6.h#include mpu6050.hu8 page = 0;void clock_page(void);void pulse_page(void);void bp_page(void);void step_page(void);void kal_km_page(void);int main()/裸机程序结构 delay_init(100);led_init();key_init();Spi1_init();Oled_init();IIC_PinInit();SHT20_Init();Hp_6_init(); /初始化HP6心率血压 模块 MPU_Init();/HP_6_VersionInfo();while (1)switch(page)case 0:OLED_clear(); kal_km_page();case 1: OLED_clear();clock_page();break;case 2: OLED_clear();pulse_page();break;case 3:OLED_clear();bp_page();break; default:break;void kal_km_page (void)while(1) OLED_showCHinese(0, 0, 0);OLED_showCHinese(16, 0, 1);OLED_showCHinese(32, 0, 2);OLED_showCHinese(48, 0, 3);OLED_showCHinese(64, 0, 4);OLED_showCHinese(80, 0, 5);OLED_showCHinese(0, 2, 6);OLED_showCHinese(16, 2, 7);OLED_showCHinese(32, 2, 8);OLED_showCHinese(48, 2, 9);OLED_showCHinese(64, 2, 10);OLED_showCHinese(80, 2, 11);if(key_scan()page = page +1; /切换到page1IIC_Stop();break; /跳出当前页面 void clock_page(void)TempHumiValue_t humi_temp_val ; /温湿度u8 uiBuf40; while(1)humi_temp_val = *SHT20_readTemAndHum();/获取温度sprintf(char*)uiBuf,%02dc %02d,(char)humi_temp_val.temperature,(char)humi_temp_val.humidity); / 以整数显示OLED_showString(10,6,uiBuf,16); OLED_showString(10+8*7,6,%,16); if(key_scan()page = page +1; /切换到page1IIC_Stop();break; /跳出当前页面 void pulse_page(void)static u8 oldPulseVal = 0; /上一次的心率值u8 uiBuf40; u8 pulseBuf24 = 0;HP_6_OpenRate(); /打开心率测量OLED_showString(10,4,pulse,16); while(1)/OLED_showString(10,4,pulse,16); / HP_6_GetRateResult();/HP_6_GetResultData(pulseBuf);/sprintf(char*)uiBuf,%03d,pulseBuf7); / /byte 7是心率结果/OLED_showString(10,6,uiBuf,16); /delay_ms(100);if(pulseBuf7 & pulseBuf7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2019粤教版 高中美术 必修1 美术鉴赏《第四单元 外国美术鉴赏》大单元整体教学设计2020课标
- 2024届河北省正定县七中3月高三一轮复习摸底考试(线上)数学试题
- 2024届贵州省铜仁市铜仁伟才学校高三寒假考试(一)数学试题
- 2024届广东顺德华侨中学招生全国统一考试内参模拟测卷(一)(全国3卷)数学试题
- 叉车三包维修合同模板
- 材料员劳动合同
- 玻璃吊装安全协议书范本
- 北京市政府合同管理办法
- 园区应急管理介绍
- 规划现状分析图
- 民用机场竣工验收质量评定标准
- 汽车应急启动电源项目商业计划书写作范文
- 浅谈“低起点-小步子-勤练习-快反馈”教学策略
- 双向细目表和单元测试卷及组卷说明
- 电缆桥架安装施工组织设计(完整版)
- 离子色谱法测定空气中二氧化硫
- 水蒸汽热力性质表
- 两癌筛查质控评估方案
- 汽车污染途径及其控制措施毕业论文
- 漫话链条 p p t
- 监理周报范本
评论
0/150
提交评论