嵌入式系统开发 -基于分布式系统OpenHarmony 课件 07-轻量级系统基础技术_第1页
嵌入式系统开发 -基于分布式系统OpenHarmony 课件 07-轻量级系统基础技术_第2页
嵌入式系统开发 -基于分布式系统OpenHarmony 课件 07-轻量级系统基础技术_第3页
嵌入式系统开发 -基于分布式系统OpenHarmony 课件 07-轻量级系统基础技术_第4页
嵌入式系统开发 -基于分布式系统OpenHarmony 课件 07-轻量级系统基础技术_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于OpenHarmony的嵌入式开发

第七章轻量级系统基础技术安全边距7.1Hi3861特性与开发环境[7.1.1]Hi3861的功能特性基于Hi3861

SoC的模块:Hi-12F-Kit

2.4GHz低功耗Wi-Fi

IEEE802.11b/g/n,内置RF/PA/LNA等

32位微处理器,160MHz

MAX

2*SPI、3*UART、2*I2C、6*PWM、15*GPIO、7*ADC、1*I2S

SDIO2.0

Slave,50MHz

MAX内置2MB

FLASH、352KB

SRRAM和288KB

ROM

支持HuaweiLiteOS和第三方组件支持OpenHarmony

LiteOS-M内核的轻量系统更多特性详见海思官网基于OpenHarmony的嵌入式开发2性能依然有限,可关注基于星闪技术的WS63安全边距7.1Hi3861特性与开发环境[7.1.1]Hi3861的功能特性基于OpenHarmony的嵌入式开发3安全边距7.1Hi3861特性与开发环境[7.1.1]Hi3861的功能特性

OpenHarmony为Hi3861提供的部分关键组件基于OpenHarmony的嵌入式开发4组件功能介绍WLAN服务提供WLAN服务能力。包括:station和hotspot模式的连接、断开和状态查询等。模组外设控制提供操作外设的能力。包括:I2C、I2S、ADC、UART、SPI、SDIO、GPIO、PWM和FLASH等。分布式软总线在OpenHarmony分布式网络中,提供设备被发现、数据传输的能力。设备安全绑定提供在设备互联场景中,数据在设备之间的安全流转的能力。基础加解密提供密钥管理、加解密等能力。系统服务管理系统服务管理基于面向服务的架构,提供OpenHarmony统一化的系统服务开发框架。启动引导提供系统服务的启动入口标识。在系统服务管理启动时,调用bootstrap标识的入口函数,并启动系统服务。系统属性提供获取与设置系统属性的能力。基础库提供公共基础库能力。包括:文件操作和KV存储管理等。DFX提供DFX能力。包括:流水日志和时间打点等。XTS提供OpenHarmony生态认证测试套件的集合能力。满足智能网联系统基本要求安全边距7.1Hi3861特性与开发环境[7.1.2]Hi3861的开发环境的配置

Windows/Linux环境的DevEco

Device

Tool

4.0@20231130(另:MacOS下可使用DevEcoStudio3.1.1@20231130)从HarmonyOS

Device页面下载HUAWEIDevEcoDeviceTool在操作系统上根据提示完成DevEco

Device

Tool软件的安装

Windows11可能会弹出安装的安全提示,继续运行安装即可可能会提示安装Python和VSCode,按照提示下载并安装即可配置DevEco

Device

Tool软件环境(以Windows系统为例)

Windows11上,DevEco

Device

Tool以VSCode插件形式安装的,使用时,在应用中打开Visual

Studio

Code即可显示DevEco

Device

Tool的主窗口基于OpenHarmony的嵌入式开发5安全边距7.1Hi3861特性与开发环境[7.1.2]Hi3861的开发环境的配置

Windows/Linux环境的DevEco

Device

Tool(4.0@20231130)配置DevEco

Device

Tool软件环境(以Windows系统为例)

DevEco

Device

Tool主窗口如下方法可修改为中文界面基于OpenHarmony的嵌入式开发6安全边距7.1Hi3861特性与开发环境[7.1.2]Hi3861的开发环境的配置

Windows11下新建基于Hi3861

SoC的工程(202303更新方法)新建工程设置工程名选择SoC:Hi3861设置工程路径选择SDK首次需要下载下载时间取决于网络会实时显示下载进度点击确定,完成新建基于OpenHarmony的嵌入式开发7安全边距7.1Hi3861特性与开发环境[7.1.2]Hi3861的开发环境的配置工程的首次编译基于OpenHarmony的嵌入式开发8点击左侧DevEco图标调出PROJECT

TASKS点击PROJECT

TASKS中的Build图标开始编译过程可能会安装相应的工具,出现版本提示等,编译完成会提示[SUCCESS]安全边距7.1Hi3861特性与开发环境[7.1.3]基于Hi3861的Hello

world演示创建工程目录和文件:.\src\applications\sample\wifi-iot\app下新建目录,如my_first_app,创建源码文件,如hello_world.c,创建编译脚本文件BUILD.gn

编辑hello_world.c文件的源码基于OpenHarmony的嵌入式开发9#include<stdio.h>#include"ohos_init.h"#include"ohos_types.h"voidHelloWorld(void){printf("[Hi3861_NewProjectDemo]HelloWorld!\n");}SYS_RUN(HelloWorld);安全边距7.1Hi3861特性与开发环境[7.1.3]基于Hi3861的Hello

world演示编辑编译脚本文件BUILD.gn的内容

向系统中添加组件:.\src\build\lite\components\applications.json

基于OpenHarmony的嵌入式开发10static_library("myapp"){sources=["hello_world.c"]include_dirs=["//utils/native/lite/include",]}static_library指定程序模块的编译结果:静态库文件libmyapp.a

sources中指定静态库.a所依赖的.c文件及其路径若路径中包含”//”则表示绝对路径(此处为代码根路径)若不包含”//”则表示相对路径include_dirs中指定sources所需要依赖的.h文件路径{"components":[{"component":"hello_world_app","description":"helloworldsamples.","optional":"true","dirs":["applications/sample/wifi-iot/app/my_first_app"],"targets":["//applications/sample/wifi-iot/app/my_first_app:myapp"],"rom":"","ram":"","output":[],"adapted_kernel":["liteos_m"],"features":[],"deps":{"components":[],"third_party":[]}},

……红字为新增内容安全边距7.1Hi3861特性与开发环境[7.1.3]基于Hi3861的Hello

world演示编辑文件.\src\vendor\hisilicon\hispark_pegasus/config.json,修改板级配置文件,编译新增加的组件重新编译工程:基于OpenHarmony的嵌入式开发11"subsystems":[{"subsystem":"applications","components":[

{"component":"hello_world_app","features":[]},{"component":"wifi_iot_sample_app","features":[]}]},

……红字为新增内容安全边距7.1Hi3861特性与开发环境[7.1.3]基于Hi3861的Hello

world演示基于DevEcoDeviceTool+HiBurn的硬件烧录(单Windows系统)连接硬件:Hi-12F-Kit使用CH340完成USB-Serial的转换,Windows10和11会自动安装驱动程序,并在设备管理器可查看端口,如COM3

DevEco->工程配置

Hi3861页签设置monitor_port再次Build编译基于OpenHarmony的嵌入式开发12安全边距7.1Hi3861特性与开发环境[7.1.3]基于Hi3861的Hello

world演示基于DevEcoDeviceTool+HiBurn的硬件烧录(单Windows系统)编译成功后,在.\src\out\hispark_Pegasus\wifiiot_hispark_pegasus文件夹下的Hi3861_wifiiot_app_allinone.bin即为Hi3861的可运行文件使用HiBurn向Hi3861内烧录该文件,该文件已经安装在DevEco处

X:\DevEco\resources\toolset\DevTools_Hi3861V100\1.0.0\burntool\

运行BurnTool.exe(实为HiBurn)

Connect连接COM3(Hi3861)

Select

file可运行文件并Add添加

Send

file通过串口发送文件勾选Auto

Burn时无需点击提示窗口出现Connecting...在15秒内按下板子RESET键基于OpenHarmony的嵌入式开发13安全边距7.1Hi3861特性与开发环境[7.1.3]基于Hi3861的Hello

world演示基于DevEcoDeviceTool+HiBurn的硬件烧录(单Windows系统)开始烧写烧写成功运行并查看运行结果在HiBurn中即可查看烧录完成后点击Reset提示窗口中出现运行信息程序的printf()信息基于OpenHarmony的嵌入式开发14本项目没有调用任何的Hi3861的外设(GPIO等)也可以不使用HiBurn,在DevEco中直接配置好下载的串口实现下载功能!安全边距7.2Hi3861的GPIO开发示例[7.2.1]Hi3861的GPIO配置(Windows环境)为项目添加必要的源码支持以7.1.3节的Hello

world

Demo为基础将X:\DevEco\resources\sdk\cfbb\hi3861_hdu_iot\1.0.0\src\vendor\bearpi\bearpi_hm_nano\common\iot_hardware_hals的include和src目录复制到工程目录下在编译脚本BUILD.gn中加入上述源文件和库文件(sources和include_dirs

)基于OpenHarmony的嵌入式开发15static_library("myapp"){

sources=["./src/hal_iot_adc.c","./src/hal_iot_gpio_ex.c","./src/hal_iot_i2c_ex.c","hello_world.c"]include_dirs=[

"./include","//utils/native/lite/include",]}安全边距7.2Hi3861的GPIO开发示例[7.2.1]Hi3861的GPIO配置(Windows环境)为项目添加必要的源码支持

在编译脚本BUILD.gn中加入接口、LiteOS和CMSIS的库文件(include_dirs)基于OpenHarmony的嵌入式开发16static_library("myapp"){sources=["./src/hal_iot_adc.c","./src/hal_iot_gpio_ex.c","./src/hal_iot_i2c_ex.c","hello_world.c"]include_dirs=["//base/iot_hardware/peripheral/interfaces/kits","//device/hisilicon/hispark_pegasus/sdk_liteos/include","//kernel/liteos_m/kal/cmsis","./include","//utils/native/lite/include"]}修改完成的BUILD.gn安全边距7.2Hi3861的GPIO开发示例[7.2.1]Hi3861的GPIO配置关于Hi3861的GPIO常规MCU的GPIO属性

Hi3861的GPIO具备常规MCU的大部分功能仅在复用功能上,会受到内部功能模块的限制基本功能能够达到常规网联设备的功能要求基于OpenHarmony的嵌入式开发17安全边距7.2Hi3861的GPIO开发示例[7.2.1]Hi3861的GPIO配置

Hi3861的GPIO的基本属性接口基于OpenHarmony的嵌入式开发18分类接口名功能描述使能IoTGpioInit初始化GPIOIoTGpioDeinit取消初始化GPIO方向IoTGpioSetDir设置GPIO引脚方向IoTGpioGetDir获取GPIO引脚方向输出IoTGpioSetOutputVal设置GPIO引脚输出电平IoTGpioGetOutputVal获取GPIO引脚输出电平输入IoTGpioGetInputVal获取GPIO引脚输入电平中断IoTGpioRegisterIsrFunc设置GPIO引脚中断及回调IoTGpioUnregisterIsrFunc关闭GPIO引脚中断IoTGpioSetIsrMask设置GPIO引脚中断屏蔽IoTGpioSetIsrMode设置GPIO引脚中断触发模式安全边距7.2Hi3861的GPIO开发示例[7.2.1]Hi3861的GPIO配置

Hi3861的GPIO的基本复用和上拉的接口

本小节所涉及的是基本的GPIO功能示例1:输出,控制LED示例2:输入,检测按键基于OpenHarmony的嵌入式开发19分类接口名功能描述复用IoTGpioSetFunc设置GPIO引脚功能IoTGpioGetFunc获取GPIO引脚功能上拉下拉IoTGpioSetPull设置GPIO引脚上拉IoTGpioGetPull获取GPIO引脚上拉安全边距7.2Hi3861的GPIO开发示例[7.2.1]Hi3861的GPIO配置

Hi3861的GPIO的示例1:输出,控制LED亮灭,1秒间隔闪烁在Hello

world

Demo基础上(屏蔽原代码,使用教材中源码)基于OpenHarmony的嵌入式开发20#defineLED_W_GPIO2voidGPIOExample(void){osThreadAttr_tattr;="LEDTask";attr.attr_bits=0U;attr.cb_mem=NULL;attr.cb_size=0U;attr.stack_mem=NULL;attr.stack_size=512;attr.priority=osPriorityNormal;if(osThreadNew((osThreadFunc_t)LEDTask,NULL,&attr)==NULL){printf("FailedtocreateLEDTask!\n");}}将线程添加到活动线程列表并将其设置为就绪状态来启动线程函数osThreadNew(osThreadFunc_tfunc,void*argument,

constosThreadAttr_t*attr)其中,线程函数的参数使用参数指针*argument传递,线程属性是由参数指针attr定义的,包括优先级、堆栈大小或内存分配等设置当创建的thread函数的优先级高于当前运行的线程时,创建的thread函数立即启动并成为新的运行线程创建了一个新的线程,入口函数LEDTask,优先级osPriorityNormal安全边距7.2Hi3861的GPIO开发示例[7.2.1]Hi3861的GPIO配置

Hi3861的GPIO的示例1:输出,控制LED亮灭,1秒间隔闪烁在Hello

world

Demo基础上(屏蔽原代码,使用教材中源码)基于OpenHarmony的嵌入式开发21staticvoidLEDTask(void){//初始化GPIO

IoTGpioInit(LED_W_GPIO);//设置GPIO2的复用功能为普通GPIO

IoTGpioSetFunc(LED_W_GPIO,IOT_GPIO_FUNC_GPIO_2_GPIO);//设置GPIO2为输出模式

IoTGpioSetDir(LED_W_GPIO,IOT_GPIO_DIR_OUT);while(1){//设置GPIO2输出高电平点亮LED灯

IoTGpioSetOutputVal(LED_W_GPIO,IOT_GPIO_VALUE1);//延时1秒

usleep(1000000);//设置GPIO2输出低电平熄灭LED灯

IoTGpioSetOutputVal(LED_W_GPIO,IOT_GPIO_VALUE0);//延时1susleep(1000000);}}unsignedintIoTGpioSetOutputVal(unsignedintid,IotGpioValueval){returnhi_gpio_set_output_val((hi_gpio_idx)id,(hi_gpio_value)val);}//在code-v3.1-Release中,output误写成了ouput//该问题在OpenHarmony-v4.0-Release中仍未修改安全边距7.2Hi3861的GPIO开发示例[7.2.1]Hi3861的GPIO配置

Hi3861的GPIO的示例1

输出控制LED1秒间隔闪烁基于OpenHarmony的嵌入式开发22安全边距7.2Hi3861的GPIO开发示例[7.2.1]Hi3861的GPIO配置

Hi3861的GPIO的示例2:输入+输出,按键+控制LED亮灭在Hello

world

Demo基础上(屏蔽原代码,使用教材中源码)基于OpenHarmony的嵌入式开发23#defineLED_W_GPIO2#defineKEY_GPIO7staticvoidKEYPressed(char*arg){//反转GPIO2电平

IotGpioValuevalue;

IoTGpioGetOutputVal(LED_W_GPIO,&value);

IoTGpioSetOutputVal(LED_W_GPIO,!value);}[亮->灭]或[灭->亮]的翻转过程unsignedintIoTGpioGetOutputVal(unsignedintid,IotGpioValue*val){returnhi_gpio_get_output_val((hi_gpio_idx)id,(hi_gpio_value*)val);}hi_u32hi_gpio_get_output_val(hi_gpio_idxid,hi_gpio_value*val){if((id>=HI_GPIO_IDX_MAX)||(val==HI_NULL)){returnHI_ERR_GPIO_INVALID_PARAMETER;}hi_u16reg_val=0;

hi_reg_read16((HI_GPIO_REG_BASE+GPIO_SWPORT_DR),reg_val);hi_io_val_get(reg_val,(hi_u16)id,val);returnHI_ERR_SUCCESS;}安全边距7.2Hi3861的GPIO开发示例[7.2.1]Hi3861的GPIO配置

Hi3861的GPIO的示例2:输入+输出,按键+控制LED亮灭在Hello

world

Demo基础上(屏蔽原代码,使用教材中源码)基于OpenHarmony的嵌入式开发24staticvoidInterruptExample(void){//初始化LED灯GPIOIoTGpioInit(LED_W_GPIO);IoTGpioSetFunc(LED_W_GPIO,IOT_GPIO_FUNC_GPIO_2_GPIO);IoTGpioSetDir(LED_W_GPIO,IOT_GPIO_DIR_OUT);//初始化按键,设置为下降沿触发中断

IoTGpioInit(KEY_GPIO);IoTGpioSetFunc(KEY_GPIO,IOT_GPIO_FUNC_GPIO_7_GPIO);IoTGpioSetDir(KEY_GPIO,IOT_GPIO_DIR_IN);IoTGpioSetPull(KEY_GPIO,IOT_GPIO_PULL_UP);

IoTGpioRegisterIsrFunc(KEY_GPIO,IOT_INT_TYPE_EDGE,

IOT_GPIO_EDGE_FALL_LEVEL_LOW,KEYPressed,NULL);}IOT_GPIO_DIR_IN:InputIOT_GPIO_PULL_UP:Pull-upunsignedintIoTGpioRegisterIsrFunc(unsignedintid,IotGpioIntTypeintType,

IotGpioIntPolarityintPolarity,GpioIsrCallbackFuncfunc,char*arg)IOT_GPIO_EDGE_FALL_LEVEL_LOW:下降沿触发安全边距7.2Hi3861的GPIO开发示例[7.2.1]Hi3861的GPIO配置

Hi3861的GPIO的示例2

按键中断输入

按键控制LED翻转下降沿触发基于OpenHarmony的嵌入式开发25为何会出现按一下闪几次的问题?安全边距7.3UART开发示例[7.3.0]UART基础知识

UART:通用异步收发器,微处理器与外界进行数据通信最基本的接口,可进行全双工通信

全双工UART接口除了需要共地外,还需要连接RX和TX两根通信线:RX用于接收对端传入的串行数据,TX用于向对端传输串行数据。UART与其他串行通信本质是一样的,即将需要发送的数据按位进行传输,但由于UART是异步通信,通信双方在传输时缺乏必要的同步机制(异步),所以通信双方之间必须要使用相同的通信速率,即相同的波特率(Baudrate),目前常用的波特率包括1200bps、2400bps、4800bps、9600bps、19200bps、38400bps、57600bps和115200bps等基于OpenHarmony的嵌入式开发26需要共地哦需要共地哦安全边距7.3UART开发示例[7.3.0]UART基础知识

UART的基本配置接口

UART接口使用的其他问题设置端口的复用功能

IoTGpioSetFunc基于OpenHarmony的嵌入式开发27接口名功能描述IoTUartInit初始化UARTIoTUartDeinit取消UART初始化IoTUartRead从UART读取数据IoTUartWrite将数据写入UARTIoTUartSetFlowCtrl设置UART流控制unsignedintIoTGpioSetFunc(unsignedintid,unsignedcharval)

{if(id>=HI_GPIO_IDX_MAX){returnIOT_FAILURE;}returnhi_io_set_func((hi_io_name)id,val);}IoTGpioSetFunc(HI_IO_NAME_GPIO_0,IOT_GPIO_FUNC_GPIO_0_UART1_TXD);IoTGpioSetFunc(HI_IO_NAME_GPIO_1,IOT_GPIO_FUNC_GPIO_1_UART1_RXD);安全边距7.3UART开发示例[7.3.1]UART配置问题使用UART1的注意问题

UART1默认是用于AT命令,所以需要修改device/hisilicon/hispark_pegasus/sdk_liteos/build/config文件,在在配置文件中关闭AT功能。搜索字段CONFIG_AT_SUPPORT,并设置为n即可。

此外,除此之外,由于IO2/IO6/IO8已经用于与硬件相关的配置,因此,上电时不能处于高电平状态。所以,需要在模组启动后才能连接UART1,否则模组是无法进入正常工作状态的。基于OpenHarmony的嵌入式开发28串口与GPIO是复用引脚的,所以在使用串口前还需要做什么?安全边距7.3UART开发示例[7.3.2]UART程序示例示例1:通过Hi3861的UART1间隔发送数据相关的初始化工作基于OpenHarmony的嵌入式开发29#include"iot_uart.h”#defineIOT_UART

1#defineUART1_RXD5#defineUART1_TXD6uint8_tbuffer[1024]={0};staticconstchar*data=“Hello,OpenHarmony!\r\n";IoTGpioInit(UART1_RXD);IoTGpioInit(UART1_RXD);IoTGpioSetPull(UART1_RXD,IOT_GPIO_PULL_UP);IoTGpioSetPull(UART1_TXD,IOT_GPIO_PULL_UP);IoTGpioSetFunc(UART1_RXD,IOT_GPIO_FUNC_GPIO_5_UART1_RXD);IoTGpioSetFunc(UART1_TXD,IOT_GPIO_FUNC_GPIO_6_UART1_TXD);IotUartAttributeuart_attr={

.baudRate=115200,

//波特率

.dataBits=IOT_UART_DATA_BIT_8,//数据位

.stopBits=IOT_UART_STOP_BIT_1,//停止位

.parity=IOT_UART_PARITY_NONE,//奇偶校验

//接收是否阻塞

.rxBlock=IOT_UART_BLOCK_STATE_BLOCK,

//发送是否阻塞

.txBlock=IOT_UART_BLOCK_STATE_BLOCK,

.pad=0,};必要的头文件必要的定义UART相关属性:波特率、数据位、停止位和校验等GPIO端口功能复用安全边距7.3UART开发示例[7.3.2]UART程序示例示例1:通过Hi3861的UART1间隔发送数据相关的初始化工作通过osThreadNew创建UART任务的线程基于OpenHarmony的嵌入式开发30uint32_tret=IoTUartInit(IOT_UART,&uart_attr);if(ret!=IOT_SUCCESS){

printf("FailedtoinitUART!Error:%d\n",ret);return;}初始化UARTvoidUARTExample(void){osThreadAttr_tattr;="UARTTask";attr.attr_bits=0U;attr.cb_mem=NULL;attr.cb_size=0U;attr.stack_mem=NULL;attr.stack_size=512;attr.priority=osPriorityNormal;if(osThreadNew((osThreadFunc_t)UARTTask,NULL,&attr)==NULL){printf("FailedtocreateUARTTask!\n");}

}创建UARTTask线程安全边距7.3UART开发示例[7.3.2]UART程序示例示例1:通过Hi3861的UART1间隔发送数据在UARTTask中实现目标功能:间隔发送数据基于OpenHarmony的嵌入式开发31while(1){printf(“OurEDAHi3861

UART1

Testing...\n");IoTUartWrite(IOT_UART,(unsignedchar*)data,strlen(data));usleep(1000000);}while(1){printf(“OurEDAHi3861

UART1

Testing...\n");IoTUartWrite(IOT_UART,(unsignedchar*)data,strlen(data));

IoTGpioGetOutputVal(LED_W_GPIO,&value);

IoTGpioSetOutputVal(LED_W_GPIO,!value);usleep(1000000);}间隔发送数据,间隔1秒(usleep(1000000))向调试串口(计算机上COM3)发送字符串(printf)向UART1(计算机上COM5)发送字符串(IoTUartWrite)增加LED灯翻转功能。注意,需要初始化变量和相关GPIO安全边距7.3UART开发示例[7.3.2]UART程序示例示例1:通过Hi3861的UART1间隔发送数据:完整源码基于OpenHarmony的嵌入式开发32#include<stdio.h>#include<unistd.h>#include<string.h>#include"ohos_init.h"#include"ohos_types.h"#include"cmsis_os2.h"#include"iot_gpio.h"#include"iot_gpio_ex.h"#include"iot_uart.h"#include"iot_errno.h"#defineLED_W_GPIO2#defineKEY_GPIO7#defineIOT_UART1#defineUART1_RXD5#defineUART1_TXD6uint8_tbuffer[1024]={0};staticconstchar*data="Hello,OpenHarmony!\r\n";staticvoidUARTTask(void){IotUartAttributeuart_attr={.baudRate=115200,

//波特率

.dataBits=IOT_UART_DATA_BIT_8,

//数据位

.stopBits=IOT_UART_STOP_BIT_1,

//停止位

.parity=IOT_UART_PARITY_NONE,

//奇偶校验

.rxBlock=IOT_UART_BLOCK_STATE_BLOCK,

//接收是否阻塞

.txBlock=IOT_UART_BLOCK_STATE_BLOCK,

//发送是否阻塞

.pad=0,};

IoTGpioInit(UART1_RXD);IoTGpioInit(UART1_RXD);IoTGpioInit(LED_W_GPIO);IoTGpioSetFunc(LED_W_GPIO,IOT_GPIO_FUNC_GPIO_2_GPIO);

IoTGpioSetPull(UART1_RXD,IOT_GPIO_PULL_UP);IoTGpioSetPull(UART1_TXD,IOT_GPIO_PULL_UP);IoTGpioSetFunc(UART1_RXD,IOT_GPIO_FUNC_GPIO_5_UART1_RXD);IoTGpioSetFunc(UART1_TXD,IOT_GPIO_FUNC_GPIO_6_UART1_TXD);//初始化UART1uint32_tret=IoTUartInit(IOT_UART,&uart_attr);if(ret!=IOT_SUCCESS){printf("FailedtoinitUART!Error:%d\n",ret);return;}while(1){printf("OurEDAHi3861

UART1

Testing...\n");IoTUartWrite(IOT_UART,(unsignedchar*)data,strlen(data));usleep(1000000);}}

voidUARTExample(void){osThreadAttr_tattr;="UARTTask";attr.attr_bits=0U;attr.cb_mem=NULL;attr.cb_size=0U;attr.stack_mem=NULL;attr.stack_size=512;attr.priority=osPriorityNormal;if(osThreadNew((osThreadFunc_t)UARTTask,NULL,&attr)==NULL){printf("FailedtocreateUARTTask!\n");}}

SYS_RUN(UARTExample);右边USB口COM5左边USB口COM3安全边距7.3UART开发示例[7.3.2]UART程序示例示例2:通过Hi3861的UART1间隔回送数据:接收+发送相关的初始化工作与示例1一致,略在UARTTask中实现目标功能:数据接收+数据回传发送演示视频的系统结构基于OpenHarmony的嵌入式开发33while(1){

IoTUartRead(IOT_UART,buffer,sizeof(buffer));

//通过串口1接收数据

IoTUartWrite(IOT_UART,buffer,strlen((char*)buffer));

//通过串口1发送收到的数据}笔记本电脑Hi3861模块USB转UART模块串口调试助手串口调试助手GNDGNDTXD1RXD1RXDTXD原有的Hi3861连接安全边距7.3UART开发示例[7.3.2]UART程序示例示例1:通过Hi3861的UART1间隔发送数据向调试串口(计算机上COM3)发送字符串(printf)向UART1(计算机上COM5)发送字符串(IoTUartWrite)基于OpenHarmony的嵌入式开发34安全边距7.3UART开发示例[7.3.2]UART程序示例示例1:通过Hi3861的UART1间隔回送数据从UART1接收数据向UART1发回数据基于OpenHarmony的嵌入式开发35安全边距7.4I2C开发示例[7.4.0]I2C基础知识

嵌入式设备常见的通信接口,除了共地之外,需要两根信号线

SCL/SCK:SerialClock,时钟(同步,单向)

SDA:

Serial

Data,数据(双向)有主从之分:主:调度控制、发时钟,收发数据,通常是微处理器从:响应请求,收发数据,通常是传感器或执行结构一主多从:127个从机地址(7-bits),每个从机有唯一的地址也有部分器件支持10位地址模式,但应用很少通信速率:基本(100Kbps)、快速(400Kbps)、快速+(1Mbps)、高速(3.4Mbps)和超快(5Mbps)等从设备:屏幕、摄像头控制、传感器、信号发生器等基于OpenHarmony的嵌入式开发36安全边距7.4I2C开发示例[7.4.0]I2C基础知识使用要点:通常是单一微处理器与多个外部设备之间使用微处理器(主):Hi3861的相关接口

I2C接口使用的其他问题设置端口的复用功能:与使用UART类似

IoTGpioSetFunc基于OpenHarmony的嵌入式开发37接口名功能描述IoTI2cInit初始化I2CIoTI2cDeinit取消I2C初始化IoTI2cWrite将数据写入到I2C外设IoTI2cRead从I2C外设读取数据IoTI2cSetBaudrate设置I2C速率IoTGpioSetFunc(HI_IO_NAME_GPIO_0,IOT_GPIO_FUNC_GPIO_0_I2C1_SDA);IoTGpioSetFunc(HI_IO_NAME_GPIO_1,IOT_GPIO_FUNC_GPIO_1_I2C1_SCL);[7.4.1]I2C的外设连接-小型屏幕使用要点:小型屏幕通常都配有独立的控制器本DEMO:OLED,分辨率128×64,I2C接口,控制器SSD1306地址:可选0111100或0111101(可设置选择,二进制,7位长度)

使用流程:

①设置GPIO复用、初始化I2C,②按照OLED的流程发送指令、初始化屏幕控制器、设置显示方式,③发送显示内容等安全边距7.4I2C开发示例基于OpenHarmony的嵌入式开发38OLED引脚开发板排针脚Hi3861的引脚GNDGND-VCC3V3-SCLIO01GPIO1(复用)SDAIO00GPIO0(复用)[7.4.2]I2C的外设连接-小型屏幕显示示例示例-在OLED屏幕上绘制图形

Hi3861的初始化工作安全边距7.4I2C开发示例基于OpenHarmony的嵌入式开发39#include"iot_i2c.h”#define

IOT_I2C

1#defineI2C1_SDA

0#defineI2C1_SCL

1#defineOLED_ADDRESS(0x3c<<1)#defineOLED_REG_CMD0x00#defineOLED_REG_DATA0x40必要的头文件必要的定义OLED屏幕的地址OLED屏幕的指令voidI2CExample(void){osThreadAttr_tattr;="I2CTask";attr.attr_bits=0U;attr.cb_mem=NULL;attr.cb_size=0U;attr.stack_mem=NULL;attr.stack_size=2048;attr.priority=osPriorityNormal;if(osThreadNew((osThreadFunc_t)I2CTask,

NULL,&attr)==NULL){printf("FailedtocreateI2CTask!\n");}}SYS_RUN(I2CExample);换个流程:先创建好I2CTask任务再考虑OLED的控制IoTGpioInit(0);IoTGpioSetFunc(0,IOT_GPIO_FUNC_GPIO_0_I2C1_SDA);IoTGpioSetDir(0,IOT_GPIO_DIR_OUT);IoTGpioInit(1);IoTGpioSetFunc(1,IOT_GPIO_FUNC_GPIO_1_I2C1_SCL);IoTGpioSetDir(1,IOT_GPIO_DIR_OUT);初始化GPIOGPIO功能复用[7.4.2]I2C的外设连接-小型屏幕显示示例示例-在OLED屏幕上绘制图形

OLED的初始化工作安全边距7.4I2C开发示例基于OpenHarmony的嵌入式开发40uint32_toled_init(void){uint8_tcmds[]={0xAE,0x00,0x10,0x40,0xB0,0x81,0xFF,0xA1,0xA6,0xA8,0x3F,0xC8,0xD3,0x00,0xD5,0x80,0xD8,0x05,0xD9,0xF1,0xDA,0x12,0xDB,0x30,0x8D,0x14,0xAF};for(size_ti=0;i<sizeof(cmds)/sizeof(cmds[0]);i++){uint32_tstatus=oled_write(OLED_REG_CMD,cmds[i]);if(status!=IOT_SUCCESS)

{returnstatus;}}}怎么初始化?在哪里显示?显示什么?向SSD1306发送初始化指令初始化方式和流程与控制器密切相关,包括关显示、设置显示模式、设置对比度、设置行数、设置反显、设置时钟、设置电荷泵、开显示等uint32_toled_write(uint8_treg,uint8_tdata){uint8_tbuffer[]={reg,data};returnIoTI2cWrite(IOT_I2C,OLED_ADDRESS,buffer,2);}[7.4.2]I2C的外设连接-小型屏幕显示示例示例-在OLED屏幕上绘制图形设置显示的位置设置显示的内容安全边距7.4I2C开发示例基于OpenHarmony的嵌入式开发41voidoled_set_pos(uint8_tx,uint8_ty){oled_write(OLED_REG_CMD,0xb0+y);oled_write(OLED_REG_CMD,0x10|((x&0xf0)>>4));oled_write(OLED_REG_CMD,x&0x0f);}怎么初始化?在哪里显示?显示什么?voidoled_fill(uint8_tx,uint8_ty,uint8_twidth,uint8_theight,uint8_tdata){for(uint8_ti=0;i<height;i++){oled_set_pos(x,y+i);for(uint8_tj=0;j<width;j++)

{oled_write(OLED_REG_DATA,data);}}}[7.4.2]I2C的外设连接-小型屏幕显示示例示例-在OLED屏幕上绘制图形

I2CTask:演示略安全边距7.4I2C开发示例基于OpenHarmony的嵌入式开发42staticvoidI2CTask(void){uint8_tret;//GPIO0复用为I2C1SDAIoTGpioInit(0);IoTGpioSetFunc(0,IOT_GPIO_FUNC_GPIO_0_I2C1_SDA);IoTGpioSetDir(0,IOT_GPIO_DIR_OUT);//GPIO1复用为I2C1SCLIoTGpioInit(1);IoTGpioSetFunc(1,IOT_GPIO_FUNC_GPIO_1_I2C1_SCL);IoTGpioSetDir(1,IOT_GPIO_DIR_OUT);//初始化I2C1,速率400kbpsret=IoTI2cInit(IOT_I2C,400000);if(ret!=IOT_SUCCESS){printf("FailedtoinitI2C!Error:%d\n",ret);return;}

//初始化OLED屏幕

ret=oled_init();if(ret!=IOT_SUCCESS){printf("FailedtoinitOLED!Error:%d\n",ret);return;}//清屏并绘制矩形

oled_fill(0,0,128,8,0x00);oled_fill(20,2,60,3,0xff);while(1){sleep(1);}}实际调用:hi_u32hi_i2c_init(hi_i2c_idxid,hi_u32baudrate),baudrate=速率,400000=400Kbps[7.5.0]看门狗(Watchdog)基础知识一种特殊功能的定时器(计数器),在定时结束时会产生复位信号保证程序按照设计的流程执行,避免程序异常运行的一种功能模块在定时结束之前,在正常的执行流程中,进行清零操作(喂狗)。禁止在硬件定时器中进行清零操作(程序异常时,硬件定时器可能仍正常)看门狗的主要接口安全边距7.5看门狗开发示例基于OpenHarmony的嵌入式开发43接口名功能描述IoTWatchDogEnable启用看门狗IoTWatchDogDisable禁用看门狗IoTWatchDogKick喂狗hi_watchdog_set_timeout

设置看门狗定时时间[7.5.1]看门狗异常复位示例不进行喂狗操作,Hi3861会被看门狗复位运行效果:串口调试助手中观察,结果为每30秒重启一次安全边距7.5看门狗开发示例基于OpenHarmony的嵌入式开发44#include<stdio.h>#include<unistd.h>#include"ohos_init.h"#include"ohos_types.h"#include"iot_watchdog.h"#include"hi_watchdog.h"staticvoidWDTTask(void){unsignedintnum=0;

hi_watchdog_set_timeout(30000);IoTWatchDogEnable();while(1){num++;

//模拟耗时操作,不喂狗

}}voidWDTExample(void){osThreadAttr_tattr;="WDTTask";attr.attr_bits=0U;attr.cb_mem=NULL;attr.cb_size=0U;attr.stack_mem=NULL;attr.stack_size=512;attr.priority=osPriorityNormal;if(osThreadNew((osThreadFunc_t)WDTTask,NULL,&attr)==

NULL){printf("FailedtocreateWDTTask!\n");}}SYS_RUN(WDTExample);[7.5.2]看门狗正常使用示例正常喂狗操作,保证Hi3861正常工作安全边距7.5看门狗开发示例基于OpenHarmony的嵌入式开发45#include<stdio.h>#include<unistd.h>#include"ohos_init.h"#include"ohos_types.h"#include"iot_watchdog.h"#include"hi_watchdog.h"staticvoidWDTTask(void){unsignedintnum=0;

hi_watchdog_set_timeout(30000);IoTWatchDogEnable();while(1){num++;

//模拟耗时操作

if(num==0)IoTWatchDogKick();

}}voidWDTExample(void){osThreadAttr_tattr;="WDTTask";attr.attr_bits=0U;attr.cb_mem=NULL;attr.cb_size=0U;attr.stack_mem=NULL;attr.stack_size=512;attr.priority=osPriorityNormal;if(osThreadNew((osThreadFunc_t)WDTTask,NULL,&attr)==

NULL){printf("FailedtocreateWDTTask!\n");}}SYS_RUN(WDTExample);在任何正常情况下,要保证30秒内喂狗[7.6.0]ADC基础知识

ADC(Analog

toDigitalConverter),在Hi3861上,用于将外部模拟电信号(电压)转换为数字量注意:ADC读数较慢,易造成阻塞,一般不会在中断使用安全边距7.6ADC开发示例基于OpenHarmony的嵌入式开发46接口名功能描述IoTAdcRead获取ADC转换结果,unsignedintIoTAdcRead(unsignedintchannel,unsignedshort*data,IotAdcEquModelSelequModel,IotAdcCurBaiscurBais,unsignedshortrstCnt)

channel:进行ADC转换的通道:宏定义HI_ADC_CHANNEL_0至7,其中7为参考电压,不能使用data:用于存放读取数据的地址的指针equModel:平均算法的次数,HI_ADC_EQU_MODEL_1、2、4或8curBais:模拟部分的电源控制:自动、1.8V或3.3V,默认为1.8VrstCnt:从配置采样到启动采样的延时时间计数,一次计数是334ns,值需在0~0xFF0之间[7.6.1]ADC转换示例

ADC的引脚与GPIO也是复用的,但是IoTGpioSetFunc不能设置Pin是GPIO还是ADC功能(能设置UART、SPI、PWM和I2C等)

IoTGpioSetFunc的设置范围安全边距7.6ADC开发示例基于OpenHarmony的嵌入式开发47//EnumeratesthefunctionsofGPIOhardwarepin0.typedefenum{/**GPIO0function*/

IOT_GPIO_FUNC_GPIO_0_GPIO,/**FunctionsofUART1TXD*/

IOT_GPIO_FUNC_GPIO_0_UART1_TXD=2,/**SPI1CKfunction*/

IOT_GPIO_FUNC_GPIO_0_SPI1_CK,/**FunctionsofJTAGTD0*/IOT_GPIO_FUNC_GPIO_0_JTAG_TDO,/**PWM3OUTfunction*/

IOT_GPIO_FUNC_GPIO_0_PWM3_OUT,/**I2C1SDAfunction*/

IOT_GPIO_FUNC_GPIO_0_I2C1_SDA,}WifiIotIoFuncGpio0;iot_gpio_ex.h文件

Hi3861的ADC通道复用情况PinGPIOADC通道6GPIO_04ADC117GPIO_05ADC219GPIO_07ADC327GPIO_09ADC429GPIO_11ADC530GPIO_12ADC031GPIO_13ADC6[7.6.1]ADC转换示例

ADC的引脚与GPIO也是复用的,但是IoTGpioSetFunc不能设置Pin是GPIO还是ADC功能(能设置UART、SPI、PWM和I2C等)实验电路设置安全边距7.6ADC开发示例基于OpenHarmony的嵌入式开发48

Hi3861的ADC通道复用情况PinGPIOADC通道6GPIO_04ADC117GPIO_05ADC219GPIO_07ADC327GPIO_09ADC429GPIO_11ADC530GPIO_12ADC031GPIO_13ADC6GPIO7/ADC3的Pin的电平可以通过外部按键改变按下:ADC3=0V抬起:ADC3=3.3V[7.6.1]ADC转换示例示例程序的几个关键点安全边距7.6ADC开发示例基于OpenHarmony的嵌入式开发49#defineKEY_GPIO7#defineADC_CHANNEL3staticfloatGetVoltage(void){unsignedshortdata;unsignedintret=IoTAdcRead(ADC_CHANNEL,&data,IOT_ADC_EQU_MODEL_8,IOT_ADC_CUR_BAIS_DEFAULT,0xff);if(ret!=IOT_SUCCESS){printf("ADCReadFail!\n");}

return(float)data*1.8*4/4096.0;}staticvoidADCTask(void){floatvoltage;IoTGpioInit(KEY_GPIO);IoTGpioSetPull(KEY_GPIO,IOT_GPIO_PULL_UP);//将GPIO7设置为上拉,使按键未按下时保持高电平状态while(1){

volta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论