嵌入式綜合實驗周_第1頁
嵌入式綜合實驗周_第2頁
嵌入式綜合實驗周_第3頁
嵌入式綜合實驗周_第4頁
嵌入式綜合實驗周_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選文檔嵌入式系統(tǒng)原理及應用綜合試驗報告專業(yè)班級:姓名: 學 號:_時 間:_指導老師:_2017年 9 月 17 日嵌入式系統(tǒng)原理及應用綜合試驗報告摘要:信盈達電子有限公司產(chǎn)品信盈達智能穿戴開發(fā)平臺,廣泛應用于嵌入式生產(chǎn)實訓教學中。該文通過分析STM32F40xxx系列微把握器的架構和操作原理,通過使用信盈達智能穿戴開發(fā)平臺,給出了相關的編程設計方法和留意事項關鍵詞:嵌入式 STM32 智能穿戴。1 引言IEEE(Institute of Electrical and Electronics Engineers,美國電氣和電子工程師協(xié)會)對嵌入式系統(tǒng)的定義:“用于把握、監(jiān)視或者幫助操作機器和

2、設備的裝置”。原文為:Devices Used to Control,Monitor or Assist the Operation of Equipment,Machinery or Plants)。嵌入式系統(tǒng),通常指一種專用的計算機設備,或作為裝置和設備的一部分,亦或是指單純的一塊把握電路板。事實上帶有數(shù)字接口的設備都使用了嵌入式系統(tǒng)。從應用對象上加以定義,嵌入式系統(tǒng)是軟件和硬件的綜合體,還可以涵蓋機械等附屬裝置。國內普遍認同的嵌入式系統(tǒng)定義為:以應用為中心,以計算機技術為基礎,軟硬件可裁剪,適應應用系統(tǒng)對功能、牢靠性、成本、體積、功耗等嚴格要求的專用計算機系統(tǒng)。本次實訓接受了信盈達智能穿

3、戴開發(fā)平臺,通過為期一周的學習,快速把握了STM32F40XXX系列微把握器的基礎使用方法,并通過編程實現(xiàn)了相關的功能。2 總體設計方案2.1 設計思路2.1.1設計一個智能穿戴系統(tǒng),實現(xiàn)下列功能:顯示小組姓名、班級、學號;顯示實時溫度、濕度;測量并顯示心率;測量并顯示血壓;返回初始界面。2.2 設計方框圖3 系統(tǒng)硬件設計3.1 微把握器電路的設計圖1 STM32F11微把握器電路3.2 按鍵電路的設計圖2 按鍵電路3.3溫濕度檢測電路圖3 SHT20溫濕度檢測電路SHT20是新一代sensirion濕度和溫度傳感器,接受數(shù)字輸出方案,帶有I2C接口,具有優(yōu)異的長期穩(wěn)定性,本電路接受I2C方案

4、進行通訊。3.4 OLED顯示電路圖4 OLED顯示電路平臺搭載了一款132×64大小的OLED屏幕。OLED是有機發(fā)光二極管的縮寫,又稱有機電激光顯示、有機發(fā)光半導體。其具有自發(fā)光、廣視角、超高對比度、低耗電的優(yōu)良性能,為一種高端的顯示設備。4 系統(tǒng)軟件設計圖5 系統(tǒng)流程圖相關程序編寫:main函數(shù)所需頭文件:#include "stm32f4xx.h"#include "key.h"#include "led.h"#include "exti.h"#include "uart.h"

5、#include "delay.h"#include "timer.h"#include "oled.h"#include "spi.h"#include "bmp.h"#include "iic.h"#include "sht20.h"按鍵程序:在main函數(shù)中,按鍵程序接受switch語句,按下后累計按下次數(shù),以此選擇軟件功能模塊。switch(page)case 1: OLED_clear();name_page();break;case 2: OL

6、ED_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,可處理多個連接到指定總線上的主機和從機。在數(shù)據(jù)傳輸過程中,總線上只能有一個主機和一個從機通信。在數(shù)據(jù)傳輸中,主機總是會向從機發(fā)送一幀 8到 16 個位的數(shù)據(jù),而從機也總

7、會向主機發(fā)送一幀字節(jié)數(shù)據(jù)。“全雙工”意義為:主機、從機同時給對方發(fā)送數(shù)據(jù)。 SPI,是一種高速的,全雙工, 同步的通信總線(“同步” 的意思是數(shù)據(jù)傳輸需要時鐘線),并且在芯片的管腳上只占用四根線,“信盈達智能穿戴設備開發(fā)平臺”上的 OLED 屏使用的是 SPI 接口。SPI 把握器的初始化步驟有以下幾步:(1) 使能 SPI 復用功能所映射的 GPIO 口時鐘。(2) SPI 把握器時鐘使能。(3) 配置 GPIO 為復用功能。( MOSI/MISO/CLK)(4) GPIO 復用功能為第幾復用功能( AFx)。(5) 配置 GPIO 輸出速率為 50MHz。(6) 配置 SPIx->C

8、R1 寄存器。 相關代碼如下所示:void Spi1_init(void)RCC->AHB1ENR |= 1<<1;/PB時鐘使能 RCC->APB2ENR |= 1<<12;/SPI1 /* PB3/4/5 AF5功能 */GPIOB->MODER &= (0X3F << 6);GPIOB->MODER |= 0X2A << 6;GPIOB->AFR0 &= (0XFFF << 12);GPIOB->AFR0 |= 0X555 << 12;/ af5功能GPIOB-&g

9、t;OSPEEDR &= (0X3F << 6);/ io輸出速度 50MHZGPIOB->OSPEEDR |= 0X2A << 6;/* SPI1配置 */ SPI1->CR1 = 0;SPI1->CR1 |= 3 << 8;/SSM SSISPI1->CR1 |= 1 << 2;/主模式/SPI1->CR1 |= 4 << 3;/速度 100/64 MHZSPI1->CR1 |= 1 << 6;/使能SPI1u8 Spi1_RevSendByte(u8 val)while (

10、SPI1->SR & (1<<1) = 0);/等待發(fā)送緩存區(qū)為空SPI1->DR = val;while (SPI1->SR & (1<<0) = 0);/等待接收緩存區(qū)非空return (SPI1->DR); SHT20芯片程序: #include "iic.h" #include "delay.h"#include "sht20.h"#define SHT20ADDR 0x80 /SHT20寫地址#define ACK 0 /應答信號#define NACK 1 /

11、非應答信號#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_

12、WriteByte(dataToWrite); /發(fā)送字節(jié)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_

13、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.)

14、IIC_Stop(); /Stop I2C float SHT20_readTemOrHum(u8 commod)float temp; /溫度u8 ack=1;u8 MSB,LSB; /溫度、相對濕度的寄存器數(shù)據(jù)float Humidity,Temperature; /溫濕度的轉換結果SHT20_setResolution(); /設置幀率8bit,9bit,10 bit,11bit ,12bit,13bit,14bitIIC_Start(); /iic開頭信號ack = SHT20_writeOneByte(SHT20ADDR&0xfe);if( ack = ACK ) /寫地址,

15、并等待ACK if(SHT20_writeOneByte(commod)=ACK) /寫命令 dodelay_ms(6); /延時IIC_Start(); /發(fā)送開頭信號while(SHT20_writeOneByte(SHT20ADDR|0x01)=NACK); /無應答則整形,還在測量中,假如有應答,則結束當前循環(huán)MSB = SHT20_readOneByte(ACK); /讀Data(MSB),給應答ACKLSB = SHT20_readOneByte(ACK); /讀Data(LSB),給應答ACKSHT20_readOneByte(NACK); /讀Checksum ,不給應答NAC

16、K 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_TEM

17、P_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_

18、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_wri

19、teByte(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_C

20、MD);/-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);/-

21、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-char

22、ge 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

23、(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);

24、/ 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 結束語 通過本次為期五天的嵌入式實訓,讓我對上個學期學習的嵌入式相關只是有了深一步的了解。通過本次試驗,我感覺收獲還是蠻多的。可能我對于嵌入式的學問學習的還是不太多,但是這之外的東西收獲頗豐。這就是一個自我學習的過程。當我們通過試驗去學習理論學問時,自己動手得出的

25、結論,不僅能加深我們對嵌入式的理解,更能加深我們對此的記憶。參考文獻1陳志旺.STM32嵌入式微把握器快速上手(其次版).北京:電子工業(yè)出版社,2014.52嵌入式系統(tǒng)原理及應用.北京:北京郵電高校出版社,20093 桑楠.嵌入式系統(tǒng)原理及應用開發(fā)技術. 北京:北航高校出版社,2003附錄電路原理圖:Main.c程序#include "stm32f4xx.h"#include "key.h"#include "led.h"#include "exti.h"#include "uart.h"#in

26、clude "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.h"u8 page = 0;void clock_page(void);void pulse_page(void);vo

27、id 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_clea

28、r();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,

29、 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 uiBuf4

30、0; while(1)humi_temp_val = *SHT20_readTemAndHum();/獵取溫度sprintf(char*)uiBuf,"%02dc %02d",(char)humi_temp_val.temperature,(char)humi_temp_val.humidity); / 以整數(shù)顯示OLED_showString(10,6,uiBuf,16); OLED_showString(10+8*7,6,"%",16); if(key_scan()page = page +1; /切換到page1IIC_Stop();break;

31、/跳出當前頁面 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); /dela

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論