/** * @brief Initialize the HMC5883 magnetometer sensor. * @return none */ int32_t PIOS_HMC5883_Init(uint32_t i2c_id, const struct pios_hmc5883_cfg *cfg) { dev = (struct hmc5883_dev *) PIOS_HMC5883_alloc(); if (dev == NULL) return -1; dev->cfg = cfg; dev->i2c_id = i2c_id; #ifdef PIOS_HMC5883_HAS_GPIOS PIOS_EXTI_Init(cfg->exti_cfg); #endif if (PIOS_HMC5883_Config(cfg) != 0) return -2; PIOS_SENSORS_Register(PIOS_SENSOR_MAG, dev->queue); int result = xTaskCreate(PIOS_HMC5883_Task, (const signed char *)"pios_hmc5883", HMC5883_TASK_STACK, NULL, HMC5883_TASK_PRIORITY, &dev->task); PIOS_Assert(result == pdPASS); dev->data_ready_sema = xSemaphoreCreateMutex(); return 0; }
/** * @brief Initialize the HMC5883 magnetometer sensor. * @return 0 on success */ int32_t PIOS_HMC5883_Init(uint32_t i2c_id, const struct pios_hmc5883_cfg *cfg) { dev = (struct hmc5883_dev *) PIOS_HMC5883_alloc(); if (dev == NULL) return -1; dev->cfg = cfg; dev->i2c_id = i2c_id; dev->orientation = cfg->Default_Orientation; /* check if we are using an irq line */ if (cfg->exti_cfg != NULL) { PIOS_EXTI_Init(cfg->exti_cfg); dev->data_ready_sema = PIOS_Semaphore_Create(); PIOS_Assert(dev->data_ready_sema != NULL); } else { dev->data_ready_sema = NULL; } if (PIOS_HMC5883_Config(cfg) != 0) return -2; PIOS_SENSORS_Register(PIOS_SENSOR_MAG, dev->queue); dev->task = PIOS_Thread_Create(PIOS_HMC5883_Task, "pios_hmc5883", HMC5883_TASK_STACK_BYTES, NULL, HMC5883_TASK_PRIORITY); PIOS_Assert(dev->task != NULL); return 0; }
/** * @brief Initialize the HMC5883 magnetometer sensor. * @return none */ void PIOS_HMC5883_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; #if defined(STM32F2XX) || defined(STM32F4XX) /* Configure EOC pin as input floating */ GPIO_InitStructure.GPIO_Pin = PIOS_HMC5883_DRDY_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(PIOS_HMC5883_DRDY_GPIO_PORT, &GPIO_InitStructure); /* Configure the End Of Conversion (EOC) interrupt */ SYSCFG_EXTILineConfig(PIOS_HMC5883_DRDY_PORT_SOURCE, PIOS_HMC5883_DRDY_PIN_SOURCE); EXTI_InitStructure.EXTI_Line = PIOS_HMC5883_DRDY_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); #else /* Enable DRDY GPIO clock */ RCC_APB2PeriphClockCmd(PIOS_HMC5883_DRDY_CLK | RCC_APB2Periph_AFIO, ENABLE); /* Configure EOC pin as input floating */ GPIO_InitStructure.GPIO_Pin = PIOS_HMC5883_DRDY_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(PIOS_HMC5883_DRDY_GPIO_PORT, &GPIO_InitStructure); /* Configure the End Of Conversion (EOC) interrupt */ GPIO_EXTILineConfig(PIOS_HMC5883_DRDY_PORT_SOURCE, PIOS_HMC5883_DRDY_PIN_SOURCE); EXTI_InitStructure.EXTI_Line = PIOS_HMC5883_DRDY_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); #endif /* Enable and set EOC EXTI Interrupt to the lowest priority */ NVIC_InitStructure.NVIC_IRQChannel = PIOS_HMC5883_DRDY_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PIOS_HMC5883_DRDY_PRIO; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Configure the HMC5883 Sensor */ PIOS_HMC5883_ConfigTypeDef HMC5883_InitStructure; HMC5883_InitStructure.M_ODR = PIOS_HMC5883_ODR_15; HMC5883_InitStructure.Meas_Conf = PIOS_HMC5883_MEASCONF_NORMAL; HMC5883_InitStructure.Gain = PIOS_HMC5883_GAIN_1_9; HMC5883_InitStructure.Mode = PIOS_HMC5883_MODE_SINGLE; PIOS_HMC5883_Config(&HMC5883_InitStructure); pios_hmc5883_data_ready = false; }