F439_CPP_MPL3115A2_Project_01 1.0
STM32F439 MPL3115A2 pressure and temperature tutorial
Loading...
Searching...
No Matches
main.c
Go to the documentation of this file.
1/* USER CODE BEGIN Header */
19/* USER CODE END Header */
20/* Includes ------------------------------------------------------------------*/
21#include "main.h"
22
23/* Private includes ----------------------------------------------------------*/
24/* USER CODE BEGIN Includes */
25#include <stdio.h>
26#include <string.h>
27#include "mpl3115a2.h"
28/* USER CODE END Includes */
29
30/* Private typedef -----------------------------------------------------------*/
31/* USER CODE BEGIN PTD */
32
33/* USER CODE END PTD */
34
35/* Private define ------------------------------------------------------------*/
36/* USER CODE BEGIN PD */
37
38/* USER CODE END PD */
39
40/* Private macro -------------------------------------------------------------*/
41/* USER CODE BEGIN PM */
42
43/* USER CODE END PM */
44
45/* Private variables ---------------------------------------------------------*/
46I2C_HandleTypeDef hi2c1;
47
48UART_HandleTypeDef huart1;
49
50/* USER CODE BEGIN PV */
51
52/* USER CODE END PV */
53
54/* Private function prototypes -----------------------------------------------*/
55void SystemClock_Config(void);
56static void MX_GPIO_Init(void);
57static void MX_I2C1_Init(void);
58static void MX_USART1_UART_Init(void);
59/* USER CODE BEGIN PFP */
60
61/* USER CODE END PFP */
62
63/* Private user code ---------------------------------------------------------*/
64/* USER CODE BEGIN 0 */
68#ifdef REDIRECT_PRINTF
69#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
70#endif
71
72#ifdef REDIRECT_PRINTF
82PUTCHAR_PROTOTYPE
83{
84 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
85
86 return ch;
87}
88#endif
89
97void reset_I2C(void)
98{
99 GPIO_InitTypeDef GPIO_InitStruct = {0};
100
101 HAL_I2C_DeInit(&hi2c1);
102 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
103 GPIO_InitStruct.Pin = GPIO_PIN_8;
104 GPIO_InitStruct.Pull = GPIO_NOPULL;
105 GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
106 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
107
108 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
109
110 for (int i = 0; i < 10; i++) {
111 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
112 HAL_Delay(20);
113 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
114 HAL_Delay(20);
115 }
116
117 MX_I2C1_Init();
118}
119/* USER CODE END 0 */
120
125int main(void)
126{
127
128 /* USER CODE BEGIN 1 */
129 uint32_t lastTempTime = HAL_GetTick();
130 uint32_t lastPressureTime = HAL_GetTick();
131
132 char msg[80];
133 HAL_StatusTypeDef halStatus = HAL_OK;
134
135 /* USER CODE END 1 */
136
137 /* MCU Configuration--------------------------------------------------------*/
138
139 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
140 HAL_Init();
141
142 /* USER CODE BEGIN Init */
143
144 /* USER CODE END Init */
145
146 /* Configure the system clock */
148
149 /* USER CODE BEGIN SysInit */
150
151 /* USER CODE END SysInit */
152
153 /* Initialize all configured peripherals */
154 MX_GPIO_Init();
155 MX_I2C1_Init();
157 /* USER CODE BEGIN 2 */
158 /* Clear the serial terminal and print the tutorial banner. */
159 printf("\x1b[2J\x1b[H");
160 printf("Domo Arigato!!!\r\n");
161 HAL_Delay(5000);
162 printf("\x1b[2J\x1b[H");
163 printf("MPL3115A2:\r\n");
164
165 MPL3115A2_Init(&hi2c1, MPL3115A2_ADDRESS);
166
167 uint8_t statusMPL31152A;
168 /* USER CODE END 2 */
169
170 /* Infinite loop */
171 /* USER CODE BEGIN WHILE */
172 while (1)
173 {
174 int count = 0;
175
176 do {
177 halStatus = MPL3115A2_GetStatus(&statusMPL31152A);
178
179 if (halStatus != HAL_OK) {
181 }
182
183 count++;
184
185 if (count > 2) {
186 break;
187 }
188 } while (!(statusMPL31152A & MPL3115A2_REGISTER_STATUS_TDR));
189
190
191 if ((statusMPL31152A & MPL3115A2_REGISTER_STATUS_TDR) && (HAL_GetTick() - lastTempTime) >= 5000) {
192 float celsius = 0;
193 float fahrenheit;
194
195 halStatus = MPL3115A2_ReadTemperature(&celsius);
196
197 if (halStatus != HAL_OK) {
199 }
200
201 fahrenheit = (celsius * 9.0f) / 5.0f + 32.0f;
202
203 printf("\x1b[1;45H");
204 printf(" ");
205 printf("\x1b[1;45H");
206 sprintf(msg, "%.2fF\r\n", fahrenheit);
207 printf("%s", msg);
208
209 lastTempTime = HAL_GetTick();
210 }
211
212 count = 0;
213 do {
214 halStatus = MPL3115A2_GetStatus(&statusMPL31152A);
215
216 if (halStatus != HAL_OK) {
218 }
219
220 count++;
221
222 if (count > 2) {
223 break;
224 }
225 } while (!(statusMPL31152A & MPL3115A2_REGISTER_STATUS_PTDR));
226
227 if ((statusMPL31152A & MPL3115A2_REGISTER_STATUS_PTDR) && (HAL_GetTick() - lastPressureTime) >= 5000) {
228 float pressure_inHg;
229
230 halStatus = MPL3115A2_ReadPressure(&pressure_inHg);
231
232 if (halStatus != HAL_OK) {
234 }
235
236 printf("\x1b[1;60H");
237 printf(" ");
238 printf("\x1b[1;60H");
239 sprintf(msg, "%.2f inHg\r\n", pressure_inHg);
240 printf("%s", msg);
241
242 lastPressureTime = HAL_GetTick();
243 }
244
245 /* USER CODE END WHILE */
246
247 /* USER CODE BEGIN 3 */
248 }
249 /* USER CODE END 3 */
250}
251
257{
258 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
259 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
260
263 __HAL_RCC_PWR_CLK_ENABLE();
264 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
265
269 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
270 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
271 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
272 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
273 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
274 RCC_OscInitStruct.PLL.PLLM = 8;
275 RCC_OscInitStruct.PLL.PLLN = 180;
276 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
277 RCC_OscInitStruct.PLL.PLLQ = 4;
278 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
279 {
281 }
282
285 if (HAL_PWREx_EnableOverDrive() != HAL_OK)
286 {
288 }
289
292 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
293 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
294 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
295 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
296 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
297 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
298
299 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
300 {
302 }
303}
304
310static void MX_I2C1_Init(void)
311{
312
313 /* USER CODE BEGIN I2C1_Init 0 */
314
315 /* USER CODE END I2C1_Init 0 */
316
317 /* USER CODE BEGIN I2C1_Init 1 */
318
319 /* USER CODE END I2C1_Init 1 */
320 hi2c1.Instance = I2C1;
321 hi2c1.Init.ClockSpeed = 100000;
322 hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
323 hi2c1.Init.OwnAddress1 = 0;
324 hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
325 hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
326 hi2c1.Init.OwnAddress2 = 0;
327 hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
328 hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
329 if (HAL_I2C_Init(&hi2c1) != HAL_OK)
330 {
332 }
333
336 if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
337 {
339 }
340
343 if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
344 {
346 }
347 /* USER CODE BEGIN I2C1_Init 2 */
348
349 /* USER CODE END I2C1_Init 2 */
350
351}
352
358static void MX_USART1_UART_Init(void)
359{
360
361 /* USER CODE BEGIN USART1_Init 0 */
362
363 /* USER CODE END USART1_Init 0 */
364
365 /* USER CODE BEGIN USART1_Init 1 */
366
367 /* USER CODE END USART1_Init 1 */
368 huart1.Instance = USART1;
369 huart1.Init.BaudRate = 19200;
370 huart1.Init.WordLength = UART_WORDLENGTH_8B;
371 huart1.Init.StopBits = UART_STOPBITS_1;
372 huart1.Init.Parity = UART_PARITY_NONE;
373 huart1.Init.Mode = UART_MODE_TX_RX;
374 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
375 huart1.Init.OverSampling = UART_OVERSAMPLING_16;
376 if (HAL_UART_Init(&huart1) != HAL_OK)
377 {
379 }
380 /* USER CODE BEGIN USART1_Init 2 */
381
382 /* USER CODE END USART1_Init 2 */
383
384}
385
391static void MX_GPIO_Init(void)
392{
393 /* USER CODE BEGIN MX_GPIO_Init_1 */
394
395 /* USER CODE END MX_GPIO_Init_1 */
396
397 /* GPIO Ports Clock Enable */
398 __HAL_RCC_GPIOC_CLK_ENABLE();
399 __HAL_RCC_GPIOH_CLK_ENABLE();
400 __HAL_RCC_GPIOA_CLK_ENABLE();
401 __HAL_RCC_GPIOB_CLK_ENABLE();
402
403 /* USER CODE BEGIN MX_GPIO_Init_2 */
404
405 /* USER CODE END MX_GPIO_Init_2 */
406}
407
408/* USER CODE BEGIN 4 */
409
410/* USER CODE END 4 */
411
417{
418 /* USER CODE BEGIN Error_Handler_Debug */
419 __disable_irq();
420 while (1)
421 {
422 }
423 /* USER CODE END Error_Handler_Debug */
424}
425
426#ifdef USE_FULL_ASSERT
434void assert_failed(uint8_t *file, uint32_t line)
435{
436 /* USER CODE BEGIN 6 */
437 (void)file;
438 (void)line;
439 /* USER CODE END 6 */
440}
441#endif /* USE_FULL_ASSERT */
void Error_Handler(void)
This function is executed in case of error occurrence.
Definition main.c:416
static void MX_I2C1_Init(void)
I2C1 Initialization Function.
Definition main.c:310
static void MX_USART1_UART_Init(void)
USART1 Initialization Function.
Definition main.c:358
void SystemClock_Config(void)
System Clock Configuration.
Definition main.c:256
int main(void)
The application entry point.
Definition main.c:125
void reset_I2C(void)
Enable printf redirection through USART1 when REDIRECT_PRINTF is defined.
Definition main.c:97
static void MX_GPIO_Init(void)
GPIO Initialization Function.
Definition main.c:391
: Common application definitions for the MPL3115A2 tutorial.
HAL_StatusTypeDef MPL3115A2_Init(I2C_HandleTypeDef *hi2c, uint16_t devAddress)
Initialize and configure the MPL3115A2 sensor.
Definition mpl3115a2.c:40
HAL_StatusTypeDef MPL3115A2_ReadPressure(float *pressure_inHg)
Read and convert the MPL3115A2 pressure measurement.
Definition mpl3115a2.c:156
HAL_StatusTypeDef MPL3115A2_GetStatus(uint8_t *retVal)
Read the MPL3115A2 STATUS register.
Definition mpl3115a2.c:99
HAL_StatusTypeDef MPL3115A2_ReadTemperature(float *celsius)
Read and convert the MPL3115A2 temperature measurement.
Definition mpl3115a2.c:125