1、下载虚拟机VMware和Ubuntu20.0.14
下载 VMware Workstation Pro | CN
Ubuntu系统下载 | Ubuntu
2、 安装vm完成后打开vm,点击创建新的虚拟机
3、选择典型点击下一步,选择下载的Ubuntu,点击下一步,创建完成后虚拟机自动安装Ubuntu
4、安装完成后获取OpenHarmony源码可参考
https://docs.openharmony.cn/pages/v3.1/zh-cn/device-dev/get-code/sourcecode-acquire.md/
5、安装编译工具
(1)安装Node.js打开Ubuntu终端输入命令安装:
sudo apt
-
get install nodejs
sudo apt
-
get install npm
node
--version //查看nodejs版本
npm
--version //查看npm版本
(2)安装Python编译环境
sudo apt
-
get install python3
.
8
sudo apt
-
get install python3
-
pip
sudo pip3 install setuptools
sudo pip3 install kconfiglib
sudo pip3 install pycryptodome
sudo pip3 install six
--upgrade --ignore-installed six
sudo pip3 install ecdsa
(3) 安装SCons
python3
-
m pip install scons
scons
-
v
//查看版本
如图:
(4)安装hb工具代码测试
python3
-
m pip install
--user ohos-build
vim
~/
.
bashrc
//设置环境变量
export PATH
=~/
.
local
/
bin:$PATH
//将以下命令拷贝到.bashrc文件的最后一行,保存并退出
source
~/
.
bashrc
//更新环境变量
执行"hb -h",有打印以下信息即表示安装成功。
(5) 安装gcc_riscv32
下载gcc_riscv32镜像
%3A%2F%2Frepo.huaweicloud.com%2Fharmonyos%2Fcompiler%2Fgcc_riscv32%2F7.3.0%2Flinux%2Fgcc_riscv32-linux-7.3.0.tar.gz
设置环境变量
将压缩包解压到根目录
tar
-
xvf gcc_riscv32
-
linux
-
7.3.0
.
tar
.
gz
-
C
~
//文件名需要与下载的文件相匹配
设置环境变量。
vim
~/
.
bashrc
//设置环境变量
export PATH
=~/
gcc_riscv32
/
bin:$PATH
//将以下命令拷贝到.bashrc文件的最后一行,保存并退出
source
~/
.
bashrc
//更新环境变量
riscv32
-
unknown
-
elf
-
gcc
-
v
//显示版本号,则安装成功
6、修改usr_config.mk文件
文件在OpenHarmony源码目录下
device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk
CONFIG_I2C_SUPPORT
=
y
CONFIG_PWM_SUPPORT
=
y
7、修改wifiservice文件夹
文件在OpenHarmony源码目录下
device/hisilicon/hispark_pegasus/hi3861_adapter/hals/communication/wifi_lite/wifiservice/source/wifi_hotspot.c
EnableHotspot函数中屏蔽如下字段
//if (SetHotspotIpConfig() != WIFI_SUCCESS) {
// return ERROR_WIFI_UNKNOWN;
//}
地址:device
/
hisilicon
/
hispark_pegasus
/
hi3861_adapter
/
hals
/
communication
/
wifi_lite
/
wifiservice
/
source
/
wifi_device
.
c
DispatchConnectEvent函数下 屏蔽StaSetWifiNetConfig相关代码行
//StaSetWifiNetConfig(HI_WIFI_EVT_CONNECTED);
//StaSetWifiNetConfig(HI_WIFI_EVT_DISCONNECTED);
1、在OpenHarmony1.01版本创建一个项目demo
在源码目录下的vendor/team_x创建smart_demo
在scr里面添加我们写的代码:
2、初始化uart串口
首先我们需要创建一个初始化uart串口的程序
将GPIO0初始化为tx端,将GPIO1初始化为rx端
void UartInit
(
void
)
{
RaiseLog
(
LOG_LEVEL_INFO
,
"[2022012x01] entry into UartInit"
);
IoTGpioInit
(
HAL_WIFI_IOT_IO_NAME_GPIO_0
);
HalIoSetFunc
(
HAL_WIFI_IOT_IO_NAME_GPIO_0
,
WIFI_IOT_IO_FUNC_GPIO_0_UART1_TXD
);
IoTGpioInit
(
HAL_WIFI_IOT_IO_NAME_GPIO_1
);
HalIoSetFunc
(
HAL_WIFI_IOT_IO_NAME_GPIO_1
,
WIFI_IOT_IO_FUNC_GPIO_1_UART1_RXD
);
hi_uart_attribute uart_attr
=
{
.
baud_rate
=
UART_BAUD_RATE
,
/* baud_rate: 9600 */
.
data_bits
=
UART_DATA_BITS
,
/* data_bits: 8bits */
.
stop_bits
=
UART_STOP_BITS
,
.
parity
=
0
,
}
RaiseLog
(
LOG_LEVEL_INFO
,
"[2022012x01] uart_init success"
);
/* Initialize uart driver */
hi_u32 ret
=
hi_uart_init
(
HI_UART_IDX_1
,
&
uart_attr
,
HI_NULL
);
if
(
ret
!=
HI_ERR_SUCCESS
)
{
printf
(
"[Dustbin_tes3]Failed to init uart! Err code = %d\n"
,
ret
);
return
;
}
}
3、创建线程任务
static void
*
uart_demo_task
(
void
)
{
static uint16_t countSendTimes
=
0
;
static uint8_t countReceiveTimes
=
0
;
uartController
.
isReadBusy
=
false
;
printf
(
"[Initialize uart successfully\n"
);
UartInit
();
while
(
1
)
{
osDelay
(
50
);
UartReceiveMessage
();
//Collecting Serial Port Data
hi_sleep
(
SMART_BIN_SLEEP_2500MS
);
}
return
0
;
}
static void IotMainEntry
(
void
)
{
osThreadAttr_t attr
;
RaiseLog
(
LOG_LEVEL_INFO
,
"DATA:%s Time:%s \r\n"
,
__FUNCTION__
,
__DATE__
,
__TIME__
);
// Create the IoT Main task
attr
.
attr_bits
=
0
U
;
attr
.
cb_mem
=
NULL
;
attr
.
cb_size
=
0
U
;
attr
.
stack_mem
=
NULL
attr
.
stack_size
=
CONFIG_TASK_MAIN_STACKSIZE
;
attr
.
priority
=
CONFIG_TASK_MAIN_PRIOR
;
attr
.
name
=
"IoTMain"
;
(
void
)
osThreadNew
((
osThreadFunc_t
)
uart_demo_task
,
NULL
,
(
const osThreadAttr_t
*
)
&
attr
);
return
;
}
APP_FEATURE_INIT
(
IotMainEntry
);
4、接收串口数据
static void UartReceiveMessage
(
void
)
{
char
*
recData
;
printf
(
"----Listening----\n"
);
RaiseLog
(
LOG_LEVEL_INFO
,
"Start Listening serial port"
);
if
(
UartIsBufEmpty
())
{
return
;
}
if
(
uartController
.
isReadBusy
)
{
return
;
}
uartController
.
isReadBusy
=
true
;
g_ReceivedDatalen
=
hi_uart_read
(
UART_NUM
,
g_uart_buff
,
UART_BUFF_SIZE
);
if
(
g_ReceivedDatalen
>
0
)
{
printf
(
"handleUartReceiveMessage rcvData len:%d,msg:%s.\n"
,
g_ReceivedDatalen
,
g_uart_buff
);
setVoiceCommand
();
//Setting voice Commands
memset
(
g_uart_buff
,
0
,
sizeof
(
g_uart_buff
));
g_ReceivedDatalen
=
0
;
}
uartController
.
isReadBusy
=
false
;
}
当hi3861开发板接收到其他开发板传输的数据后,可以通过串口打印出来,对此可以写一个解析命令,对发送的字符串,执行相应的命令
注:在接线时,要将tx与另一个开发板的rx连接,因为在UART串口协议中,通过TX(发送引脚)和RX(接收引脚)进行数据传输与接收,需要将TX发送引脚与另一开发板的RX接收引脚相连接,故需要交叉连接以保证两块开发板的正常通信。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70011554/viewspace-2914151/ ,如需转载,请注明出处,否则将追究法律责任。