Example using the LSM303 MEMS compass onboard the STM32F3-Discovery board.
Dependencies: LSM303DLHC mbed
Diff: main.cpp
- Revision:
- 1:4d3e9a507feb
- Parent:
- 0:6b2892e8a0b2
- Child:
- 2:781079d0c247
--- a/main.cpp Tue Mar 10 22:12:47 2015 +0000 +++ b/main.cpp Sat Mar 21 16:20:45 2015 +0000 @@ -1,42 +1,110 @@ +/********************************************************************************** +* @file main.cpp +* @author Name +* @version V0.1 +* @date 09-March-2015 +* @brief LEDs blinking with ticker. +* With push button pressed, LEDs turn on. +***********************************************************************************/ + +/**********************************************************************************/ +/* Table of used pins on STM32F3 Discovery kit */ +/**********************************************************************************/ +/* Discovery pin | ST Nucleo F303RE pin | peripheral */ +/* PA_0 | PC_13 | User button */ +/* PE_8 to PE_15 | PA_5 | LEDs */ +/**********************************************************************************/ + +/* Includes ----------------------------------------------------------------------*/ + #include "mbed.h" -#include "LSM303DLHC.h" -#include "stm32f3xx_hal_gpio.h" +#include "LSM303DLHC.h" //library necessary to comunicate with LSM303DLHC +#include "stm32f3xx_hal_gpio.h" //library necessary to blink LEDs on STM32F3 discovery + +/* Defines -----------------------------------------------------------------------*/ + +// In some mbed libraries are not included these definines -//DigitalOut my_led(LED1); -InterruptIn my_button(PA_0); +//#define GPIOE_BASE (AHB2PERIPH_BASE + 0x1000) +//#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +//#define RCC_AHBENR_GPIOEEN ((uint32_t)0x00200000) +//#define RCC_AHBPeriph_GPIOE RCC_AHBENR_GPIOEEN + +/* Variables ---------------------------------------------------------------------*/ bool oppos = false; +//mbed - initialization of peripherals +InterruptIn my_button(PA_0); + +//LSM303DLHC - initialization of peripherals LSM303DLHC compass(PB_7, PB_6); +/* Functions----------------------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : pressed. +* Description : Blinks whit 8 LEDs if button is pressed and change variables. +* Input : None. +* Output : Blinks whit 8 LEDs and set variable. +* Return : None. +*******************************************************************************/ void pressed() { + // Toggle pins PE_15 to PE_8 , where LEDs are attached to HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_14 | GPIO_PIN_15 | GPIO_PIN_13 | GPIO_PIN_12 | GPIO_PIN_11 | GPIO_PIN_10 | GPIO_PIN_9 | GPIO_PIN_8); + // oposit value of oppos oppos = !oppos; } +/*********************************************************************************** +* Function Name : main. +* Description : Main routine. +* Input : None. +* Output : None. +* Return : None. +***********************************************************************************/ int main() { float ax, ay, az; float mx, my, mz; + //inicialize power (clock source) to port E (GPIOE) __GPIOE_CLK_ENABLE(); + // RCC->AHBENR |= RCC_AHBPeriph_GPIOE; // if __GPIOE_CLK_ENABLE(); is not defined + + //inicialize pins + // atructure to set GPIO GPIO_InitTypeDef GPIO_InitStruct; + //Specifies the operating mode for the selected pins. + // Output Push Pull Mode GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + //Specifies the Pull-up or Pull-Down activation for the selected pins. + //Pull-up activation GPIO_InitStruct.Pull = GPIO_PULLUP; + //Specifies the speed for the selected pins. + //High speed GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; - GPIO_InitStruct.Pin = GPIO_PIN_14 | GPIO_PIN_15 | GPIO_PIN_13 | GPIO_PIN_12 | GPIO_PIN_11 | GPIO_PIN_10 | GPIO_PIN_9 | GPIO_PIN_8; - HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); - + //Specifies the GPIO pins to be configured. + //Pins 15 to 8 + GPIO_InitStruct.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13 | GPIO_PIN_12 | GPIO_PIN_11 | GPIO_PIN_10 | GPIO_PIN_9 | GPIO_PIN_8; + + //Inicialize pins PE_15 to PE_8 + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + // button was pressed, call function pressed my_button.fall(&pressed); while (1) { + //read value from compass compass.read(&ax, &ay, &az, &mx, &my, &mz); - //výpočet uhlu a blikání diodama + //calculate angle double heading = atan2(my, mx); if (heading < 0) heading += 2 * 3.14159265359; heading=heading * (double)180 / 3.14159265359; - if(heading>=338 || heading<23) { + //set LEDs + if(heading>=338 || heading<23) { // compare angle + // on value oppos set (reset) one LED and other reset (set) HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,oppos?GPIO_PIN_SET:GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOE,GPIO_PIN_14 | GPIO_PIN_13 | GPIO_PIN_12 | GPIO_PIN_11 | GPIO_PIN_10 | GPIO_PIN_9 | GPIO_PIN_8,oppos?GPIO_PIN_RESET:GPIO_PIN_SET); }