Siphon Regulator 1.0
Nanosattelite attitude determination and control system.
Loading...
Searching...
No Matches
main.c
Go to the documentation of this file.
1/* USER CODE BEGIN Header */
18/* USER CODE END Header */
19/* Includes ------------------------------------------------------------------*/
20#include "main.h"
21
22/* Private includes ----------------------------------------------------------*/
23/* USER CODE BEGIN Includes */
24#include "cmd_processing.h"
26#include "loop_fcn.h"
27#include "sensor_fcn.h"
28#include <stdio.h>
29/* USER CODE END Includes */
30
31/* Private typedef -----------------------------------------------------------*/
32/* USER CODE BEGIN PTD */
33
34/* USER CODE END PTD */
35
36/* Private define ------------------------------------------------------------*/
37/* USER CODE BEGIN PD */
39#define RX_BUFFER_LEN 64
41#define uart_rx_write_ptr (RX_BUFFER_LEN - hdma_usart1_rx.Instance->CNDTR)
42
43/* USER CODE END PD */
44
45/* Private macro -------------------------------------------------------------*/
46/* USER CODE BEGIN PM */
47
48/* USER CODE END PM */
49
50/* Private variables ---------------------------------------------------------*/
51SPI_HandleTypeDef hspi2;
52
53UART_HandleTypeDef huart1;
54DMA_HandleTypeDef hdma_usart1_rx;
55
56/* USER CODE BEGIN PV */
57static uint8_t uart_rx_buf[RX_BUFFER_LEN];
58static volatile uint16_t uart_rx_read_ptr = 0;
59
62
63/* USER CODE END PV */
64
65/* Private function prototypes -----------------------------------------------*/
66void SystemClock_Config(void);
67static void MX_GPIO_Init(void);
68static void MX_DMA_Init(void);
69static void MX_USART1_UART_Init(void);
70static void MX_SPI2_Init(void);
71/* USER CODE BEGIN PFP */
72
76void setting_init(void);
77
81void valve_init(void);
82
83/* USER CODE END PFP */
84
85/* Private user code ---------------------------------------------------------*/
86/* USER CODE BEGIN 0 */
87int _write(int file, char const *buf, int n)
88{
89 /* stdout redirection to UART2 */
90 HAL_UART_Transmit(&huart1, (uint8_t*)(buf), n, HAL_MAX_DELAY);
91 return n;
92}
93
94
95void setting_init(void)
96{
97 /* Default data */
98 set_data.angle = 90;
99 set_data.time_a = 10;
100 set_data.time_l = 20;
101 set_data.time_r = 20;
102 set_data.home = 0;
103}
104
105void valve_init(void)
106{
107 /* Valves are closed by default */
108 HAL_GPIO_WritePin(VALVE_L_GPIO_Port, VALVE_L_Pin, 0);
109 HAL_GPIO_WritePin(VALVE_R_GPIO_Port, VALVE_R_Pin, 0);
110}
111/* USER CODE END 0 */
112
117int main(void)
118{
119
120 /* USER CODE BEGIN 1 */
121 uint32_t cmd_reg = 0;
122 float set_position = 0;
123 float gyr_offset[3];
124
125 setting_init();
126 valve_init();
127 /* USER CODE END 1 */
128
129 /* MCU Configuration--------------------------------------------------------*/
130
131 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
132 HAL_Init();
133
134 /* USER CODE BEGIN Init */
135
136 /* USER CODE END Init */
137
138 /* Configure the system clock */
140
141 /* USER CODE BEGIN SysInit */
142
143 /* USER CODE END SysInit */
144
145 /* Initialize all configured peripherals */
146 MX_GPIO_Init();
147 MX_DMA_Init();
149 MX_SPI2_Init();
150 /* USER CODE BEGIN 2 */
151 HAL_UART_Receive_DMA(&huart1, uart_rx_buf, RX_BUFFER_LEN);
152
153 sensor_init(gyr_offset);
154
155 /* USER CODE END 2 */
156
157 /* Infinite loop */
158 /* USER CODE BEGIN WHILE */
159 while (1)
160 {
162 {
163 uint8_t b = uart_rx_buf[uart_rx_read_ptr];
164 /* increase read pointer */
166 {
168 }
169 /* process every received byte with the RX state machine */
170 uart_byte_available(b, &cmd_reg);
171
172 }
173
174 autoread_fcn(cmd_reg);
175 valve_fcn(&cmd_reg, &set_position);
176 regul_fcn(&cmd_reg, set_position);
177 sensor_get_value(gyr_offset);
178
179 /* USER CODE END WHILE */
180
181 /* USER CODE BEGIN 3 */
182 }
183 /* USER CODE END 3 */
184}
185
191{
192 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
193 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
194
198 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
199 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
200 RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
201 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
202 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
203 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
204 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL4;
205 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
206 {
208 }
209
212 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
213 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
214 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
215 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
216 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
217 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
218
219 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
220 {
222 }
223}
224
230static void MX_SPI2_Init(void)
231{
232
233 /* USER CODE BEGIN SPI2_Init 0 */
234
235 /* USER CODE END SPI2_Init 0 */
236
237 /* USER CODE BEGIN SPI2_Init 1 */
238
239 /* USER CODE END SPI2_Init 1 */
240 /* SPI2 parameter configuration*/
241 hspi2.Instance = SPI2;
242 hspi2.Init.Mode = SPI_MODE_MASTER;
243 hspi2.Init.Direction = SPI_DIRECTION_2LINES;
244 hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
245 hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
246 hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
247 hspi2.Init.NSS = SPI_NSS_SOFT;
248 hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
249 hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
250 hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
251 hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
252 hspi2.Init.CRCPolynomial = 10;
253 if (HAL_SPI_Init(&hspi2) != HAL_OK)
254 {
256 }
257 /* USER CODE BEGIN SPI2_Init 2 */
258
259 /* USER CODE END SPI2_Init 2 */
260
261}
262
268static void MX_USART1_UART_Init(void)
269{
270
271 /* USER CODE BEGIN USART1_Init 0 */
272
273 /* USER CODE END USART1_Init 0 */
274
275 /* USER CODE BEGIN USART1_Init 1 */
276
277 /* USER CODE END USART1_Init 1 */
278 huart1.Instance = USART1;
279 huart1.Init.BaudRate = 9600;
280 huart1.Init.WordLength = UART_WORDLENGTH_8B;
281 huart1.Init.StopBits = UART_STOPBITS_1;
282 huart1.Init.Parity = UART_PARITY_NONE;
283 huart1.Init.Mode = UART_MODE_TX_RX;
284 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
285 huart1.Init.OverSampling = UART_OVERSAMPLING_16;
286 if (HAL_UART_Init(&huart1) != HAL_OK)
287 {
289 }
290 /* USER CODE BEGIN USART1_Init 2 */
291
292 /* USER CODE END USART1_Init 2 */
293
294}
295
299static void MX_DMA_Init(void)
300{
301
302 /* DMA controller clock enable */
303 __HAL_RCC_DMA1_CLK_ENABLE();
304
305 /* DMA interrupt init */
306 /* DMA1_Channel5_IRQn interrupt configuration */
307 HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);
308 HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
309
310}
311
317static void MX_GPIO_Init(void)
318{
319 GPIO_InitTypeDef GPIO_InitStruct = {0};
320 /* USER CODE BEGIN MX_GPIO_Init_1 */
321
322 /* USER CODE END MX_GPIO_Init_1 */
323
324 /* GPIO Ports Clock Enable */
325 __HAL_RCC_GPIOC_CLK_ENABLE();
326 __HAL_RCC_GPIOD_CLK_ENABLE();
327 __HAL_RCC_GPIOA_CLK_ENABLE();
328 __HAL_RCC_GPIOB_CLK_ENABLE();
329
330 /*Configure GPIO pin Output Level */
331 HAL_GPIO_WritePin(BOARD_LED_GPIO_Port, BOARD_LED_Pin, GPIO_PIN_RESET);
332
333 /*Configure GPIO pin Output Level */
334 HAL_GPIO_WritePin(GPIOA, VALVE_R_Pin|VALVE_L_Pin|LED_R_Pin|LED_G_Pin, GPIO_PIN_RESET);
335
336 /*Configure GPIO pin Output Level */
337 HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET);
338
339 /*Configure GPIO pin : BOARD_LED_Pin */
340 GPIO_InitStruct.Pin = BOARD_LED_Pin;
341 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
342 GPIO_InitStruct.Pull = GPIO_NOPULL;
343 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
344 HAL_GPIO_Init(BOARD_LED_GPIO_Port, &GPIO_InitStruct);
345
346 /*Configure GPIO pins : VALVE_R_Pin VALVE_L_Pin LED_R_Pin LED_G_Pin */
347 GPIO_InitStruct.Pin = VALVE_R_Pin|VALVE_L_Pin|LED_R_Pin|LED_G_Pin;
348 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
349 GPIO_InitStruct.Pull = GPIO_NOPULL;
350 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
351 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
352
353 /*Configure GPIO pin : LED_Y_Pin */
354 GPIO_InitStruct.Pin = LED_Y_Pin;
355 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
356 GPIO_InitStruct.Pull = GPIO_NOPULL;
357 HAL_GPIO_Init(LED_Y_GPIO_Port, &GPIO_InitStruct);
358
359 /*Configure GPIO pin : SPI2_CS_Pin */
360 GPIO_InitStruct.Pin = SPI2_CS_Pin;
361 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
362 GPIO_InitStruct.Pull = GPIO_NOPULL;
363 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
364 HAL_GPIO_Init(SPI2_CS_GPIO_Port, &GPIO_InitStruct);
365
366 /* USER CODE BEGIN MX_GPIO_Init_2 */
367
368 /* USER CODE END MX_GPIO_Init_2 */
369}
370
371/* USER CODE BEGIN 4 */
372
373/* USER CODE END 4 */
374
380{
381 /* USER CODE BEGIN Error_Handler_Debug */
382 /* User can add his own implementation to report the HAL error return state */
383 __disable_irq();
384 while (1)
385 {
386 }
387 /* USER CODE END Error_Handler_Debug */
388}
389#ifdef USE_FULL_ASSERT
397void assert_failed(uint8_t *file, uint32_t line)
398{
399 /* USER CODE BEGIN 6 */
400 /* User can add his own implementation to report the file name and line number,
401 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
402 /* USER CODE END 6 */
403}
404#endif /* USE_FULL_ASSERT */
driver mpu9250 basic header file
settings_t set_data
Main system settings.
Definition main.c:61
sensor_data_t measured_data
Current sensor measured data.
Definition main.c:60
void uart_byte_available(uint8_t c, uint32_t *p_reg)
Recognizes commands in the received characters and sets the cmd register accordingly.
void valve_fcn(uint32_t *p_reg, float *p_set_pos)
It handles the execution of motion commands.
Definition loop_fcn.c:69
void autoread_fcn(uint32_t reg)
It handles the periodic transmission of the sensor data message.
Definition loop_fcn.c:27
void regul_fcn(uint32_t *p_reg, float set_pos)
It handles the regulation of the orientation.
Definition loop_fcn.c:183
void sensor_get_value(float *gyr_offset)
It handles reading the value from the sensor.
Definition sensor_fcn.c:49
void sensor_init(float *gyr_offset)
It initiates communication with the sensor.
Definition sensor_fcn.c:24
static volatile uint16_t uart_rx_read_ptr
Received read pointer for UART.
Definition main.c:58
#define RX_BUFFER_LEN
Definition main.c:39
void Error_Handler(void)
This function is executed in case of error occurrence.
Definition main.c:379
UART_HandleTypeDef huart1
Definition main.c:53
DMA_HandleTypeDef hdma_usart1_rx
Definition main.c:54
static uint8_t uart_rx_buf[RX_BUFFER_LEN]
Received buffer fo UART.
Definition main.c:57
static void MX_DMA_Init(void)
Definition main.c:299
static void MX_USART1_UART_Init(void)
USART1 Initialization Function.
Definition main.c:268
void SystemClock_Config(void)
System Clock Configuration.
Definition main.c:190
int main(void)
The application entry point.
Definition main.c:117
#define uart_rx_write_ptr
Definition main.c:41
void setting_init(void)
Set default values of set_data global variable.
Definition main.c:95
void valve_init(void)
Initialize valves. By default close.
Definition main.c:105
SPI_HandleTypeDef hspi2
Definition main.c:51
int _write(int file, char const *buf, int n)
Definition main.c:87
static void MX_SPI2_Init(void)
SPI2 Initialization Function.
Definition main.c:230
static void MX_GPIO_Init(void)
GPIO Initialization Function.
Definition main.c:317
: Header for main.c file. This file contains the common defines of the application.
#define VALVE_L_Pin
Definition main.h:149
#define BOARD_LED_GPIO_Port
Definition main.h:146
#define SPI2_CS_Pin
Definition main.h:157
#define VALVE_R_Pin
Definition main.h:147
#define VALVE_R_GPIO_Port
Definition main.h:148
#define BOARD_LED_Pin
Definition main.h:145
#define LED_Y_Pin
Definition main.h:153
#define LED_R_Pin
Definition main.h:151
#define SPI2_CS_GPIO_Port
Definition main.h:158
#define VALVE_L_GPIO_Port
Definition main.h:150
#define LED_Y_GPIO_Port
Definition main.h:154
#define LED_G_Pin
Definition main.h:155
uint8_t time_r
Time [10*ms], right valve is open.
Definition main.h:88
uint8_t angle
Angle [deg], cube rotate after turn cmd.
Definition main.h:87
int16_t home
Angle [deg], default orientation.
Definition main.h:91
uint8_t time_l
Time [10*ms], left valve is open.
Definition main.h:89
uint8_t time_a
Period [100*ms], sensor report will be sended.
Definition main.h:90