OpenHarmony智能开发套件[驱动开发篇·上] 原创 精华
OpenHarmony智能开发套件[驱动开发篇·上]
前言
前面我们介绍了OpenHarmony的内核编程,没有学习的小伙伴们可以参考下面的链接。
下面我们继续跟着架构图去学习另一个板块——驱动,本片将介绍
驱动开发简介
什么是驱动开发呢,回想我们之前介绍内核的时候,内核的作用是帮助我们完成对硬件的操控的,我们已经通过KAL内核抽象层提供的规范接口,实现了对内核的一些基本控制,但是并没有涉及到硬件设备,那么驱动开发的含意就呼之欲出了。
驱动开发是指为操作系统或硬件设备编写软件驱动程序的过程。驱动程序是一种特殊的软件,它与操作系统或硬件设备进行交互,以使它们能够有效地通信和协同工作。通俗点讲就是IO控制硬件设备。IO流在读写文件时大家都会用到,我们的驱动也像IO流,只不过操作的对象不在是虚拟的文件,而是你手中的开发板,实实在在摸得到的硬件设备。
硬件设备介绍
硬件总览
笔者使用的是智能家居开发套件:Hi3861
硬件详细介绍
底板
核心板
oled屏幕
交通灯
RGB灯板
环境检测板
NFC
驱动开发
GPIO
GPIO可以理解为数字I/O,是一种电平控制,由0和1表示,0表示低电平,1表示高电平。Hi3861芯片一共有15各个GPIO引脚,芯片内部集成了GPIO模块,方便我们去使用。
Hi3861 GPIO 引脚分布
IoT接口
OprnHarmony提供了操作物联网各种外接设备的一组API,方便我们去控制与外接设备的交互。一共有三类IoT接口
- HAL硬件抽象层接口
- HDF硬件驱动框架接口
- 海思SDK接口
其中HDF接口是主推接口,在上面的架构图中也能看到,海思的SDK是原厂商提供的底层接口
GPIO控制流程
IoT编程工作环境补充
在源码目录生成的 .vscode的目录下的 c_cpp_properties.json 文件中做出如下添加
[注:目录可能因为源码版本不同而不一致,这里可以手动搜索文件来确定库的存放位置]
打开 usr_config.mk 文件 修改如下配置,防止后续的操作中出现编译错误,笔者报错时,也是在这卡了很久。这个配置项默认是关闭的,就会导致某些库中的方法无法被识别,编译就会出问题,主要是pwm模块的使用,这里提前说一下。
GPIO-API
- GPIO初始化
参数解释:
id
: GPIO的引脚编号
返回值:
IOT_SUCCESS
:如果GPIO设备成功初始化,则返回该值。
IOT_FAILURE
:如果GPIO设备初始化失败,则返回该值。
- GPIO参数设置
参数解释:
id
: GPIO的引脚编号
dir
: 设置GPIO为输入/输出
返回值:
IOT_SUCCESS
:如果GPIO设备成功设置,则返回该值。
IOT_FAILURE
:如果GPIO设备设置失败,则返回该值。
其中,IotGPIODir 的定义如下的枚举类型:
- 设置GPIO输出状态
参数解释:
id
: GPIO的引脚编号
val
: 输出的电平值
返回值:
IOT_SUCCESS
:如果GPIO设备成功设置,则返回该值。
IOT_FAILURE
:如果GPIO设备设置失败,则返回该值。
其中,IotGPIOValue的定义如下的枚举类型:
- 解除GPIO
参数解释:
id
: GPIO的引脚编号
返回值:
IOT_SUCCESS
:如果GPIO设备成功解除,则返回该值。
IOT_FAILURE
:如果GPIO设备解除失败,则返回该值。
- 获取GPIO引脚状态
参数解释:
id
: GPIO的引脚编号
*val
: 获取输出的电平值的指针
返回值:
IOT_SUCCESS
:如果GPIO设备成功获取,则返回该值。
IOT_FAILURE
:如果GPIO设备获取失败,则返回该值。
这个API和设置GPIO引脚的API很像,只不过val属性变成了个指针,也就通过这个指针帮我们获取到GPIO的引脚状态的。
- 引脚中断函数注册
参数解释:
id
:GPIO引脚的编号。
intType
:中断类型。
intPolarity
:中断极性。
func
:中断回调函数。
arg
:中断回调函数中使用的参数的指针。
返回值:
IOT_SUCCESS
:如果成功启用GPIO引脚的中断功能,则返回该值。
IOT_FAILURE
:如果启用GPIO引脚的中断功能失败,则返回该值。
其中 IotGpioIntType 定义如下的枚举类型
IOT_INT_TYPE_LEVEL
:表示电平触发的中断类型。这种中断类型基于GPIO引脚的电平状态进行触发,即当引脚的电平为特定的电平(例如高电平或低电平)时触发中断。
IOT_INT_TYPE_EDGE
:表示边沿触发的中断类型。这种中断类型基于GPIO引脚的电平变化进行触发,即当引脚的电平从一个状态变化到另一个状态(例如从低电平到高电平或从高电平到低电平)时触发中断。
IotGpioIntPolarity 定义如下的枚举类型
IOT_GPIO_EDGE_FALL_LEVEL_LOW
:表示在低电平或下降沿触发中断。这意味着当GPIO引脚的电平为低电平时或引脚的电平从高电平变为低电平时,触发中断。
IOT_GPIO_EDGE_RISE_LEVEL_HIGH
:表示在高电平或上升沿触发中断。这意味着当GPIO引脚的电平为高电平时或引脚的电平从低电平变为高电平时,触发中断。
当我们向外界设备进行输入流操作时,需要处理一些业务逻辑,在中断函数中完成,后面会后案例让大家体会。
- 引脚中断函数解除
参数解释:
id
:GPIO引脚的编号。
返回值:
IOT_SUCCESS
:如果成功解除GPIO引脚的中断功能,则返回该值。
IOT_FAILURE
:如果解除GPIO引脚的中断功能失败,则返回该值。
解除类型的API都比较简单。
- 设置引脚的功能复用
参数解释:
id
:硬件管脚的枚举类型 hi_io_name
,表示要设置复用功能的IO索引。
val
:复用功能的枚举类型 hi_u8
,表示要设置的复用功能。根据待设置的硬件管脚,从给定的枚举值中选择相应的功能。
返回值:
0
:成功设置复用功能。
HI_ERR_GPIO_INVALID_PARAMETER
:设置复用功能失败,输入参数无效或不支持的功能。
其中 hi_io_name 的美剧类型定义如下
hi_u8 的定义如下
Hi3861的引脚数量少,很多功能都是被集成在同一个引脚上的,因此需要我们去选择引脚配置。
- 启用某个IO引脚的上下拉功能
参数解释:
id
:硬件管脚的枚举类型 hi_io_name
,表示要设置上下拉功能的IO引脚的索引。
val
:上下拉状态的枚举类型 hi_io_pull
,表示要设置的上下拉状态。
返回值:
0
:成功设置上下拉功能。
HI_ERR_GPIO_INVALID_PARAMETER
:设置上下拉功能失败,输入参数无效或不支持的功能。
其中 hi_io_pull 的定义如下的枚举类型:
上下拉功能可用于确定GPIO引脚的输入电平状态。例如,通过启用上拉功能,可以将引脚的输入电平拉高,使其在未连接外部设备时保持为高电平状态。这样,在检测外部设备连接时,可以通过读取引脚的输入电平状态来确定设备的连接状态。
GPIO控制LED案例
能够使用我们的user按键控制可编程led灯的熄灭与点亮
思路:通过读取按键的电平状态,触发中断回调函数,修改led的电平
-
新建样例目录
applications/sample/wifi-iot/app/led_gpio_demo
-
新建源文件和gn文件
applications/sample/wifi-iot/app/led_gpio_demo/ledGpio.c
applications/sample/wifi-iot/app/led_gpio_demo/BUILD.gn
-
编写源文件,ledGpio.c [笔者加了详细的注释,就直接上代码了]
- 编写BIULD.gn文件
- 编写app目录下的BUILD.gn文件
-
编译,烧录
-
重启开发板,点击user按钮,观察可编程led的状态。
PWM
除了GPIO外,我们还可以通过PWM进行外部设备的控制,PWM是一种脉冲调制技术,用于控制数字系统中的模拟信号。通过改变信号的占空比,PWM可以模拟出不同的电压或电流值。在PWM信号中,周期固定,但高电平和低电平的持续时间可以不同。例如,一个50%的占空比意味着高电平和低电平各占一个周期的一半时间。当占空比增加时,高电平的持续时间增加,低电平的持续时间减少,平均输出功率也相应增加。因此,我们还可以用PWM控制led的亮度,因为占空比会直接影响输出的功率,功率会影响灯的亮度,算是中学物理了。广泛应用于电机控制、LED调光、音频生成等。
占空比与灯泡亮度
总结
PWM有两个重要的参数,第一个是输出频率,频率越高,则模拟的效果越好;第二个是占空比,占空比就是改变输出模拟效果的电压大小,占空比越大则模拟出的电压越大。
PWM-API
很多基础的IoT接口都已经在GPIO-API上讲到了,这里的介绍就相对简单一点。
- 初始化PWM
通过参数port,指定PWM的端口号
- 启用PWM
参数解释:
port
:PWM的端口号
duty
:PWM输出的占空比
freq
:PWM输出的频率
- 停止PWM
通过参数port,停止PWM的输出
结合GPIO和PWM我们已经可以去控制一些板子了,就不单独设计PWM的案例了。
交通灯板的控制
交通灯板上一共有3个小板块,红绿灯,蜂鸣器,按钮。下面逐个为大家讲解如何使用对应的API去控制他们。(涉及 GPIO控制设备和中断函数处理 )
按钮控制蜂鸣器
按一下按钮,蜂鸣器鸣叫3秒
-
新建样例目录
applications/sample/wifi-iot/app/pwm_out_demo
-
新建源文件和gn文件
applications/sample/wifi-iot/app/pwm_out_demo/pwm.c
applications/sample/wifi-iot/app/pwm_out_demo/BUILD.gn
-
编写源文件,pwm.c
- 编写BIULD.gn文件
- 编写app目录下的BUILD.gn文件
- 编译,烧录
- 重启开发板,点击s1按钮,可以听到蜂鸣器鸣叫。
按钮切换红绿灯
按一下按钮,红绿灯顺次切换
-
新建样例目录
applications/sample/wifi-iot/app/traffic_demo
-
新建源文件和gn文件
applications/sample/wifi-iot/app/traffic_demo/traffic.c
applications/sample/wifi-iot/app/traffic_demo/BUILD.gn
-
编写源文件,traffic.c
- 编写BIULD.gn文件
- 编写app目录下的BUILD.gn文件
- 编译,烧录
- 重启开发板,点击s1按钮,可以看到红绿灯正在切换。大家也可以修改代码,实现有红黄绿,绿黄红那样变化。
至此,交通灯板的三个小模块就给大家介绍到这里,这些都是基本操作,仅在如何控制设备,与设备交互,大家可以根据自己的想法,创新一些业务逻辑,使用该功能板完成相应的场景业务。
结束语
本片主要介绍了GPIO,PWM控制驱动的方案,并在交通灯板上进行了实际演示,以及三色灯的使用。后续的开发板硬件设备会在OpenHarmony智能开发套件[驱动开发篇·下]中详细讲解,包括人体红外感应,光敏电阻,RGB灯效,温湿度传感器,oled屏幕的点亮。
[本来每一个案例后面都做了实际效果演示视频的,但是视频好像上传不了,那暂时就没有视频演示了。]
跟着文章重新回顾了下GPIO
硬件介绍的图片都是作者自己做的吗,好详细
视频可以考虑发在社区的极客show中:https://ost.51cto.com/show
好的,感谢
正好手里也在用3861
很全的资料整理,感谢讲解