|
|
1 ano atrás | |
|---|---|---|
| .. | ||
| .settings | 1 ano atrás | |
| applications | 1 ano atrás | |
| board | 2 anos atrás | |
| figures | 1 ano atrás | |
| packages | 2 anos atrás | |
| .config | 1 ano atrás | |
| .cproject | 1 ano atrás | |
| .gitattributes | 2 anos atrás | |
| .gitignore | 2 anos atrás | |
| .project | 2 anos atrás | |
| Kconfig | 2 anos atrás | |
| README.md | 1 ano atrás | |
| README.pdf | 1 ano atrás | |
| SConscript | 2 anos atrás | |
| SConstruct | 2 anos atrás | |
| makefile.targets | 2 anos atrás | |
| mklinks.bat | 2 anos atrás | |
| project.uvoptx | 2 anos atrás | |
| project.uvprojx | 2 anos atrás | |
| rtconfig.h | 1 ano atrás | |
| rtconfig.py | 2 anos atrás | |
| rtconfig_preinc.h | 2 anos atrás | |
| template.uvoptx | 2 anos atrás | |
| template.uvprojx | 2 anos atrás | |
本例程主要功能是利用 RT-Thread 的 AP3216C 软件包读取传感器 ap3216c 测量的接近感应(ps,proximity sensor)与光照强度(als, ambient light sensor)。
AP3216C 软件包提供了使用接近感应(ps)与光照强度(als)传感器 ap3216c 基本功能,并且提供了硬件中断的可选功能,如需详细了解该软件包,请参考 AP3216C 软件包中的 README(路径位于./package/ap3216-vxx)。
ap3216c 硬件原理图如下所示:
如上图所示,单片机通过 I2C2(soft) scl(PF1)、 I2C2(soft) sda(PF0) 对传感器 ap3216c 发送命令、读取数据等, AP_INT(PG13) 为硬件中断引脚。
接近感应与光照强度传感器在开发板中的位置如下图所示:
该传感器能够实现如下功能:
本例程的源码位于 /projects/03_driver_als_ps。
接近感应与光照强度传感器 ap3216c 的示例代码位于 applications/main.c 中。 主要流程:
示例代码如下:
int main(void)
{
ap3216c_device_t dev;
const char *i2c_bus_name = "i2c2";
int count = 0;
/* 初始化 ap3216c */
dev = ap3216c_init(i2c_bus_name);
if (dev == RT_NULL)
{
LOG_E("The sensor initializes failure.");
return 0;
}
while (count++ < 100)
{
rt_uint16_t ps_data;
float brightness;
/* 读接近感应值 */
ps_data = ap3216c_read_ps_data(dev);
if (ps_data == 0)
{
LOG_D("object is not proximity of sensor.");
}
else
{
LOG_D("current ps data : %d.", ps_data);
}
/* 读光照强度值 */
brightness = ap3216c_read_ambient_light(dev);
LOG_D("current brightness: %d.%d(lux).", (int)brightness, ((int)(10 * brightness) % 10));
rt_thread_mdelay(1000);
}
return 0;
}
menuconfig,进行终端可视化菜单配置。Hardware Dirvers Config --> Onboard Peripheral Drivers --> Enable AP3216C(I2C2),选中Enable AP3216C后,点击键盘Y键选中对应外设,然后用方向键选中底部菜单的SAVE后,回车键保存,然后退出。
pkgs --update命令,将自动下载刚刚选中的软件包(上游服务器为gitee),此操作将会下载AP3216C的驱动软件包,路径位于工程目录下的packages文件夹中。
至此,我们便可以在空白工程模板的基础上,获取到完整的项目依赖库。接下来我们便可以基于软件包进行进一步的工程开发。
示例代码如下:
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-5-10 ShiHao first version
*/
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <ap3216c.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
int main(void)
{
ap3216c_device_t dev;
const char* i2c_bus_name = "i2c2";
unsigned int count = 1;
dev = ap3216c_init(i2c_bus_name);
while (count > 0)
{
rt_uint16_t ps_data;
float brightness;
ps_data = ap3216c_read_ps_data(dev);
LOG_D("current ps data: %d.", ps_data);
brightness = ap3216c_read_ambient_light(dev);
LOG_D("current brightness: %d.%d(lux).", (int)brightness, ((int)(10 * brightness) % 10));
count++;
}
return 0;
}
STM32F407-RT-SPARK 资源包,然后创建新工程,执行编译。编译完成后,将开发板的 ST-Link USB 口与 PC 机连接,然后将固件下载至开发板。
烧录完成后,此时可以在 PC 端使用终端工具打开开发板的 ST-Link 提供的虚拟串口,设置串口波特率为 115200,数据位 8 位,停止位 1 位,无流控,开发板的运行日志信息即可实时输出出来,显示如下所示:
\ | /
- RT - Thread Operating System
/ | \ 4.1.1 build Jun 9 2023 13:18:36
2006 - 2022 Copyright by RT-Thread team
msh >[D/main] object is not proximity of sensor.
[D/main] current brightness: 32.9(lux).
[D/main] object is not proximity of sensor.
[D/main] current brightness: 33.6(lux).
[D/main] current ps data : 7.
[D/main] current brightness: 33.9(lux).
[D/main] object is not proximity of sensor.
[D/main] current brightness: 33.9(lux).
[D/main] current ps data : 7.
[D/main] current brightness: 33.9(lux).
[D/main] current ps data : 11.
[D/main] current brightness: 33.9(lux).
[D/main] current ps data : 1.
[D/main] current brightness: 33.9(lux).
[D/main] object is not proximity of sensor.
[D/main] current brightness: 33.9(lux).
[D/main] object is not proximity of sensor.
[D/main] current brightness: 33.9(lux).
[D/main] current ps data : 1023.
[D/main] current brightness: 0.0(lux).
[D/main] current ps data : 1023.
[D/main] current brightness: 0.0(lux).
[D/main] object is not proximity of sensor.
[D/main] current brightness: 32.9(lux).
[D/main] object is not proximity of sensor.
[D/main] current brightness: 33.6(lux).
[D/main] current ps data : 1.
[D/main] current brightness: 33.6(lux).
[D/main] current ps data : 8.
[D/main] current brightness: 33.6(lux).
[D/main] object is not proximity of sensor.
[D/main] current brightness: 33.6(lux).
在RT-Thread系统架构中,为了实现高效的模块解耦,我们使用了“自动初始化”机制,模块的初始化代码不再需要显式调用,仅需在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行。这样的代码架构有助于我们简化初始化流程,便于实现动态配置的效果。
在这里举例使用这一功能进行开发,我们创建两个.c文件,分别为main.c和app_ap3216c.c文件,在main.C中,只进行点灯操作,在app_ap3216c.c中,进行ap3216c模块的初始化及相应的控制操作。
main.c文件代码:
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-5-10 ShiHao first version
*/
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
/* 配置 LED 灯引脚 */
#define PIN_LED_B GET_PIN(F, 11) // PF11 : LED_B --> LED
#define PIN_LED_R GET_PIN(F, 12) // PF12 : LED_R --> LED
int main(void)
{
unsigned int count = 1;
rt_pin_mode(PIN_LED_R, OUTPUT_OD);
for(;;)
{
/* LED 灯亮 */
rt_pin_write(PIN_LED_R, PIN_LOW);
LOG_D("led on, count: %d", count);
rt_thread_mdelay(500);
/* LED 灯灭 */
rt_pin_write(PIN_LED_R, PIN_HIGH);
LOG_D("led off");
rt_thread_mdelay(500);
count++;
}
return 0;
}
app_ap3216c.c文件代码:
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <ap3216c.h>
#define DBG_TAG "app_ap3216c_entry"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
ap3216c_device_t dev;
void app_ap3216c_entry(void* argument){
rt_uint16_t ps_data;
float brightness;
for(;;)
{
ps_data = ap3216c_read_ps_data(dev);
LOG_D("current ps data: %d.", ps_data);
brightness = ap3216c_read_ambient_light(dev);
LOG_D("current brightness: %d.%d(lux).", (int)brightness, ((int)(10 * brightness) % 10));
rt_thread_delay(1000);
}
}
int app_ap3216c_init(void){
const char* i2c_bus_name = "i2c2";
rt_thread_t tid;
dev = ap3216c_init(i2c_bus_name);
tid = rt_thread_create("AP3216C", app_ap3216c_entry, NULL, 1024, 20, 1);
if(tid != RT_NULL) rt_thread_startup(tid);
return 0;
}
INIT_DEVICE_EXPORT(app_ap3216c_init);
可以看到,在main.c的代码中并未调用ap3216c相关的代码程序,甚至也没有创建相应线程。而与ap3216c相关的代码操作被放在了app_ap3216c.c中,由init初始化函数与entry线程入口函数组成。
其中,init函数通过INIT_DEVICE_EXPORT宏函数注册进入rt-thread内核系统之中,在内核启动时自动执行,初始化相关外设后,在内部创建了app线程,然后在线程中执行传感器数据采集的功能。
暂无。