摘要:本文为你带来LiteOS基于Sensorhub的超声波模组移植的应用。
LiteOS传感框架即Sensor Hub,是一个基于Huawei LiteOS物联网操做系统的传感器管理框架。面试
随着物联网的发展,物联网终端愈来愈智能化,例如在我的穿戴、智能家居、家用医疗等终端上将配置愈来愈多的传感器,来获取更多传感数据,使终端更加智能,使得开发和维护变得复杂和困难。LiteOS传感框架将物联网终端设备上例如加速计(Accelerometer)、陀螺仪(Gyroscope)、气压仪(Barometer)、温湿度计(Humidometer)等不一样类型的传感器统一管理,经过抽象不一样类型传感器接口,屏蔽其硬件细节,作到“硬件”无关性,很是方便于物联网设备的开发、维护和功能扩展。算法
LiteOS传感框架主要包括了Sensor Manager、BSP manager,Converged Algorithms。segmentfault
HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。基本工做原理:(1)采用IO口TRIG触发测距,给至少10us的高电平信号;(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,经过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间声速(340M/S))/2;二、实物图:如右图接线,VCC供5V电源,GND为地线,TRIG触发控制信号输入,ECHO回响信号输出等四支线。图一实物图三、电气参数:电气参数HC-SR04超声波模块工做电压DC 5 V工做电流15mA工做频率40Hz最远射程4m最近射程2cm测量角度15度输入触发信号10uS的TTL脉冲输出回响信号输出TTL电平信号,与射程成比例规格尺寸4520*15mm。框架
从时序图代表你只须要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此经过发射信号到收到的回响信号时间间隔能够计算获得距离。公式:uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;建议测量周期为60ms以上,以防止发射信号对回响信号的影响。dom
经过时序图能够完成一个简单的读取传感器的接收程序:(这里用GPIOA1和GPIOA4举例)测试
uint32_t hcsr04_read (void) { local_time=0; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // pull the TRIG pin HIGH delay(2); // wait for 2 us HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // pull the TRIG pin HIGH delay(10); // wait for 10 us HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // pull the TRIG pin low // read the time for which the pin is high while (!(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4))); // wait for the ECHO pin to go high while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4)) // while the pin is high { local_time++; // measure time for which the pin is high delay (1); } return local_time * .034/2; }
先写iO操做,初始化、打开、关闭和读取数据的操做ui
STATIC INT32 SR04Init(SensorType *sensor) { (VOID)(sensor); GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin : PD11 */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PD12 PD13 PD14 PD15 */ GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); return LOS_OK; } STATIC INT32 SR04ReadData(SensorType *sensor) { PRINTK("read datan"); INT32 *data = (INT32 *)sensor->sensorData; data[0] = hcsr04_read(); return LOS_OK; } STATIC INT32 SR04Open(SensorType *sensor, OpenParam *para) { UINT32 ret; (VOID)(para); SR04 *SR04 = (SR04 *)sensor->priv; if ((sensor->sensorStat == SENSOR_STAT_OPEN) && (sensor->interval == SR04Period)) { return LOS_OK; } if (SR04->gyroTimerId != INVALID_TIMER_ID) { ret = LOS_SwtmrDelete(SR04->gyroTimerId); SR04->gyroTimerId = INVALID_TIMER_ID; if (ret != LOS_OK) { PRINT_ERR("delete a timer failed!n"); return LOS_NOK; } } // creat a timer, first parameter is ticks. ret = LOS_SwtmrCreate(sensor->interval, LOS_SWTMR_MODE_PERIOD, (SWTMR_PROC_FUNC)GypoTimerFunc, &SR04->gyroTimerId, (UINT32)sensor); if (ret != LOS_OK) { PRINT_ERR("creat a timer failed!n"); return LOS_NOK; } ret = LOS_SwtmrStart(SR04->gyroTimerId); if (ret != LOS_OK) { PRINT_ERR("start timer errn"); } SR04Period = sensor->interval; PRINTK("SR04 on.n"); return LOS_OK; } STATIC INT32 SR04Close(SensorType *sensor) { UINT32 ret; if (sensor->sensorStat == SENSOR_STAT_CLOSE) { PRINT_DEBUG("sr04 has been closedn"); return LOS_OK; } __HAL_RCC_GPIOA_CLK_DISABLE(); PRINTK("SR04 off.n"); return LOS_OK; }
而后将设计的驱动注册到框架上spa
STATIC struct SensorOperation Sr04Ops = { .Init = SR04Init, .Open = SR04Open, .Close = SR04Close, .ReadData = SR04ReadData, }; STATIC SensorType g_sensorSR04 = { .sensorOp = &Sr04Ops, .sensorData = &g_SR04Data, .sensorDataLen = sizeof(g_SR04Data), .priv = &g_SR04Priv, .tag = TAG_BEGIN, .cmd = CMD_CMN_INTERVAL_REQ, .interval = DEFAULT_INTERVAL, }; VOID SR04Register(VOID) { SensorRegister(&g_sensorSR04); }
将驱动注册到通用sensor驱动模块上。今天的代码移植基本完成,后续有传感器和板子进行验证操作系统
这个驱动是有问题,就是这个是读取时阻塞的程序,后面试过,须要设计时采用定时器和外部中断完成,能够将这个阻塞的程序改为非阻塞的,效率大大提高,后续讲解如何用定时器和外部触发中断完成这个驱动设计。设计