Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
- /*/* USER CODE BEGIN Header */
- /**
- ******************************************************************************
- * @file : main.c
- * @brief : Main program body
- ******************************************************************************
- ** This notice applies to any and all portions of this file
- * that are not between comment pairs USER CODE BEGIN and
- * USER CODE END. Other portions of this file, whether
- * inserted by the user or by software development tools
- * are owned by their respective copyright owners.
- *
- * COPYRIGHT(c) 2018 STMicroelectronics
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. Neither the name of STMicroelectronics nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- ******************************************************************************
- */
- /* USER CODE END Header */
- /* Includes ------------------------------------------------------------------*/
- #include "main.h"
- #include "i2c.h"
- #include "usart.h"
- #include "gpio.h"
- #include "spi.h"
- #define MCU_ADDRESS (0x30 << 1)
- #define I2C_DELAY 100
- #define I2C_TRA_REC_TIMEOUT 100
- #define MAG_M_THRESHOLD_0 10
- #define MAG_M_THRESHOLD_1 10
- #define MAG_M_THRESHOLD_2 10
- #define NOT_USING_COUNT 1
- #define COUNT_THRESHOLD 2
- #define CS_LORA_GPIO GPIOC
- #define CS_LORA_PIN_N GPIO_PIN_8
- #define NUMBER_OF_INITIAL_RUNS_INIT_MAG 10
- int8_t spi_status = 1;
- void SystemClock_Config(void);
- /**
- * @brief The application entry point.
- * @retval int
- */
- int main(void)
- {
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_USART2_UART_Init();
- MX_I2C1_Init();
- MX_SPI2_Init();
- MX_CRC_Init();
- HAL_I2C_MspInit(&hi2c1);
- HAL_SPI_MspInit(&hspi2);
- HAL_Delay(1000);
- uint8_t msg_buf[1000];
- uint8_t i2c_buff[8];
- uint8_t spi_buffer[64];
- // LoRa
- // temperature
- uint8_t lora_temp;
- // Magnetic sensor
- int16_t mag_setval[3];
- char mag_status[2];
- int16_t mag_setval_average[3];
- // motion detected
- uint8_t motion_count = 0;
- char motion[2];
- // temperature values
- uint8_t mag_raw_temperature;
- // status values
- uint8_t mag_raw_status;
- // Reset
- i2c_buff[0] = 0x08;
- i2c_buff[1] = 0x10; // 0b00010000
- HAL_I2C_Master_Transmit(&hi2c1, MCU_ADDRESS, i2c_buff, 2, I2C_TRA_REC_TIMEOUT);
- HAL_Delay(I2C_DELAY);
- //init_magnetometer_average(mag_setval_average);
- HAL_GPIO_WritePin(CS_LORA_GPIO, CS_LORA_PIN_N, GPIO_PIN_SET);
- HAL_Delay(100);
- // Select LoRa mode
- init_lora_module();
- /*set_frequency(868.0);
- sprintf(msg_buf, "SET LORA FREQ: ");
- HAL_UART_Transmit(&huart2, msg_buf, strlen(msg_buf), 1000);
- print_status(spi_status);*/
- while(1) {
- // Start temperature, magnetic and motion detection
- /*i2c_buff[0] = 0x08;
- i2c_buff[1] = 0x07; // 0b00000111
- HAL_I2C_Master_Transmit(&hi2c1, MCU_ADDRESS, i2c_buff, 2, I2C_TRA_REC_TIMEOUT);
- HAL_Delay(I2C_DELAY);
- // Read status
- i2c_buff[0] = 0x07;
- HAL_I2C_Master_Transmit(&hi2c1, MCU_ADDRESS, i2c_buff, 1, I2C_TRA_REC_TIMEOUT);
- HAL_I2C_Master_Receive(&hi2c1, MCU_ADDRESS, i2c_buff, 1, I2C_TRA_REC_TIMEOUT);
- raw_status = i2c_buff[0];
- if (raw_status == 0x13) {
- snprintf(status, sizeof(status), "OK");
- } else {
- snprintf(status, sizeof(status), "FL");
- }
- // Read temperature and magnet
- i2c_buff[0] = 0x00;
- HAL_I2C_Master_Transmit(&hi2c1, MCU_ADDRESS, i2c_buff, 1, I2C_TRA_REC_TIMEOUT);
- HAL_I2C_Master_Receive(&hi2c1, MCU_ADDRESS, i2c_buff, 7, I2C_TRA_REC_TIMEOUT);
- setval[0] = *((uint16_t *) &i2c_buff[0])-32768; // X
- setval[1] = *((uint16_t *) &i2c_buff[2])-32768; // Y
- setval[2] = *((uint16_t *) &i2c_buff[4])-32768; // Z
- raw_temperature = i2c_buff[6]; // Temp
- // Calculate compass average
- setval_average[0] = (setval_average[0] + setval[0]) / 2;
- setval_average[1] = (setval_average[1] + setval[1]) / 2;
- setval_average[2] = (setval_average[2] + setval[2]) / 2;
- if ((abs(setval_average[0] - setval[0]) > MAG_M_THRESHOLD_0) ||
- (abs(setval_average[1] - setval[1]) > MAG_M_THRESHOLD_1) ||
- (abs(setval_average[2] - setval[2]) > MAG_M_THRESHOLD_2)) {
- motion_count++;
- if (motion_count >= COUNT_THRESHOLD || NOT_USING_COUNT) {
- snprintf(motion, sizeof(status), "DE");
- }
- } else {
- snprintf(motion, sizeof(status), "ND");
- motion_count = 0;
- }
- sprintf(msg_buf, "Set DATA: %6d %6d %6d \r\n AVG VALUES %6d %6d %6d\r\nTemperature %d \r\nStatus %02x/%s \r\nDetected motion %s\r\n",
- setval[0], setval[1], setval[2],
- setval_average[0], setval_average[1], setval_average[2],
- i2ctemp_to_degc(raw_temperature),
- raw_status, status, motion);
- HAL_UART_Transmit(&huart2, msg_buf, strlen(msg_buf), 1000);*/
- HAL_Delay(1000);
- /*sprintf(msg_buf, "FREQ: %d \n\r", get_frequency());
- HAL_UART_Transmit(&huart2, msg_buf, strlen(msg_buf), 1000);*/
- }
- }
- uint8_t i2ctemp_to_degc(uint8_t i2c_temp)
- {
- return ((uint8_t)(i2c_temp*0.7)-75);
- }
- void init_lora_module()
- {
- uint8_t _spi_buffer[8];
- uint8_t msg_buf[64];
- _spi_buffer[0] = RH_RF95_REG_01_OP_MODE | RH_SPI_WRITE_MASK;
- _spi_buffer[1] = RH_RF95_MODE_SLEEP | RH_RF95_LONG_RANGE_MODE;
- HAL_GPIO_WritePin(CS_LORA_GPIO, CS_LORA_PIN_N, GPIO_PIN_RESET);
- spi_status = HAL_SPI_Transmit(&hspi2, _spi_buffer, 2, 1);
- print_status(spi_status);
- HAL_GPIO_WritePin(CS_LORA_GPIO, CS_LORA_PIN_N, GPIO_PIN_SET);
- HAL_Delay(100);
- _spi_buffer[0] = RH_RF95_REG_01_OP_MODE & ~RH_SPI_WRITE_MASK;
- HAL_GPIO_WritePin(CS_LORA_GPIO, CS_LORA_PIN_N, GPIO_PIN_RESET);
- spi_status = HAL_SPI_Transmit(&hspi2, _spi_buffer, 1, 1);
- print_status(spi_status);
- spi_status = HAL_SPI_Receive(&hspi2, _spi_buffer, 1, 1);
- print_status(spi_status);
- HAL_GPIO_WritePin(CS_LORA_GPIO, CS_LORA_PIN_N, GPIO_PIN_SET);
- if (_spi_buffer[0] != (RH_RF95_MODE_SLEEP | RH_RF95_LONG_RANGE_MODE))
- {
- sprintf(msg_buf, "DATA: %d\n\r", _spi_buffer[0]);
- HAL_UART_Transmit(&huart2, msg_buf, strlen(msg_buf), 1000);
- }
- }
- // in Mhz
- uint32_t get_frequency()
- {
- uint8_t _spi_buffer[8];
- uint32_t _lora_module_frequency = 0;
- for (uint8_t i = 0; i < 3; i++)
- {
- _spi_buffer[0] = 0x06 + i;
- HAL_GPIO_WritePin(CS_LORA_GPIO, CS_LORA_PIN_N, GPIO_PIN_RESET);
- spi_status = HAL_SPI_Transmit(&hspi2, _spi_buffer, 1, 100);
- spi_status = HAL_SPI_Transmit(&hspi2, _spi_buffer, 1, 100);
- HAL_GPIO_WritePin(CS_LORA_GPIO, CS_LORA_PIN_N, GPIO_PIN_SET);
- _lora_module_frequency |= _spi_buffer[0];
- /*
- uint8_t msg[10];
- sprintf(msg, "%d ", _spi_buffer[0]);
- HAL_UART_Transmit(&huart2, msg, strlen(msg), 100);*/
- _lora_module_frequency = _lora_module_frequency << 8;
- }
- _lora_module_frequency = _lora_module_frequency >> 8;
- return ((_lora_module_frequency) * RH_RF96_FSTEP) / 1000000;
- }
- // in Mhz
- void set_frequency(float center)
- {
- uint8_t _spi_buffer[8];
- uint32_t frf = (center * 1000000.0) / RH_RF96_FSTEP;
- HAL_GPIO_WritePin(CS_LORA_GPIO, CS_LORA_PIN_N, GPIO_PIN_RESET);
- _spi_buffer[0] = (0x06 << 1) | 1;
- _spi_buffer[1] = (frf >> 16) & 0xff;
- _spi_buffer[2] = (frf >> 8) & 0xff;
- _spi_buffer[3] = frf & 0xff;
- spi_status = HAL_SPI_Transmit(&hspi2, _spi_buffer, 4, 1000);
- HAL_GPIO_WritePin(CS_LORA_GPIO, CS_LORA_PIN_N, GPIO_PIN_SET);
- }
- void print_status(int8_t status)
- {
- uint8_t _msg_buf[10];
- switch (status)
- {
- case HAL_OK:
- sprintf(_msg_buf, "HAL_OK \n\r");
- break;
- case HAL_ERROR:
- sprintf(_msg_buf, "HAL_ERROR \n\r");
- break;
- case HAL_BUSY:
- sprintf(_msg_buf, "HAL_BUSE \n\r");
- break;
- case HAL_TIMEOUT:
- sprintf(_msg_buf, "HAL_TIMEOUT \n\r");
- break;
- default:
- sprintf(_msg_buf, "HAL_? \n\r");
- break;
- }
- HAL_UART_Transmit(&huart2, _msg_buf, strlen(_msg_buf), 1000);
- }
- void init_magnetometer_average(int16_t *setval_average) {
- uint8_t average_first_measurement_flag = 1;
- uint8_t i2c_buff[8];
- uint8_t msg_buffer[64];
- int16_t _setval_average[3];
- for (uint8_t i = 0; i < NUMBER_OF_INITIAL_RUNS_INIT_MAG; i++) {
- // Start temperature, magnetic and motion detection
- i2c_buff[0] = 0x08;
- i2c_buff[1] = 0x07; // 0b00000111
- HAL_I2C_Master_Transmit(&hi2c1, MCU_ADDRESS, i2c_buff, 2, I2C_TRA_REC_TIMEOUT);
- HAL_Delay(I2C_DELAY);
- // Read temperature and magnet
- i2c_buff[0] = 0x00;
- HAL_I2C_Master_Transmit(&hi2c1, MCU_ADDRESS, i2c_buff, 1, I2C_TRA_REC_TIMEOUT);
- HAL_I2C_Master_Receive(&hi2c1, MCU_ADDRESS, i2c_buff, 7, I2C_TRA_REC_TIMEOUT);
- _setval_average[0] = *((uint16_t *)&i2c_buff[0])-32768;
- _setval_average[1] = *((uint16_t *)&i2c_buff[2])-32768;
- _setval_average[2] = *((uint16_t *)&i2c_buff[4])-32768;
- if (average_first_measurement_flag) {
- setval_average[0] = _setval_average[0];
- setval_average[1] = _setval_average[1];
- setval_average[2] = _setval_average[2];
- average_first_measurement_flag = 0;
- } else {
- setval_average[0] = (setval_average[0] + _setval_average[0]) / 2;
- setval_average[1] = (setval_average[1] + _setval_average[1]) / 2;
- setval_average[2] = (setval_average[2] + _setval_average[2]) / 2;
- }
- snprintf(msg_buffer, sizeof(msg_buffer),"%d AVG VALUES %6d %6d %6d\r\n\r\n", i,
- setval_average[0], setval_average[1], setval_average[2]);
- HAL_UART_Transmit(&huart2, msg_buffer, strlen(msg_buffer), 1000);
- }
- }
- /**
- * @brief System Clock Configuration
- * @retval None
- */
- void SystemClock_Config(void)
- {
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
- RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
- /**Initializes the CPU, AHB and APB busses clocks
- */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
- RCC_OscInitStruct.HSIState = RCC_HSI_ON;
- RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
- RCC_OscInitStruct.PLL.PLLM = 1;
- RCC_OscInitStruct.PLL.PLLN = 10;
- RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
- RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
- RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- Error_Handler();
- }
- /**Initializes the CPU, AHB and APB busses clocks
- */
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
- {
- Error_Handler();
- }
- PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_I2C1;
- PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
- PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
- {
- Error_Handler();
- }
- /**Configure the main internal regulator output voltage
- */
- if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
- {
- Error_Handler();
- }
- }
- /* USER CODE BEGIN 4 */
- /* USER CODE END 4 */
- /**
- * @brief This function is executed in case of error occurrence.
- * @retval None
- */
- void Error_Handler(void)
- {
- /* USER CODE BEGIN Error_Handler_Debug */
- /* User can add his own implementation to report the HAL error return state */
- /* USER CODE END Error_Handler_Debug */
- }
- #ifdef USE_FULL_ASSERT
- /**
- * @brief Reports the name of the source file and the source line number
- * where the assert_param error has occurred.
- * @param file: pointer to the source file name
- * @param line: assert_param error line source number
- * @retval None
- */
- void assert_failed(char *file, uint32_t line)
- {
- /* USER CODE BEGIN 6 */
- /* User can add his own implementation to report the file name and line number,
- tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
- /* USER CODE END 6 */
- }
- #endif /* USE_FULL_ASSERT */
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement