Simple "hello world" style program for X-NUCLEO-IKS01A1 MEMS Inertial
Dependencies: BLE_API X_NUCLEO_IDB0XA1 X_NUCLEO_IKS01A1 mbed
Fork of HelloWorld_IKS01A1 by
main.cpp
- Committer:
- n0tform3
- Date:
- 2015-11-15
- Revision:
- 8:1c6281289d67
- Parent:
- 7:4985455162fc
File content as of revision 8:1c6281289d67:
#include "mbed.h" #include "x_nucleo_iks01a1.h" #include "mbed.h" #include "ble/BLE.h" #include "ble/services/HeartRateService.h" #include "ble/services/BatteryService.h" #include "ble/services/DeviceInformationService.h" //#include "stm32f4xx_conf.h" //#include "stm32f4xx.h" #include "led_RGB.h" #include "main.h" BLE ble; DigitalOut led1(LED1); const static char DEVICE_NAME[] = "HRM1"; static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE, GattService::UUID_DEVICE_INFORMATION_SERVICE}; static volatile bool triggerSensorPolling = false; uint8_t clock_source; void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) { ble.gap().startAdvertising(); // restart advertising } void periodicCallback(void) { led1 = !led1; triggerSensorPolling = true; } static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15); static MagneticSensor *magnetometer = mems_expansion_board->magnetometer; Serial pc(USBTX, USBRX); /* Simple main function */ int main() { uint8_t id; int32_t axes[3]; pc.baud(115200); printf("\r\n--- Starting new run ---\r\n"); RCC_DeInit(); RCC_HSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); RCC_PLLConfig(RCC_PLLSource_HSI, 8, 336, 4, 7); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div2); //APB2 84MHz/2 = 42MHz RCC_PCLK1Config(RCC_HCLK_Div2); clock_source = RCC_GetSYSCLKSource(); if (clock_source !=0) RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4 | RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE); Blue_Red_Setup(); Green_Setup(); magnetometer->ReadID(&id); printf("LIS3MDL magnetometer = 0x%X\r\n", id); led1 = 1; Ticker ticker; ticker.attach(periodicCallback, 1); // blink LED every second ble.init(); ble.gap().onDisconnection(disconnectionCallback); /* Setup primary service. */ uint8_t hrmCounter = 0; // init HRM to 100bps HeartRateService hrService(ble, hrmCounter, HeartRateService::LOCATION_FINGER); /* Setup auxiliary service. */ DeviceInformationService deviceInfo(ble, "ARM", "Model1", "SN1", "hw-rev1", "fw-rev1", "soft-rev1"); /* Setup advertising. */ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); ble.gap().setAdvertisingInterval(1000); /* 1000ms */ ble.gap().startAdvertising(); uint8_t note = 0; while(1) { if (triggerSensorPolling && ble.getGapState().connected) { triggerSensorPolling = false; magnetometer->Get_M_Axes(axes); //printf("%6ld,\t %6ld,\t %6ld\r\n", axes[0], axes[1], axes[2]); note = 0; if (axes[0]>-81-40 && axes[0]<23+40 && axes[1]>-259-40 && axes[1]<-167+40 && axes[2]>827-40 && axes[2]<981+40) note = 1; else if (axes[0]>163-40 && axes[0]<289+40 && axes[1]>-397-40 && axes[1]<-316+40 && axes[2]>311-40 && axes[2]<357+40) note = 2; else if (axes[0]>-73-40 && axes[0]<43+40 && axes[1]>-441-40 && axes[1]<-313+40 && axes[2]>335-40 && axes[2]<420+40) note = 3; else if (axes[0]>-45-40 && axes[0]<25+40 && axes[1]>-612-40 && axes[1]<-561+40 && axes[2]>632-40 && axes[2]<761+40) note = 4; else if (axes[0]>-64-40 && axes[0]<-6+40 && axes[1]>-7-40 && axes[1]<35+40 && axes[2]>524-40 && axes[2]<677+40) note = 5; else if (axes[0]>-210-40 && axes[0]<-137+40 && axes[1]>-431-40 && axes[1]<-294+40 && axes[2]>455-40 && axes[2]<615+40) note = 6; else if (axes[0]>429-40 && axes[0]<471+40 && axes[1]>-145-40 && axes[1]<-91+40 && axes[2]>480-40 && axes[2]<580+40) note = 7; else if (axes[0]>164-40 && axes[0]<264+40 && axes[1]>-650-40 && axes[1]<-604+40 && axes[2]>560-40 && axes[2]<700+40) note = 8; printf("%d\n", note); hrService.updateHeartRate(note); wait(0.3); } else { ble.waitForEvent(); // low power wait for event } switch (note){ case DO: TIM_SetCompare4(TIM3, 255); //RED TIM_SetCompare1(TIM4, 0); //GREEN TIM_SetCompare3(TIM3, 0); //BLU break; case RE: TIM_SetCompare4(TIM3, 255); //RED TIM_SetCompare1(TIM4, 153); //GREEN TIM_SetCompare3(TIM3, 0); //BLU break; case MI: TIM_SetCompare4(TIM3, 255); //RED TIM_SetCompare1(TIM4, 255); //GREEN TIM_SetCompare3(TIM3, 0); //BLU break; case FA: TIM_SetCompare4(TIM3, 0); //RED TIM_SetCompare1(TIM4, 255); //GREEN TIM_SetCompare3(TIM3, 0); //BLU break; case SOL: TIM_SetCompare4(TIM3, 0); //RED TIM_SetCompare1(TIM4, 0); //GREEN TIM_SetCompare3(TIM3, 255); //BLU break; case LA: TIM_SetCompare4(TIM3, 51); //RED TIM_SetCompare1(TIM4, 0); //GREEN TIM_SetCompare3(TIM3, 153); //BLU break; case SI: TIM_SetCompare4(TIM3, 255); //RED TIM_SetCompare1(TIM4, 0); //GREEN TIM_SetCompare3(TIM3, 255); //BLU break; case DO1: TIM_SetCompare4(TIM3, 255); //RED TIM_SetCompare1(TIM4, 255); //GREEN TIM_SetCompare3(TIM3, 255); //BLU break; case default: TIM_SetCompare4(TIM3, 0); //RED TIM_SetCompare1(TIM4, 0); //GREEN TIM_SetCompare3(TIM3, 0); //BLU } }