1 新建工程

在Ubuntu的QT Creator中,新建工程Hi3516Project。

2 添加海思相关库文件到工程

(1)复制SDK包中的文件,路径为

1
./Hi3516CV500_SDK_V2.0.2.0/package/mpp_smp_linux/

(2)复制该文件夹下的lib、include以及/sample/common文件夹到工程目录。

(3)在工程名字上右键选择“Add Existing Directory…”,添加加入的头文件以及相关例程。

(4)在pro文件中,加入海思链接库

1
2
3
4
5
6
7
8
9
10
11
LIBS  += -L /lib   -ltde -lmpi -lupvqe -ldnvqe\
-lhdmi -l_hiae -lsns_imx327 -lsns_gc2053 \
-lsns_ov12870 -lsns_imx307 -lsns_mn34220\
-l_hiawb -l_hiawb_natura -lhi_cipher -l_hidehaze -l_hidrc -lsns_imx458\
-lhifisheyecalibrate -l_hildci -lhive_AEC -lhive_AGC -lhive_ANR\
-lhive_common -lhive_EQ -lhive_HPF\
-lhive_record -lhive_RES -lisp -live -lmd -lsns_imx335 -lsns_sc4210\
-lsns_imx327_2l -lmpi -lnnie -l_hicalcflicker -lsns_os05a \
-lsns_imx307_2l -lsns_os08a10 -lsns_os04b10\
-lsecurec -lsns_imx415\
-ltde -lupvqe -lVoiceEngine

3 设计ui

(1)打开主ui文件,添加一个按钮,功能为GPIO测试。并将相应的槽函数设置为跳转到GPIO页面。

(2)新建GPIO类,打开ui文件,添加两个按钮,功能分别为打开GPIO7_2引脚和关闭GPIO7_2引脚。

4 海思Hi3516GPIO操作流程

(1)先设置GPIO复用为输出(以GPIO7_2为例)

查阅海思寄存器表,复用地址为0x112F_004C,寄存器的值为0 时表示复用为GPIO,所以使用命令himm 0x112F0054 0。

(2)设置GPIO的方向

查阅海思Hi3516 GPIO寄存器及基地址表,GPIOn对应的寄存器地址为:GPIOn基地址+该寄存器偏移地址。

表1 芯片GPIO寄存器对应的基地址

GPIO控制器 基地址
GPIO11 0x120D_B000
GPIO10 0x120D_A000
GPIO9 0x120D_9000
GPIO8 0x120D_8000
GPIO7 0x120D_7000
GPIO6 0x120D_6000
GPIO5 0x120D_5000
GPIO4 0x120D_4000
GPIO3 0x120D_3000
GPIO2 0x120D_2000
GPIO1 0x120D_1000
GPIO0 0x120D_0000

表2 GPIO寄存器概览

偏移地址 名称 描述
0x000~0x3FC GPIO_DATA GPIO数据寄存器
0x400 GPIO_DIR GPIO方向控制寄存器
0x404 GPIO_IS GPIO中断触发寄存器
0x408 GPIO_IBE GPIO双沿触发中断寄存器
0x40C GPIO_IEV GPIO触发中断条件寄存器
0x410 GPIO_IE GPIO中断屏蔽寄存器
0x414 GPIO_RIS GPIO原始中断状态寄存器
0x418 GPIO_MIS GPIO屏蔽状态中断寄存器
0x41C GPIO_IC GPIO中断清除寄存器
  • GPIO_DATA为GPIO数据寄存器。用来对输入或输出数据进行缓存。当配置GPIO_DIR中对应位为输出时,写入GPIO_DATA寄存器的值将会输出到相应的管脚(注意需要配置正确的管脚复用);如果配置为输入时,将会读取相应输入管脚的值。
  • GPIO_DIR为GPIO方向控制寄存器。用来配置GPIO管脚方向。
Bits Access Name Description
[7:0] RW gpio_dir GPIO方向控制寄存器。bit[7:0]分别对应 GPIO_DATA[7:0],各比特可独立控制。 0:输入; 1:输出。

我们要想设置GPIO7_2的方向为输出,GPIO7基地址为0x120D7000,加上方向偏移的0x400为0x120D7400。第二个引脚设置为1,二进制为0000 0100就是0x04。所以使用命令:

1
himm 0x120D7400 0x04

(3)设置GPIO的值

我们操作GPIO7_2就是0b 00 0001 0000 也就是0x010 加上偏移也就是0x120D7010,让GPIO7_2输出高就是himm 0x120D7010 0b0000 0100 也就是himm 0x120D7010 0x04。

5 设置按钮槽函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
* 函数名称:void on_PbOpenP7_2_released()
* 函数功能:打开GPIO7_2的槽函数
* 作者:JR.Wang
* 日期:2024.07.28
*/
void gpio::on_PbOpenP7_2_released()
{
system("himm 0x112F004C 0");
system("himm 0x120D7400 0x04");
system("himm 0x120D7010 0x04");
}

/*
* 函数名称:void on_PbCloseP7_2_released()
* 函数功能:关闭GPIO7_2的槽函数
* 作者:JR.Wang
* 日期:2024.07.28
*/
void gpio::on_PbCloseP7_2_released()
{
system("himm 0x120D7010 0");
}

6 移植到开发板运行

(1)设置QT环境变量

1
2
3
4
5
6
7
8
export QWS_MOUSE_PROTO=IntelliMouse:/dev/input/mice;
export QWS_SIZE=1920*1080;
export QTDIR=/root/get/hisilicon/Qt-5.12.9-hi3516dv300;
export QT_QPA_FONTDIR=/root/get/hisilicon/Qt-5.12.9-hi3516dv300/lib/fonts;
export LD_LIBRARY_PATH=/root/get/hisilicon/Qt-5.12.9-hi3516dv300/lib:/root/get/hisilicon/Telltch/lib;
export QT_PLUGIN_PATH=/root/get/hisilicon/Qt-5.12.9-hi3516dv300/plugins;
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0;
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1920x1080:offset=0x0:nographicsmodeswitch;

(2)运行海思hb

1
./sample_hifb 0

(3)运行程序

1
./Hi3516Project -qws