本帖最后由 w562601331 于 2017-3-4 14:47 编辑
近日研究了sensertile的标准例程,对一些基本的功能做一下简单的分享和解读。
首先感谢@littleshrimp 的帖子
https://bbs.eeworld.com.cn/thread-511807-1-1.html
该技术贴针对STSW-STLKT01
例程里的LSM6DSM
加速度传感器的初始化解读了函数的调用过程,大体的调用过程如下:
main.c ->SensorTile_accelero.c –> LSM6DSM_ACC_GYRO_driver_HL.c -> LSM6DSM_ACC_GYRO_driver.c -> SensorTile.c -> stm32l4xx_hal_gpio.c
main.c ->SensorTile_accelero.c –> LSM6DSM_ACC_GYRO_driver_HL.c -> LSM6DSM_ACC_GYRO_driver.c -> SensorTile.c ->stm32l4xx_hal_spi.h
|
通过这两个步骤解决了传感器的初始化过程。
翌日,我对BlueMicrosystem2_V2.1.3的main函数进行了研究,总体的流程是这样的:
1.首先是编译器的选择以及变量定义、函数声明,此处省略无数字;
进入int main(void)主函数:
HAL的初始化,什么是HAL呢,其实就是硬件抽象层。
硬件抽象层是位于操作系统 内核与硬件电路之间的接口层,其目的在于将硬件抽象化。它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。 从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。
2.硬件抽象层初始化完成之后,进行
- RestartInBootLoaderMode = 0x0;
复制代码
启动BootLoader。
BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。
3.系统的时钟配置
- SystemClock_Config();
- Sensor_IO_SPI_CS_Init_All();
- InitTargetPlatform(TARGET_NUCLEO);或者InitTargetPlatform(TARGET_NUCLEO);
- InitLicenseManager();
复制代码
4.输出一些版本信息
5.初始化蓝牙服务
- Init_BlueNRG_Stack();
- Init_BlueNRG_Custom_Services();
复制代码
6.设置加速度计的级别为2G
- Set2GAccelerometerFullScale();
复制代码
读取加速度计的灵敏度
- BSP_ACCELERO_Get_Sensitivity(TargetBoardFeatures.HandleAccSensor,&sensitivity);
- sensitivity_Mul = sensitivity * ((float) FROM_MG_TO_G);
复制代码
7.初始化定时器
8.判断校准是不是在内存中已经使用,进行控制,然后设置起始时间
- if(LicensesIndexMap[OSX_MOTION_FX] != -1)
- {
- if(osxLicencesManager.LicVector[LicensesIndexMap[OSX_MOTION_FX]].osxLicenseInitialized) {
- ReCallCalibrationFromMemory(osxLicencesManager.Header.MagnetoCalibration);
- }
- }
- StartTime = HAL_GetTick();
复制代码
9.此时初始化完成,开始进入运行的wihle(1)循环,在其中控制指示灯的闪烁频率,并且通过中断的方式来实现各个传感器数据的读取,以完成整个系统的常规运行。