ISSDK  1.8
IoT Sensing Software Development Kit
main_baremetal_agm04.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016, Freescale Semiconductor, Inc.
3  * Copyright 2016-2017 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 /*! \file main_baremetal_agm04.c
10  \brief Bare metal implementation of sensor fusion on FRDM-K64F/FRDM-STBC-AGM04
11  using MMA8652 (Accel), FXAS21002 (Gyro) and MAG3110 (Mag).
12 
13  \note This file shows one recommended way to incorporate sensor fusion capabilities
14  into a bare metal project.
15 */
16 
17 // SDK and ISSDK Headers
18 #include "fsl_debug_console.h" // SDK header file for the debug interface
19 #include "board.h" // SDK header file to define board configuration
20 #include "pin_mux.h" // SDK header file for pin mux initialization functions
21 #include "clock_config.h" // SDK header file for clock configuration
22 #include "fsl_port.h" // SDK header file for Port I/O control
23 #include "fsl_i2c.h" // SDK header file for I2C interfaces
24 #include "fsl_i2c_cmsis.h"
25 #include "fsl_dspi_cmsis.h"
26 #include "register_io_i2c.h"
27 #include "fsl_pit.h" // SDK header for the Periodic Interval Timer
28 
29 // Sensor Fusion Headers
30 #include "sensor_fusion.h" // top level magCal and sensor fusion interfaces
31 #include "control.h" // Command/Streaming interface - application specific
32 #include "status.h" // Status indicator interface - application specific
33 #include "drivers.h" // NXP sensor drivers OR customer-supplied drivers
34 #include "driver_pit.h" // Project-specific - PIT is used to control main() timing loop
35 
36 // Global data structures
37 SensorFusionGlobals sfg; ///< This is the primary sensor fusion data structure
38 ControlSubsystem controlSubsystem; ///< used for serial communications
39 StatusSubsystem statusSubsystem; ///< provides visual (usually LED) status indicator
40 struct PhysicalSensor sensors[3]; ///< This implementation uses three physical sensors
41 
44  .functionParam = NULL,
45  .idleFunction = NULL
46 };
47 
48 /// This is a FreeRTOS (dual task) implementation of the NXP sensor fusion demo build.
49 int main(void)
50 {
51  int i; // loop index
52  ARM_DRIVER_I2C* I2Cdrv = &I2C_S_DRIVER; // defined in the <shield>.h file
53  BOARD_InitPins(); // defined in pin_mux.c, initializes pkg pins
54  BOARD_BootClockRUN(); // defined in clock_config.c, initializes clocks
55  BOARD_InitDebugConsole(); // defined in board.c, initializes the OpenSDA port
56 
57  I2Cdrv->Initialize(I2C_S_SIGNAL_EVENT); // Initialize the SDK driver for the I2C port
58  I2Cdrv->PowerControl(ARM_POWER_FULL); // Set the I2C Power mode.
59  I2Cdrv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST); // Configure the I2C bus speed
60 
61  initializeControlPort(&controlSubsystem); // configure pins and ports for the control sub-system
62  initializeStatusSubsystem(&statusSubsystem); // configure pins and ports for the status sub-system
63  initSensorFusionGlobals(&sfg, &statusSubsystem, &controlSubsystem); // Initialize sensor fusion structures
64  // "install" the sensors we will be using
65 #if F_USING_ACCEL
66  sfg.installSensor(&sfg, &sensors[0], MMA8652_I2C_ADDR, 1, (void*) I2Cdrv, &i2cBusInfo, MMA8652_Init, MMA8652_Read);
67 #endif
68 #if F_USING_GYRO
69  sfg.installSensor(&sfg, &sensors[1], FXAS21002_I2C_ADDR, 1, (void*) I2Cdrv, &i2cBusInfo, FXAS21002_Init, FXAS21002_Read);
70 #endif
71 #if F_USING_MAG
72  sfg.installSensor(&sfg, &sensors[2], MAG3110_I2C_ADDR, 1, (void*) I2Cdrv, &i2cBusInfo, MAG3110_Init, MAG3110_Read);
73 #endif
74  sfg.initializeFusionEngine(&sfg); // This will initialize sensors and magnetic calibration
75 
76  pit_init(1000000/FUSION_HZ); // pitIsrFlag will be set true at FUSION_HZ periodic intervals
77 
78  sfg.setStatus(&sfg, NORMAL); // If we got this far, let's set status state to NORMAL
79  while (true)
80  {
81  if (true == pitIsrFlag) { // Check whether occur interupt and toggle LED
82  sfg.readSensors(&sfg, 1); // Reads sensors, applies HAL and does averaging (if applicable)
83  sfg.conditionSensorReadings(&sfg); // magCal is run as part of this
84  sfg.runFusion(&sfg); // Run the actual fusion algorithms
85  sfg.applyPerturbation(&sfg); // apply debug perturbation (testing only)
86  sfg.loopcounter++; // The loop counter is used to "serialize" mag cal operations
87  i=i+1;
88  if (i>=4) { // Some status codes include a "blink" feature. This loop
89  i=0; // should cycle at least four times for that to operate correctly.
90  sfg.updateStatus(&sfg); // This is where pending status updates are made visible
91  }
92 
93  sfg.queueStatus(&sfg, NORMAL); // assume NORMAL status for next pass through the loop
94  sfg.pControlSubsystem->stream(&sfg, sUARTOutputBuffer); // Send stream data to the Sensor Fusion Toolbox
95  pitIsrFlag = false; // Reset the flag for the next cycle
96  }
97  }
98 }
99 /// \endcode
readSensors_t * readSensors
read all physical sensors
This structure defines the device specific info required by register I/O.
Definition: sensor_drv.h:102
StatusSubsystem statusSubsystem
provides visual (usually LED) status indicator
initializeFusionEngine_t * initializeFusionEngine
set sensor fusion structures to initial values
Provides function prototypes for driver level interfaces.
registerDeviceInfo_t i2cBusInfo
#define MAG3110_I2C_ADDR
Operation is Nominal.
An instance of PhysicalSensor structure type should be allocated for each physical sensors (combo dev...
setStatus_t * queueStatus
queue status change for next regular interval
int8_t MAG3110_Read(struct PhysicalSensor *sensor, SensorFusionGlobals *sfg)
int8_t MMA8652_Init(struct PhysicalSensor *sensor, SensorFusionGlobals *sfg)
int8_t MAG3110_Init(struct PhysicalSensor *sensor, SensorFusionGlobals *sfg)
Application-specific status subsystem.
conditionSensorReadings_t * conditionSensorReadings
preprocessing step for sensor fusion
Defines control sub-system.
The top level fusion structure.
struct PhysicalSensor sensors[3]
This implementation uses three physical sensors.
void initSensorFusionGlobals(SensorFusionGlobals *sfg, StatusSubsystem *pStatusSubsystem, ControlSubsystem *pControlSubsystem)
utility function to insert default values in the top level structure
Definition: sensor_fusion.c:51
int8_t FXAS21002_Init(struct PhysicalSensor *sensor, SensorFusionGlobals *sfg)
#define I2C_S_SIGNAL_EVENT
Definition: issdk_hal.h:34
The register_io_i2c.h file declares low-level interface functions for reading and writing sensor regi...
#define I2C_S_DRIVER
Definition: issdk_hal.h:33
he ControlSubsystem encapsulates command and data streaming functions.
Definition: control.h:42
int main(void)
This is a FreeRTOS (dual task) implementation of the NXP sensor fusion demo build.
#define BOARD_BootClockRUN
Definition: clock_config.h:19
runFusion_t * runFusion
run the fusion routines
ControlSubsystem controlSubsystem
used for serial communications
#define FXAS21002_I2C_ADDR
int8_t MMA8652_Read(struct PhysicalSensor *sensor, SensorFusionGlobals *sfg)
The sensor_fusion.h file implements the top level programming interface.
void pit_init(uint32_t microseconds)
Definition: driver_ctimer.c:64
setStatus_t * setStatus
change status indicator immediately
ARM_DRIVER_I2C * I2Cdrv
uint8_t sUARTOutputBuffer[256]
main output buffer defined in control.c
Definition: control.c:37
updateStatus_t * updateStatus
status=next status
#define FUSION_HZ
(int) actual rate of fusion algorithm execution and sensor FIFO reads
installSensor_t * installSensor
function for installing a new sensor into t
struct ControlSubsystem * pControlSubsystem
int8_t initializeControlPort(ControlSubsystem *pComm)
Initialize the control subsystem and all related hardware.
Definition: control.c:160
#define MMA8652_I2C_ADDR
#define I2C_S_DEVICE_INDEX
Definition: issdk_hal.h:35
int8_t FXAS21002_Read(struct PhysicalSensor *sensor, SensorFusionGlobals *sfg)
SensorFusionGlobals sfg
This is the primary sensor fusion data structure.
void BOARD_InitDebugConsole(void)
Definition: board.c:15
volatile bool pitIsrFlag
Definition: driver_ctimer.c:49
void initializeStatusSubsystem(StatusSubsystem *pStatus)
Definition: status.c:165
void BOARD_InitPins(void)
Configures pin routing and optionally pin electrical features.
Definition: pin_mux.c:47
streamData_t * stream
function to create packets for serial stream
Definition: control.h:51
applyPerturbation_t * applyPerturbation
apply step function for testing purposes
StatusSubsystem() provides an object-like interface for communicating status to the user...
Definition: status.h:22
int32_t loopcounter
counter incrementing each iteration of sensor fusion (typically 25Hz)
Provides a simple abstraction for a periodic interval timer.