版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章鸿蒙系统应用开发基础本章主要讲述鸿蒙系统应用开发基础知识。通过学习本节将能够了解鸿蒙系统的开发基础知识。通过本节学习可以:了解物联网系统了解Hi3861芯片了解OpenHarmony鸿蒙系统物联网系统概述华为海思Hi3861芯片概述鸿蒙系统概述物联网系统概述物联网(InternetofThings,IoT):把所有物品通过信息传感器与互联网连接起来,实现智能化识别和管理的万物互联网络。物联网系统概述物联网应用领域智能家居物联网技术驱动家用电器智能化,通过各类智能设备实现远程控制,提升家居舒适度和生活便利性。健康管理通过物联网技术,智能设备实时监测健康指标,提供专业运动建议和疾病防治方案,助力科学健身和疾病预防。智慧城市助力城市交通、环境监测、市政管理智能化,实现节能减排,提升城市可持续发展能力,改善市民生活质量。产业促进5G技术为车联网提供了更高速、更可靠的网络连接;同时人工智能、大数据、云计算等技术的深度融合。计算机系统硬件架构基本上是由CPU、
内存、外存、输入设备和输出设备等五个部件组成计算机系统嵌入式系统是以计算机系统技术为中心,综合考虑产品需求、成本、功耗、可靠性等特性,而定制软硬件资源的计算机系统。嵌入式系统PC-计算机系统手机-计算机系统物联网系统是以嵌入式系统为基础,加入各种传感器与联网设备构造而成。物联网系统9物联网系统概述华为海思Hi3861芯片概述鸿蒙系统概述Hi3861是华为海思基于开源的RISC-VCPU架构推出集成Wi-Fi网络的物联网低功耗主控芯片Hi3861芯片概述123456智能照明环境监测智慧城市智能家电智能门锁智能安防Hi3861产品应用
CPU:32bit高性能CPU,最大工作频率160MHz
内存:内置SRAM352KB
外存:内存ROM288KB与2MBFlash
输入/输出设备接口:1个SDIOSlave接口、2个SPI接口、2个I2C接口、3个UART接
口、15个GPIO接口、7路ADC输入、6路PWM、1个I2S接口
内置Wi-Fi:2.4GHz频段、支持IEEE802.11b/g/n、支持加密WFAWPA/WPA2personal/WPS2.0协议、支持最大速率72.2MbpsHi3861功能特性Hi3861开发板(1/3)除Hi3861主控芯片电路外,还提供了LED、按键、触摸LCD屏接口、type-c的USB转UART接口等。Hi3861开发板(2/3)核心板原理图Hi3861开发板(3/3)LED和按键的电路原理图物联网系统概述华为海思Hi3861芯片概述鸿蒙系统概述OpenHarmony是华为向开放原子开源基金会捐赠的一整套开源操作系统项目,它是鸿蒙操作系统的基础版本,提供了一个完整的、基于微内核的分布式操作系统框架,具有多种操作系统内核、多种网络协议、图形界面框架及文件系统等功能模块。鸿蒙系统概述鸿蒙系统架构18鸿蒙系统类型LiteOS-M内核鸿蒙系统架构LiteOS-A内核鸿蒙系统架构Linux内核鸿蒙系统架构请简述物联网系统与嵌入式系统的关系。请简述OpenHarmony系统的三种类型。
描述了计算机系统、嵌入式系统、物联网系统间的关系。讲述了Hi3861芯片的功能特性。讲述了OpenHarmony鸿蒙系统的三种类型。谢谢25鸿蒙系统设备开发基础本章主要讲述鸿蒙设备开发环境的搭建。通过学习本节将能够了解鸿蒙系统设备开发环境的搭建。通过本节学习可以熟悉:VSCode的安装devicetool鸿蒙插件安装设备开发的SDK下载设备开发所需的工具集下载和UART接口驱动安装VSCode的安装devicetool鸿蒙插件安装SDK下载工具集下载和UART接口驱动安装VSCode安装(1/3)VisualStudioCode(VSCode)是一款功能强大的、免费开源的源代码编辑软件,它支持所有主流的开发语言,并在集成的插件市场上提供各种功能插件。鸿蒙系统利用VSCode的插件机制,实现了设备开发流程的全面支持。在VSCode官网下载Windows系统版本软件VSCode安装(2/3)下载完成后执行VSCodeUserSetup-x64-1.92.0.exe后,根据向导使用默认设置逐步完成安装操作。安装步骤完成后,启动VSCode,安装必要的设备开发插件VSCode安装(3/3)“C/C++”插件用于实现VSCode对鸿蒙系统C语言源文件的支持。“GN”插件用于实现VSCode对鸿蒙系统的*.gn编译配置文件的支持。“IncludeAutoComplete”插件实现源程序头文件名的自动补全。VSCode的安装devicetool鸿蒙插件安装SDK下载工具集下载和UART接口驱动安装devicetool鸿蒙插件安装(1/2)在鸿蒙系统官网下载Windows系统版本后得到“devicetool-windows-tool-00.zip”压缩包。解压压缩包后,运行“devicetool-windows-tool-00.exe”安装程序。devicetool鸿蒙插件安装(2/2)鸿蒙设备开发的VSCode插件完成安装后,在VSCode的插件列表中显示出相关的插件并在窗口左侧新增了一个“DevEco”页框按钮VSCode的安装devicetool鸿蒙插件安装SDK下载工具集下载和UART接口驱动安装SDK下载安装完Git程序后,
在命令行窗口执行命令:gitclone/HiSpark/hi3861_hdu_iot_application下载完成后,得到的适配Hi3861的鸿蒙系统工程源码VSCode的安装devicetool鸿蒙插件安装SDK下载工具集下载和UART接口驱动安装工具集下载鸿蒙设备开发所需的编译器等相关的工具在华为官网的下载地址:/DevTools_Hi3861V100_v1.0.zip下载并解压缩开发工具包后,放在较浅层次的目录中且重命名文件夹UART驱动安装执行“D:\development\Hi3861\hi3861-tools\usb_serial_driver\CH341SER.EXE”完成驱动安装。安装完成并通过数据线连接开发板与PC机后,在系统的设备管理器即可查看到对应的COM口请简述devicetool与VSCode的关系。
讲述了VSCode的安装。讲述了devicetool插件的安装。讲述了设备开发的SDK下载。讲述了设备开发的工具集下载。讲述了开发板UART接口的驱动安装。本章主要讲述Hi3861工程源码开发基础。通过学习本节将能够学习Hi3861工程源码开发基础。通过本节学习可以熟悉:工程源码导入工程配置工程源码编译工程程序烧录工程程序调试工程加入程序代码工程源码导入工程配置工程源码编译工程程序烧录工程程序调试工程加入程序代码工程源码导入(1/3)工程源码导入(2/3)在首次导入工程源码时会弹出设置窗口,设置源码工程所用的主控芯片为HI3861即可,其他两项设置会自动适配。工程源码导入(3/3)工程具体源文件目录与用途工程源码导入工程配置工程源码编译工程程序烧录工程程序调试工程加入程序代码工程配置工程源码导入工程配置工程源码编译工程程序烧录工程程序调试工程源码编译点击“Build”或“Rebuild”按钮进行编译。Rebuild会清除所有已编译文件并重新编译,适用于新增或删除工程源文件时;使用Build,它只会更新这些修改过的文件。工程源码导入工程配置工程源码编译工程程序烧录工程程序调试工程加入程序代码工程程序烧录点击“Upload”待TERMINAL窗口上输出提示后,则按开发板的RESET键后启动通过UART接口传输并烧录程序文件。工程源码导入工程配置工程源码编译工程程序烧录工程程序调试工程加入程序代码工程程序调试点击“Monitor”以启动UART接收功能,此时开发板会通过UART接口返回相关信息。工程源码导入工程配置工程源码编译工程程序烧录工程程序调试工程加入程序代码工程加入程序代码在VSCode源文件浏览器上选中“app”文件夹后,右键菜单选择“NewFolder...”创建myhello子目录,并通过“NewFile...”右键菜单创建myhello_demo.c源文件工程加入程序代码Myhello_demo.c输入代码:#include<stdio.h>
//提供printf函数#include<ohos_init.h>//提供SYS_RUN/APP_FEATURE_INIT宏定义voidmyhelloInit()//自定义的入口函数{
printf("myhelloinit\n");}//指定在鸿蒙系统的应用层执行入口函数APP_FEATURE_INIT(myhelloInit);
//指定在鸿蒙系统的系统服务层执行入口函数//SYS_RUN(myhelloInit);工程加入程序代码在myhello目录下创建BUILD.gn文件,并输入内容:#指定编译目标名为myhello_test,生成静态库libmyhello_test.astatic_library("myhello_test"){#指定程序是由哪些源文件组成,当多个源文件时由","分隔sources=["myhello_demo.c"]#指定头文件所在路径include_dirs=["//utils/native/lite/include",]}工程加入程序代码修改app目录下BUILD.gn文件内容:import("//build/lite/config/component/lite_component.gni")lite_component("app"){features=[#"startup",#注释不参与编译的程序#格式:"子目录名:子目录BUILD.gn中定义的目标名""myhello:myhello_test"]}工程加入程序代码Build编译工程时在终端输出:将程序烧录至开发板后,执行Monitor程序并重启开发板,随后即可在终端中查看到“myhelloinit”的输出信息。请简述开发板USB线的作用。
讲述了工程源码导入操作。讲述了工程的配置。讲述了工程源码的编译。讲述了工程程序烧录方法。讲述了工程程序调试方法。讲述了工程中加入程序代码的方法本章主要讲述鸿蒙设备GPIO应用开发。通过学习本节将能够了解鸿蒙系统设备GPIO应用开发。通过本节学习可以熟悉:华为海思的GPIO操作函数鸿蒙系统的GPIO操作函数鸿蒙系统的GPIO中断处理华为海思的GPIO操作函数鸿蒙系统的GPIO操作函数鸿蒙系统的GPIO中断处理华为海思的GPIO操作函数(1/7)
GPIO(GeneralPurposeInput/Output,通用输入输出口)主要作为输入或输出功能使用,当需要用代码主动控制GPIO输出高低电平时,GPIO应当设置输出功能;当需要通过GPIO获取连接设备输出的高低电平时,GPIO应当设置输入功能。Hi3861芯片手册中GPIO_03GPIO的用途选择寄存器:华为海思的GPIO操作函数(2/7)LED连接到GPIO_02引脚,GPIO_02应当被配置为输出功能。当GPIO_02引脚输出高电平时,LED亮;而当GPIO_02输出低电平时,LED熄。华为海思的GPIO操作函数(3/7)Hi3861共有15个多功能的GPIO,在鸿蒙工程中的hi_io.h头文件,芯片厂家已定义好表示每个GPIO的枚举常量:typedefenum{HI_IO_NAME_GPIO_0,//表示GPIO0...HI_IO_NAME_GPIO_14,//表示GPIO14...}hi_io_name;由此可见,HI_IO_NAME_GPIO_2对应着GPIO_02引脚。华为海思的GPIO操作函数(4/7)
在hi_io.h头文件中,也定义一系列的枚举常量描述每个GPIO可选择使用的功能,例如GPIO_02的功能描述为:typedefenum{
HI_IO_FUNC_GPIO_2_GPIO,
//该引脚可作为通用GPIO,用于连接输入输出高低电平的设备。
HI_IO_FUNC_GPIO_2_UART1_RTS_N=2,
//该引脚可作为第1个UART控制器的硬件流控功能引脚。
HI_IO_FUNC_GPIO_2_SPI1_TXD,
//作为第1个SPI控制器的数据发送引脚
HI_IO_FUNC_GPIO_2_JTAG_TRSTN,
//作为连接JTAG调试器的功能引脚
HI_IO_FUNC_GPIO_2_PWM2_OUT,
//作为第2个PWM控制器信号输出引脚
HI_IO_FUNC_GPIO_2_SSI_CLK=7,
//作为SSI控制器的时钟输出引脚}hi_io_func_gpio_2;华为海思的GPIO操作函数(5/7)Hi3861的每个GPIO都是多用途功能的,但某一时刻只能选择其中一种功能。同时在hi_io.h头文件中提供了设置GPIO用途的函数:
hi_u32hi_io_set_func(hi_io_nameid,hi_u8val);用法:由于GPIO_2仅需通过输出高低电平即可实现控制LED的亮灭,因此应将GPIO_02引脚配置为GPIO引脚用途,相应的设置代码如下:
hi_io_set_func(HI_IO_NAME_GPIO_2,HI_IO_FUNC_GPIO_2_GPIO);若要使GPIO默认保持高低电平状态,可以配置GPIO的上下拉功能,该功能由hi_io.h头文件中的配置函数提供:
hi_u32hi_io_set_pull(hi_io_nameid,hi_io_pullval);用法:如设置GPIO_02引脚默认处于高电平状态,则设置上拉的代码应当如下:hi_io_set_pull(HI_IO_NAME_GPIO_2,HI_IO_PULL_UP);华为海思的GPIO操作函数(6/7)typedefenum{HI_GPIO_IDX_0,//表示GPIO0...HI_GPIO_IDX_14,//表示GPIO14}hi_gpio_idx;与hi_io.h中GPIO的枚举常量相对应,也可以直接使用hi_io.h中的常量用于设置id对应的GPIO选择dir值指定的输入或输出功能,注意IO须设置GPIO用途。hi_u32hi_gpio_set_dir(hi_gpio_idxid,hi_gpio_dirdir);typedefenum{HI_GPIO_DIR_IN=0,//表示输入
HI_GPIO_DIR_OUT//表示输出
}hi_gpio_dir;
表示输入与输出功能的枚举类型华为海思的GPIO操作函数(7/7)设置id对应的GPIO输出val值指定的高或低电平,注意GPIO须设置输出功能hi_u32hi_gpio_set_ouput_val(hi_gpio_idxid,hi_gpio_valueval);typedefenum{HI_GPIO_VALUE0=0,//表示低电平HI_GPIO_VALUE1//表示高电平}hi_gpio_value;表示GPIO电平状态的枚举类型获取id对应的GPIO输出电平状态,val参数为一个hi_gpio_value变量的地址,用于存放电平状态值hi_u32hi_gpio_get_output_val(hi_gpio_idxid,hi_gpio_value*val);获取id对应的GPIO输入电平状态,val参数为hi_gpio_value类型变量的地址,用于存放获取的电平状态hi_u32hi_gpio_get_input_val(hi_gpio_idxid,hi_gpio_value*val)华为海思的GPIO操作函数鸿蒙系统的GPIO操作函数鸿蒙系统的GPIO中断处理鸿蒙系统的GPIO操作函数(1/2)
鸿蒙系统在iot_gpio.h头文件中提供了大量以IoT开头命名的通用操作函数申请并标记使用id对应的GPIO,在多人协同开发中避免重复使用同一个IOunsignedintIoTGpioInit(unsignedintid);申请成功返回IOT_SUCCESS(值0),失败返回IOT_FAILURE
设置指定id对应的GPIO功能,dir指定的输入或输出功能unsignedintIoTGpioSetDir(unsignedintid,IotGpioDirdir);typedefenum{
IOT_GPIO_DIR_IN=0,
//表示输入
IOT_GPIO_DIR_OUT
//表示输出}IotGpioDir;输入输出类型鸿蒙系统的GPIO操作函数(2/2)
typedefenum{IOT_GPIO_VALUE0=0,//表示低电平IOT_GPIO_VALUE1//表示高电平}IotGpioValue;
在IoT函数中表示GPIO电平状态的枚举类型设置id对应的GPIO输出val指定的高低电平unsignedintIoTGpioSetOutputVal(unsignedintid,IotGpioValueval);获取id对应的GPIO输出电平状态,并将输出的电平值存入val指向的变量unsignedintIoTGpioGetOutputVal(unsignedintid,IotGpioValue*val);获取id对应的GPIO输入电平状态,并将获取的电平值存入val指向的变量unsignedintIoTGpioGetInputVal(unsignedintid,IotGpioValue*val);华为海思的GPIO操作函数鸿蒙系统的GPIO操作函数鸿蒙系统的GPIO中断处理鸿蒙系统的GPIO中断处理(1/2)
只要GPIO的电平状态符合设定的中断触发条件,
系统就会暂停当前工作而执行GPIO中断处理函数,中断处理函数执行完成后,系统会恢复之前的工作。Hi3861的GPIO共有4种中断触发条件,可设置GPIO电平在高电平、低电平、下降沿(从高电平变成低电平的过程)与上升沿(从低电平变成高电平的过程)状态时触发中断。鸿蒙系统的GPIO中断处理(2/2)
在iot_gpio.h中提供的IoTGpioRegisterIsrFunc函数注册并设定GPIO的中断触发条件、中断处理函数等。unsignedintIoTGpioRegisterIsrFunc(unsignedintid,IotGpioIntTypeintType,IotGpioIntPolarityintPolarity,GpioIsrCallbackFuncfunc,char*arg);参数列表:id:用于指定GPIOintType:指定中断类型
值IOT_INT_TYPE_LEVEL表示电平(高/低电平)触发中断
值IOT_INT_TYPE_EDGE表示边沿(上升/下降沿)触发中断intPolarity:指定中断触发的电平状态
值IOT_GPIO_EDGE_FALL_LEVEL_LOW表示低电平或下降沿状态触发中断,具体由intType中断类型指定
值IOT_GPIO_EDGE_RISE_LEVEL_HIGH表示高电平或上升沿状态触发中断func:指定IO中断处理函数,函数原型:voidirqFunc(char*arg)arg:指定IO中断处理函数的arg参数返回值:成功返回IOT_SUCCESS,失败返回IOT_FAILURE请简述对于GPIO操作函数,使用hixxx与IoTxxx的区别是什么?
讲述了华为海思的GPIO操作函数。讲述了鸿蒙系统的GPIO操作函数。讲述了鸿蒙系统的GPIO中断处理。本章主要讲述鸿蒙系统PWM应用开发。通过学习本节将能够了解鸿蒙系统PWM应用开发。通过本节学习可以熟悉:PWM工作原理鸿蒙系统PWM函数蜂鸣器的PWM驱动PWM信号原理鸿蒙系统PWM函数PWM应用案例PWM信号原理(1/3)PWM(PulseWidthModulation,脉冲宽度调制)基本上就是在一个重复的信号周期内分别控制高低电平的持续时间PWM信号原理(2/3)信号周期:是指从一个上升沿到下一个上升沿信号(或从下降沿到下一个下降沿)的间隔时间。信号频率:是指在一秒钟内有多少个PWM的信号周期,如100Hz表示一秒钟内有100个信号周期,则每个信号周期时间为10毫秒,同样根据信号周期时间也可推算出频率。占空比:是指在一个信号周期中,表示有效电平(通常是高电平)在整个周期时间中的比例,如信号周期时间为100毫秒而高电平持续时间为10毫秒,则占空比为10%。PWM信号三要素:PWM信号原理(3/3)PWM调节LCD屏背光:PWM信号原理鸿蒙系统PWM函数PWM应用案例鸿蒙系统PWM函数(1/3)Hi3861芯片提供了6个PWM控制器,Hi3861芯片每个IO都可以作为PWM控制器的信号输出引脚,IO具体所属的PWM控制可以在鸿蒙工程中的hi_io.h头文件中查看相应的定义,如GPIO_03的用途定义:typedefenum{...
HI_IO_FUNC_GPIO_3_PWM5_OUT,//作为第5个PWM控制器信号输出引脚}hi_io_func_gpio_3;鸿蒙系统PWM函数(2/3)hi_pwm.h中已定义表示PWM控制器的枚举常量:typedefenum{HI_PWM_PORT_PWM0=0,HI_PWM_PORT_PWM1=1,HI_PWM_PORT_PWM2=2,HI_PWM_PORT_PWM3=3,HI_PWM_PORT_PWM4=4,HI_PWM_PORT_PWM5=5,HI_PWM_PORT_MAX}hi_pwm_port;鸿蒙系统PWM函数(3/3)iot_pwm.h头文件也提供了PWM的操作函数:unsignedintIoTPwmInit(unsignedintport);//初始化PWM控制器//设置并启动第port个PWM控制器unsignedintIoTPwmStart(unsignedintport,unsignedshortduty,unsignedintfreq);//freq参数是用于设置PWM输出的信号频率,因PWM控制默认使用CPU160MHz作为时钟信号源,需要除以一个分频系数才能得到PWM信号的频率,而且PWM配置寄存器只能存储16位的分频系数(最大值为65535),所以PWM输出的信号频率必须大于2442Hz(160000000Hz/65535)。//参数duty设置占空比unsignedintIoTPwmStop(unsignedintport);停止port对应的控制器输出PWM信号PWM信号原理鸿蒙系统PWM函数PWM应用案例PWM应用案例(1/3)
蜂鸣器的发声利用了电磁感应与振动产生声音的原理,当不同大小与方向的电流通过线圈时产生一个变化的磁场,当产生的磁场与磁体同向时相排斥时,纸盒则会被向外推,而当产生的磁场与磁体异向时相吸引,纸盒则被向内拉,正是这种反复交替的推拉动作,让纸盒产生振动而发出声音。PWM应用案例(2/3)蜂鸣器模块通过杜邦线与开发板的连接:PWM应用案例(3/3)蜂鸣器模块的PWM驱动主过程:
IoTGpioInit(BUZZER_IO);//申请使用IO
hi_io_set_func(BUZZER_IO,BUZZER_IOFUNC);//设置IO用途
IoTPwmInit(BUZZER_PWM);//初始化PWM控制器
IoTPwmStart(BUZZER_PWM,50,freq);//设置PWM控制器的占空比与频率,并启动控制器
IoTPwmStop(BUZZER_PWM);//停止PWM控制器
IoTPwmDeinit(BUZZER_PWM);//释放PWM控制器的使用请简述PWM信号的三要素。
讲述了PWM工作原理讲述了鸿蒙系统PWM函数讲述了蜂鸣器的PWM驱动本章主要讲述鸿蒙系统ADC应用开发。通过学习本节将能够了解鸿蒙系统ADC应用开发。通过本节学习可以熟悉:ADC工作原理鸿蒙系统ADC函数ADC应用案例ADC信号原理鸿蒙系统ADC函数ADC应用案例ADC信号原理(1/2)
物联网系统电路中广泛采用数字信号与模拟信号。数字信号通过高电平代表二进制1,低电平代表二进制0,在数字电路中传输数据;而模拟信号则在模拟电路中,以低电平至高电平间的任意电压值来表示信号的大小或强度。
光敏电阻模块通过AO输出一个表示当前亮度的电压值,当感应到亮度越强时,AO输出的电压值越小,反之,AO输出的电压值就越大。ADC信号原理(2/2)采样率:是指一秒钟内检测电路电压的次数,ADC采样率越高则信号的还原度更高,反之,过低的采样率可导致丢失信号变化的关键过程。Hi3861ADC的最大采样率为157KHz。量化精度:量化是指将采样得到电压值转换成二进制值的过程,此二进制值的最大位数就是量化精度。越高的量化精度,ADC转换的结果就更加精确。Hi3861ADC的量化精度为12bit,其中最低两位用于小数。ADC信号的关键要素:ADC信号原理鸿蒙系统ADC函数ADC应用案例鸿蒙系统ADC函数(1/4)Hi3861的ADC共有8个模拟电压的输入通道,除了通道7专用于检测电源的电压外,其他0~6通道分别对应一个不同的IO:鸿蒙系统ADC函数(2/4)hi_adc.h头文件中,已经定义了表示各个ADC通道的枚举常量以及相应的操作函数:typedefenum{HI_ADC_CHANNEL_0,...HI_ADC_CHANNEL_7,}hi_adc_channel_index;hi_u32hi_adc_read(hi_adc_channel_indexchannel,hi_u16*data,hi_adc_equ_model_selequ_model,hi_adc_cur_baiscur_bais,hi_u16delay_cnt);//获取ADC转换结果参数列表:channel:表示ADC选择的输入通道data:用于存放转换结果的变量的地址equ_mode:为提高数据的准确性而选择使用的平均算法模式,可选:HI_ADC_EQU_MODEL_1,/*不使用平均算法,直接取转换结果*/HI_ADC_EQU_MODEL_8,/*ADC转换8次后,取平均值作为结果*/cur_bais:用于设置ADC基准电压值,可选:HI_ADC_CUR_BAIS_1P8V,/*选择1.8V作为基准电压*/HI_ADC_CUR_BAIS_3P3V,/*选择3.3V作为基准电压*/delay_cut:为了确保转换电压值的稳定,设置等待时间,一次计数是334ns,其值需在0~4080之间
函数返回值:成功返回HI_ERR_SUCCESS(0),失败返回非0的错误码hi_floathi_adc_convert_to_voltage(hi_u16data);//将ADC转换结果再转换成对应的电压值
参数data为要转换成电压值的数值,函数返回值为带小数的电压值,如2.2V。
鸿蒙系统ADC函数(3/4)鸿蒙系统ADC函数(4/4)熊派开发板厂商提供的头文件iot_adc.h中,也提供获取ADC转换结果的函数:unsignedintIoTAdcRead(unsignedintchannel,unsignedshort*data,IotAdcEquModelSelequModel,IotAdcCurBaiscurBais,unsignedshortrstCnt);此函数的功能、参数与hi_adc.h中hi_adc_read函数基本一致。ADC信号原理鸿蒙系统ADC函数ADC应用案例ADC应用案例(1/2)
光敏电阻传感器能够检测周围环境的光线亮度,它的电阻值会随着光照强度的变化而变化,环境亮度越强时传感器的电阻值越低;亮度越弱或处于暗处时传感器的电阻值越大。ADC应用案例(2/2)
光敏电阻传感器主要驱动过程
:
IoTGpioInit(SENSOR_IO);//初始化IO口
hi_io_set_func(SENSOR_IO,SENSOR_IOFUNC);//配置IO功能为GPIO
IoTGpioSetDir(SENSOR_IO,IOT_GPIO_DIR_IN);//ADC引脚配置为输入
//获取ADC4转换结果,使用转换8次平均算法,3.3V基准电压,等待3340ns后开始转换
ret=hi_adc_read(ADC_CHANNEL,&val,HI_ADC_EQU_MODEL_8,HI_ADC_CUR_BAIS_3P3V,10);
//将ADC转换结果再转换成电压值
vol=hi_adc_convert_to_voltage(val);请简述ADC信号的关键要素。
讲述了ADC工作原理讲述了鸿蒙系统ADC函数讲述了光敏电阻模块的ADC驱动本章主要讲述智能烟雾警报器的项目开发。通过学习本节将能够了解智能烟雾警报器的项目开发。通过本节学习可以熟悉:项目架构烟雾传感器继电器项目架构烟雾传感器模块继电器模块主程序项目架构(1/2)项目架构(2/2)项目程序流程图:项目架构烟雾传感器模块继电器模块主程序烟雾传感器模块(1/2)
烟雾传感器模块可以根据当前环境侦测到可燃气体的浓度,通过DO引脚输出高低电平表示感应到可燃气体与否(灵敏度可在模块的旋转电位器上调节);通过AO输出一个表示当前可燃气体的浓度值,浓度越高,AO输出的电压值越大,反之,AO输出的电压值就越小。烟雾传感器模块(2/2)烟雾传感器接入开发板:项目架构烟雾传感器模块继电器模块主程序继电器模块(1/2)
继电器实现通过低电压控制高电压的功能:继电器模块(2/2)继电器模块接入开发板:项目架构烟雾传感器模块继电器模块主程序主程序
通过定时改变PWM信号的占空比,让LED灯光从弱到强,再从强到弱的过程,实现呼吸灯的效果。接着通过ADC转换烟雾传感器模块输出的电压值,从而获取当前环境可燃气体的浓度数据,然后根据浓度数据控制声光警报器的开关。主要实现步骤:1.IO口初台化:
(1)烟雾传感器IO设置(2)继电器IO设置(3)LED的PWM设置2.循环处理:(1)LED灯PWM定时改变占空比
(2)定时获取烟雾浓度
(3)根据浓度数据控制继电器讲述了智能烟雾警报器的项目架构讲述了烟雾传感器的应用开发讲述了继电器的应用谢谢128鸿蒙系统设备开发进阶本章主要讲述鸿蒙系统多线程应用开发。通过学习本节将能够了解鸿蒙多线程应用开发技术。通过本节学习可以熟悉:多线程工作原理与用途CMSIS多线程编程POSIX多线程编程多线程应用案例-多线程烟雾警报器多线程工作原理CMSIS多线程编程POSIX多线程编程多线程应用案例-多线程烟雾警报器多线程工作原理
线程是操作系统能够进行任务调度的最小单位,也是一个程序中并行执行的分支。
每个线程有自己的工作函数与不同的执行路径,且每个线程都独自拥有在内存上分配局部变量的栈空间,但同属一个程序的多个线程共享此程序的全局变量等资源。
在多核多线程的主控芯片上,通常由操作系统优先调度线程的任务由一个CPU硬件线程来完成,如果硬件线程资源不足则与单核单线程的主控芯片一样,采用时间片的调度方式来实施线程的并行执行多线程工作原理CMSIS多线程编程POSIX多线程编程多线程应用案例-多线程烟雾警报器CMSIS多线程编程(1/2)
CMSIS(CortexMicrocontrollerSoftwareInterfaceStandard)标准的多线程编程接口。CMSIS多线程函数在cmsis_os2.h头文件中已声明,具体的编程步骤如下:1.
定义线程执行的函数CMSIS线程函数原型:void(*func)(void*arg),其中arg是在函数执行时附带的参数值,线程在创建时除指定arg参数值外,还需指定线程要执行的函数名。线程创建成功后自动执行线程函数。2.
设置线程属性
在CMSIS多线程编程中,使用osThreadAttr_t结构体变量描述线程的名称、栈大小、优先级别等属性值,参考代码如下:
osThreadAttr_tattr;//声明描述线程属性的结构体变量memset(&attr,0,sizeof(attr));//将结构体变量的全部属性值清零
="myLed";//设置线程名
attr.stack_size=1024;//设置线程所用的栈大小
attr.priority=osPriorityNormal1;//设置线程优先级别CMSIS多线程编程(2/2)
3.
线程管理在CMSIS多线程编程中,使用osThreadNew函数创建线程,函数原型:osThreadId_tosThreadNew(osThreadFunc_tfunc,void*arg,constosThreadAttr_t*attr)
其中func参数用于指定线程函数名,arg参数用于指定当线程函数执行时得到的参数值,attr参数用于指定使用的线程属性值。使用上一步骤设置的线程属性,创建一个线程执行呼吸灯处理函数的代码如下:osThreadId_ttid=osThreadNew(myLedThreadFunc,NULL,&attr);函数osThreadNew执行成功返回线程的id,通过此线程id,可以通过以下函数管理线程:osStatus_tosThreadSuspend(osThreadId_ttid);//设置tid线程暂停执行osStatus_tosThreadResume(osThreadId_ttid);//设置tid线程恢复执行osStatus_tosThreadTerminate(osThreadId_ttid);//结束tid线程的执行多线程工作原理CMSIS多线程编程POSIX多线程编程多线程应用案例-多线程烟雾警报器POSIX多线程编程(1/3)
POSIX(PortableOperatingSystemInterface)标准多线程在pthread.h头文件提供相关操作的函数声明,具体的编程步骤如下:1.
定义线程执行的函数POSIX线程与CMSIS线程功能一致,它的函数原型为:void*(*func)(void*arg),其中arg是在函数执行时附带的参数值,线程函数执行结束返回一个地址。POSIX多线程编程(2/3)2.
设置线程属性
使用pthread_attr_t结构体变量描述线程的属性,并通过函数设置线程的属性值,常用的函数有:
pthread_attr_tattr;//声明线程属性结构体变量
intpthread_attr_init(pthread_attr_t*attr);//初始化线程结构体变量
intpthread_attr_setstacksize(pthread_attr_t*attr,size_tsize);
//在线程属性结构体变量中设置线程栈大小。
intpthread_attr_setschedpolicy(pthread_attr_t*attr,intpolicy);
//在线程属性结构体变量中设置线程的调度算法
policy参数可选:
SCHED_OTHER(默认值):分时调度算法,每个线程得到相同的执行时间
SCHED_FIFO:工作队列调度算法,一个线程执行完才会执行下一个线程
SCHED_RR:轮流调度算法,以分时为基础,结合线程优先级别进行调度
//在线程属性结构体变量中设置线程的优先级别
intpthread_attr_setschedparam(pthread_attr_t*attr,conststructsched_param*param);
用法:先创建一个sched_param类型的结构体变量,
并为其内部的sched_priority成员赋一个表示级别的int类型值(数值越大则级别越高),然后执行此函数并传递此sched_param变量的地址。
POSIX多线程编程(3/3)3.
线程管理在POSIX多线程编程中,使用pthread_create函数创建线程,函数原型:intpthread_create(pthread_t*tid,constpthread_attr_t*attr,void*(*func)(void*),void*arg);
其中tid参数用于存放线程id的pthread_t变量地址,attr参数用于指定使用的线程属性值,func参数指定线程执行的函数,arg参数用于指定当线程函数执行时得到的参数值,函数执行成功返回0,失败则返回小于0的错误码。pthread_tpthread_self(void);//获取当前线程的id//当线程函数执行结束后,通过此函数回收指定id的线程资源,并通过retval参数接收线程函数的返回值intpthread_join(pthread_ttid,void**retval);//设置指定id的线程名称,name为线程名称intpthread_setname_np(pthread_ttid,constchar*name);//获取指定id的线程名称,
获取的名称存入buf数组中,buflen参数为buf数组的长度intpthread_getname_np(pthread_ttid,char*buf,size_tbuflen);多线程工作原理CMSIS多线程编程POSIX多线程编程多线程应用案例-多线程烟雾警报器多线程应用案例(1/2)
通过多线程并行执行与模块化开发的技术,由一个线程专门实现呼吸灯的功能,再由另一个线程循环检测烟雾传感器,当数据异常时及时发出警报。在工程源码的myhello目录下,创建myledThread.c源文件。在源文件中由一个CMSIS标准的线程,循环改变PWM信号占空比实现呼吸灯的功能。voidmyLedInit(){1.LED的PWM初始化
2.线程属性设置
3.创建PWM线程,指定线程函数与线程属性设置}4.PWM线程函数:
循环定时改变PWM占空比多线程应用案例(2/2)
在工程源码的myhello目录下,再创建myadcThread.c源文件。在源文件中由一个POSIX标准的线程,循环检测烟雾传感器及时发生声光警报的功能。voidmyAdcInit(){1.烟雾传感器IO初始化
2.继电器模块IO初始化
3.线程属性设置
4.创建ADC线程,指定线程函数与线程属性设置}5.ADC线程函数:(1)循环定时获取烟雾传感器的ADC值
(2)根据ADC值判断烟雾浓度,当超出预设值则导通继电器请简述多线程的作用。
讲述了多线程工作原理。讲述了CMSIS多线程编程。讲述了POSIX多线程编程。讲述了多线程应用案例。本章主要讲述鸿蒙系统定时器与线程同步技术。通过学习本节将能够了解鸿蒙系统定时器与线程同步技术。通过本节学习可以熟悉:osTimer定时器信号量实现的线程间同步应用案例-DHT11温湿度传感器osTimer定时器鸿蒙系统线程同步综合应用案例-DHT11温湿度传感器驱动osTimer定时器(1/2)
鸿蒙系统的osTimer定时器是基于一个Systemtick硬件定时器封装出来的软件定时器。tick硬件定时器按系统的配置的频率做加1计数,每次增加的间隔为10毫秒。在鸿蒙系统中可以使用多个osTimer软件定时器,但每个osTimer定时器的时间应当以tick硬件定时器的计数间隔时间为单位(10ms)。osTimer定时器(2/2)
在头文件cmsis_os2.h中,已声明了osTimer相关的操作函数:osTimerId_tosTimerNew(osTimerFunc_tfunc,osTimerType_ttype,void*argument,constosTimerAttr_t*attr)//创建osTimer定时器//其中定时器的超时函数原型为:void(*osTimerFunc_t)(void*arg);//type参数可选:osTimerOnce(一次性的定时器),osTimerPeriodic(重复的定时器)//函数执行成功后,返回osTimer定时器的id,通过此id可启动或停止定时器工作。
//启动指定id的定时器,并指定ticks定时器间隔时间。如2秒:ticks=计数频率*2osTimerStart(osTimerId_tid,uint32_tticks)//注意定时器启动后,在定时器超时前再执行此函数,则定时器会重新开始计数。
//停止指定id的定时器osTimerStop(osTimerId_ttimer_id)osTimer定时器鸿蒙系统线程同步综合应用案例-DHT11温湿度传感器驱动鸿蒙系统线程同步(1/3)
信号量(Semaphore)是操作系统中一种重要的线程同步机制,主要用于对共享资源的保护访问。信号量以一个非负整数值表示可用资源的数量,当信号量值大于0时,表示有资源可用。此时,若对信号量执行上锁操作,信号量值会减一,并允许线程继续执行。当信号量值等于0时表示已没有可用资源,此时上锁会让当前线程进入休眠阻塞状态,直到有可分配的资源才会唤醒并恢复执行。信号量的解锁操作会让信号量值加一,如果有等待此信号量资源的其他线程时,解锁操作会唤醒一个处于阻塞状态的线程。鸿蒙系统线程同步(2/3)
POSIX信号量在semaphore.h头文件中声明了sem_t信号量类型及相关操作函数,关键的函数有:sem_tsem;//声明一个信号量变量intsem_init(sem_t*sem,intpshared,unsignedintvalue);//信号量初始化参数列表:sem参数指定要初始化的变量pshared参数值非零表示此信号量支持跨线程,零值则表示只支持线程内访问value参数设置信号量初始时的可用资源数//对sem信号量作上锁操作,如信号量值已为0,调用的线程则进入休眠阻塞状态,直到有可用资源止;如信号量值大于0,则信号量值减一,上锁成功接着执行。intsem_wait(sem_t*sem);//对sem信号量做解锁操作,让信号量值加一,唤醒一个等待此信号量可用资源的阻塞线程。intsem_post(sem_t*sem);鸿蒙系统线程同步(3/3)
实践:以一个线程循环对信号量作上锁操作并进入休眠阻塞状态,在按键按下时对信号量作解锁操作,唤醒与恢复线程的执行。osTimer定时器鸿蒙系统线程同步综合应用案例-DHT11温湿度传感器驱动综合应用案例(1/5)DHT11是一款输出高低电平数字信号的温湿度传感器。模块通过DOUT引脚接收开始采集温湿度信号,并通过DOUT引脚输出温湿度与数据校验和。一次完整的数据传输为40bit,高位先出。先后输出:8位湿度整数数据、8位湿度小数数据、8位温度整数数据、8位温度小数数、8位校验和。其中校验和的值应当是前面4节温湿数据累加后所得结果的末8位。综合应用案例(2/5)DHT11只有接收到开始信号后才会启动温湿度数据的采集。首先,连接模块DOUT引脚的GPIO应当接上拉,默认处于高电平状态,GPIO应当输出18毫秒以上的低电平再接着输出20至40微秒的高电平信号。开始信号发出后GPIO应当改为输入功能,由DHT11模块控制GPIO的电平。DHT11接收到开始信号后,输出80微秒的低电平的响应信号,正常情况下,通过GPIO即获取到此低电平信号;如DHT11未接入等不正常情况下,因GPIO的上拉功能,会获取到高电平信号。综合应用案例(3/5)DHT11输出响应信号后,就会发出表示二进制0或1的电平信号。数值0的电平信号。DOUT引脚先输出50微秒低电平信号,接着输出26至28微秒的高电平信号。DHT11输出二进制数值1的电平信号。DOUT引脚先输出50微秒低电平信号,接着输出70微秒的高电平信号。综合应用案例(4/5)
1.初始化:sem_init(&semLock,1,0);//初始化信号量pthread_create(&tid,NULL,threadFunc,NULL);//创建线程timerID=osTimerNew(timerFunc,osTimerOnce,NULL,NULL);//创建osTimer定时器2.在线程函数里循环:(1)DHT11发出开始信号,检查DHT11的响应信号,获取模块DOUT输出的低电平(2)如没有接收到DHT11输出的低电平响应信号,则退出循环(3)注册GPIO中断(4)信号量上锁,当前线程进入休眠状态,直到信号量解锁止。(5)线程被唤醒后,输出获取的湿度整数、湿度小数、温度整数、温度小数、校验和(6)释放GPIO的中断功能
DHT11驱动实现主要步骤:综合应用案例(5/5)
3.在GPIO中断处理函数:(1)由数组记录每个中断的间隔时间(2)启动定时器,1秒后执行timerFunc函数。注意未超时并再次启动,定时器会重新计时
4.在timerFunc函数:(1)检查每个中断间隔时间,如果大于100微秒则是二进制1,否则是0(2)并将二进制值存放起来(3)数据解析完成后,信号量解锁
请简述信号量的工作原理。
讲述了osTimer定时器。讲述了信号量实现的线程间同步。讲述了综合应用案例-DHT11温湿度传感器。本章主要讲述鸿蒙系统I2C应用开发。通过学习本节将能够了解鸿蒙系统I2C应用开发技术。通过本节学习可以熟悉:I2C通信原理鸿蒙系统I2C操作函数OLED屏工作原理OLED屏驱动I2C通信原理鸿蒙系统I2C操作函数OLED屏工作原理OLED屏驱动I2C通信原理(1/4)I2C(Inter-IntegratedCircuit),也被称为I²C或IIC。它既是一种通信协议,也是一种硬件接口,实现硬件模块间的通信。常用于获取触摸屏的触点坐标、控制声卡的音量、配置摄像头的图像分辨率等操作。I2C接口是由两根导线组成:
一根数据线SDA,一根时钟线SCL。时钟线提供周期信号,每个周期信号表示数据线上传输一位数据;数据线在每个时钟周期中,用高电平表示二进制值1,低电平表示二进制值0。并且,I2C传输以8位为一个单位,每传输8位后,应由接收方拉低SDA引脚电平作为应答ACK信号。I2C通信原理(2/4)
一个I2C接口可并联接入多个I2C设备。在同一接口上的每个I2C设备都需要有一个不同的设备地址(通常是7位地址)予以区分,
每次I2C通信时需要指定所操作的设备地址,I2C通信原理(3/4)WriteMode(向从机设备发送数据):主机先发出开始信号,
接着发出8位数据(由7位设备地址和一位R/W读写位),读写位的值为0。同一I2C接口的所有设备都会接收到此设备地址后,与自身的地址进行比较,如果地址是一样,则由匹配的设备回复应答信号。如果没有设备匹配设备地址,则没有应答信号。主机收到应答信号后,再发出8位数据,
从机收到数据回复应答,表示已收到数据。主机如需再发数据,则在接收到应答信号后,再发出8位数据,如此循环,最后发出停止信号。I2C通信原理(4/4)ReadMode(读取从机设备数据):主机先发出开始信号,接着发出8位数据(由7位设备地址和一位R/W读写位),读写位的值为1。从机地址匹配后,回复应答信号,接着从机输出8位数据,而主机接收数据后,如需再接收数据,则向从机回复应答信号。从机收到应答信号后,再发出8位数据,如此循环,直到主机停止接收,发出停止信号。I2C通信原理鸿蒙系统I2C操作函数OLED屏工作原理OLED屏驱动鸿蒙系统I2C操作函数(1/2)鸿蒙系统在iot_i2c.h头文件中提供了I2C控制器操作函数,关键的函数有:unsignedintIoTI2cInit(unsignedintid,unsignedintbaudrate);//初始化I2C控制器//id参数指定操作第几个控制器,bandrate参数指定I2C传输速率(标准100KHz,高速400KHz)//执行成功返回IOT_SUCCESS,失败则返回IOT_FAILUREunsignedintIoTI2cWrite(unsignedintid,unsignedshortdevAddr,constunsignedchar*data,unsignedintdataLen);//通过I2C控制器发出数据//参数id指定操作第几个控制器,devAddr指定操作的设备地址(包含读写位)//参数data为存放要发出数据的缓冲区地址,dataLen参数指定要发出的数据长度//执行成功返回IOT_SUCCESS,失败则返回IOT_FAILURE鸿蒙系统I2C操作函数(2/2)unsignedintIoTI2cRead(unsignedintid,unsignedshortdevAddr,unsignedchar*data,unsignedintdataLen);//通过I2C控制器接收数据//参数id指定操作第几个控制器,devAddr指定操作的设备地址(包含读写位)//参数data为存放接收数据的缓冲区地址,dataLen参数指定要接收的数据长度//执行成功返回IOT_SUCCESS,失败则返回IOT_FAILUREI2C通信原理鸿蒙系统I2C操作函数OLED屏工作原理OLED屏驱动OLED屏工作原理(1/3)
OLED,全称是OrganicLight-EmittingDiode,即有机发光二极管。OLED屏也就是使用一个发光二极管的亮与熄分别表示图像每个像素点的白与黑。由于存在能发出不同颜色光的二极管,OLED屏因此既有白、蓝、黄等单色屏,也有由红、绿、蓝三个不同的发光二极管共同构成每个像素颜色的OLED彩屏。OLED屏工作原理(2/3)OLED屏物理上一行有128个像素点,共有64行,因此称12864屏。屏幕上的每个像素点,通过控制其对应的发光二极管来显示黑色或蓝色,而图像与字符的呈现,则依赖于由多个像素点构成的点阵来实现。如K字符16x8点阵的像素数据分成两行,每行8字节数据,每字节表示从低位到高位上下8行一列的像素点数据OLED屏工作原理(3/3)
本次OLED屏模块采用了SSD1306驱动IC,该驱动IC内部集成了128x64像素点的显存以及众多配置寄存器,并支持I2C通信接口。OLED屏的驱动流程:I2C通信原理鸿蒙系统I2C操作函数OLED屏工作原理OLED屏驱动OLED屏驱动(1/8)
根据芯片手册,SSD1306芯片在作为I2C设备时,其设备地址为0x3C。根据屏商家提供的例程源码,虽然在物理上OLED屏像素分成64行,每行128个像素点,但在代码逻辑中仅仅分成8行,每行由物理上的8行组成:OLED屏驱动(2/8)开发板与OLED屏模块引脚连接如下:OLED屏模块
开发板
VCC
3.3V
GND
GND
SDA
IO13//I2C0_SDA
SCL
IO14//I2C0_SCLOLED屏驱动(3/8)驱动流程:1.OLED屏所接的I2C控制器初始化2.通过I2C控制器向OLED屏发送命令进行屏的初始化3.屏初始化完成后,显示花屏。OLED屏驱动(4/8)屏上显示图像流程:1.使用PcToLCD工具将图像转换为二进制像素数据。工具的配置选项:OLED屏驱动(5/8)2.生成字模数据后,图像的二进制数据由十六进制数据表示。将图像数据复制到源文件中,并由一个数组存放起来:OLED屏驱动(6/8)3.实现设置OLED屏刷出像素点的开始坐标函数:voidoledSetPosition(u8x,u8y){//x表示一行的第几个像素点,y表示OLED屏的第几行(注意此行为物理上的8行像素) oledSendCmd(0xb0+y); oledSendCmd(((x&0xf0)>>4)|0x10); oledSendCmd(x&0x0f);}OLED屏驱动(7/8)4.实现将图像数据传输至SSD1306驱动IC,让之在OLED屏上显示图像的功能函数:voidoledShowBmp(u8x,u8y,u8bmpW,u8bmpH,u8*bmpData){//oled每行8列,也是oled屏的一行相当于8行像素
intn=0;
for(intr=0;r<bmpH/8;r++)
{
oledSetPosition(x,r+y);//设置屏显的始坐标
for(intc=0;c<bmpW;c++)
{
oledSendData(bmpData[n++]);//每次发一列的8个像素数据
}
}}OLED屏驱动(8/8)5.增加调用代码:
//在oled屏上32:0坐标开始显示华为Logo,图像宽与高均是64个像素
oledShowBmp(32,0,64,64,hwLogo);请简述I2C接口在OLED屏中的作用。
讲述了I2C通信原理讲述了鸿蒙系统I2C操作函数讲述了OLED屏工作原理讲述了OLED屏驱动本章主要项目实践-带屏显的温湿度计。通过学习本节将能够了解屏显温湿度计的项目实践过程。通过本节学习可以熟悉:OLED屏显示数字OLED屏显示中文项目程序实现
OLED屏显示数字OLED屏显示中文项目程序实现
OLED屏显示数字(1/5)
在屏上显示一个字符如同显示一个小图片一样,字符的像素点阵数据记录每个像素点是否要显示出来,如‘W’字符的8x6像素点阵图:点阵数据第0列的数据为0x00,第1列数据为0x3F,依次对应。OLED屏显示数字(2/5)打开PcToLCD工具后,在菜单“模式”中选中“字符模式”后配置选项:OLED屏显示数字(3/5)输入框中输入“0123456789.”,生成字模16x8的像素点阵数据:OLED屏显示数字(4/5)然后将字符的像素点阵数据复制到源文件中,并由一个二维数组存放起来:OLED屏显示数字(5/5)在源文件中实现让OLED屏显示数字字符的功能函数关键代码:voidoledShowFloat(u8x,u8y,floatn)//在oled屏上显示浮点数,
x、y表示屏显始坐标,
n表示要显示的浮点数
u8data[20];
sprintf(data,"%.1f",n);//转换成一位小数的浮点数字符串
for(intk=0;k<strlen(data);k++)
for(intr=0;r<2;r++)//每个字符像素数据是16x8,所以只算2行
oledSetPosition(x+k*8,r+y);
for(intc=0;c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电机与电气控制技术 课件 任务7.1.1交流异步电机的调速控制
- 某著名企业高层管理人员薪酬调查报告0729
- 人血白蛋白临床使用规范总结2026
- 《GBT 9734-2008化学试剂 铝测定通 用方法》专题研究报告
- 《GBT 5009.49-2008发酵酒及其配制酒卫生标准的分析方法》专题研究报告
- 《GBT 22402-2008摄影 加工用化学品 无水硫代硫酸钠和五水合硫代硫酸钠》专题研究报告长文
- 《FZT 52048-2017有机阻燃粘胶短纤维》专题研究报告
- 道路安全教育培训班课件
- 道路交通类法律培训课件
- 2026年高校时政热点试题含解析及答案
- 眼镜验光师试题(及答案)
- 选人用人方面存在的问题及改进措施
- 项目管理流程标准作业程序手册
- 自我介绍礼仪课件
- 卫生院孕优知识培训课件
- 2025-2030工业窑炉烟气多污染物协同控制技术
- 培训机构台账
- 电商预算表格财务模板全年计划表格-做账实操
- 泵车日常管理办法
- 骨科术后疼痛评估与护理查房
- 输液泵的使用培训课件
评论
0/150
提交评论