Add FreeRTOS and SPI mes and UART output
This commit is contained in:
134
Core/Src/main.c
134
Core/Src/main.c
@@ -18,6 +18,7 @@
|
||||
/* USER CODE END Header */
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
#include "cmsis_os.h"
|
||||
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
@@ -26,12 +27,12 @@
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN PTD */
|
||||
#define CS1_ON() HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_SET)
|
||||
#define CS1_OFF() HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_RESET)
|
||||
#define CS2_ON() HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_SET)
|
||||
#define CS2_OFF() HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_RESET)
|
||||
#define CS3_ON() HAL_GPIO_WritePin(CS3_GPIO_Port, CS3_Pin, GPIO_PIN_SET)
|
||||
#define CS3_OFF() HAL_GPIO_WritePin(CS3_GPIO_Port, CS3_Pin, GPIO_PIN_RESET)
|
||||
#define CS1_OFF() HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_SET)
|
||||
#define CS1_ON() HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_RESET)
|
||||
#define CS2_OFF() HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_SET)
|
||||
#define CS2_ON() HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_RESET)
|
||||
#define CS3_OFF() HAL_GPIO_WritePin(CS3_GPIO_Port, CS3_Pin, GPIO_PIN_SET)
|
||||
#define CS3_ON() HAL_GPIO_WritePin(CS3_GPIO_Port, CS3_Pin, GPIO_PIN_RESET)
|
||||
#define RESET_ON() HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_SET)
|
||||
#define RESET_OFF() HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_RESET)
|
||||
/* USER CODE END PTD */
|
||||
@@ -51,7 +52,9 @@ DMA_HandleTypeDef hdma_spi1_rx;
|
||||
DMA_HandleTypeDef hdma_spi1_tx;
|
||||
|
||||
UART_HandleTypeDef huart1;
|
||||
DMA_HandleTypeDef hdma_usart1_tx;
|
||||
|
||||
osThreadId calcsUartTaskHandle;
|
||||
/* USER CODE BEGIN PV */
|
||||
|
||||
/* USER CODE END PV */
|
||||
@@ -62,13 +65,20 @@ static void MX_GPIO_Init(void);
|
||||
static void MX_SPI1_Init(void);
|
||||
static void MX_DMA_Init(void);
|
||||
static void MX_USART1_UART_Init(void);
|
||||
void StartCalcsUartTask(void const * argument);
|
||||
|
||||
/* USER CODE BEGIN PFP */
|
||||
|
||||
/* USER CODE END PFP */
|
||||
|
||||
/* Private user code ---------------------------------------------------------*/
|
||||
/* USER CODE BEGIN 0 */
|
||||
|
||||
uint8_t data_in[6] = {0};
|
||||
uint8_t data_out[6] = {0};
|
||||
uint8_t flag_receive = 0;
|
||||
uint8_t flag_cs = 0;
|
||||
xSemaphoreHandle mutex;
|
||||
xSemaphoreHandle semaphoreBin;
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/**
|
||||
@@ -104,12 +114,63 @@ int main(void)
|
||||
MX_USART1_UART_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
RESET_ON();
|
||||
HAL_Delay(100);
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* USER CODE BEGIN RTOS_MUTEX */
|
||||
/* add mutexes, ... */
|
||||
/* USER CODE END RTOS_MUTEX */
|
||||
|
||||
/* USER CODE BEGIN RTOS_SEMAPHORES */
|
||||
/* add semaphores, ... */
|
||||
/* USER CODE END RTOS_SEMAPHORES */
|
||||
|
||||
/* USER CODE BEGIN RTOS_TIMERS */
|
||||
/* start timers, add new ones, ... */
|
||||
/* USER CODE END RTOS_TIMERS */
|
||||
|
||||
/* USER CODE BEGIN RTOS_QUEUES */
|
||||
/* add queues, ... */
|
||||
/* USER CODE END RTOS_QUEUES */
|
||||
|
||||
/* Create the thread(s) */
|
||||
/* definition and creation of defaultTask */
|
||||
osThreadDef(calcsUartTask, StartCalcsUartTask, osPriorityNormal, 0, 128);
|
||||
calcsUartTaskHandle = osThreadCreate(osThread(calcsUartTask), NULL);
|
||||
|
||||
/* USER CODE BEGIN RTOS_THREADS */
|
||||
/* add threads, ... */
|
||||
/* USER CODE END RTOS_THREADS */
|
||||
mutex = xSemaphoreCreateMutex();
|
||||
vSemaphoreCreateBinary(semaphoreBin);
|
||||
/* Start scheduler */
|
||||
osKernelStart();
|
||||
|
||||
/* We should never get here as control is now taken by the scheduler */
|
||||
/* Infinite loop */
|
||||
/* USER CODE BEGIN WHILE */
|
||||
while (1)
|
||||
{
|
||||
flag_cs = 1;
|
||||
CS1_ON();
|
||||
HAL_SPI_Transmit_DMA(&hspi1, data_in, sizeof(data_in));
|
||||
while(!flag_receive) {
|
||||
}
|
||||
CS1_OFF();
|
||||
flag_receive = 0;
|
||||
flag_cs = 2;
|
||||
CS2_ON();
|
||||
HAL_SPI_Transmit_DMA(&hspi1, data_in, sizeof(data_in));
|
||||
while(!flag_receive) {
|
||||
}
|
||||
CS2_OFF();
|
||||
flag_receive = 0;
|
||||
flag_cs = 3;
|
||||
CS3_ON();
|
||||
HAL_SPI_Transmit_DMA(&hspi1, data_in, sizeof(data_in));
|
||||
while(!flag_receive) {
|
||||
}
|
||||
flag_receive = 0;
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
/* USER CODE BEGIN 3 */
|
||||
@@ -245,11 +306,14 @@ static void MX_DMA_Init(void)
|
||||
|
||||
/* DMA interrupt init */
|
||||
/* DMA1_Channel2_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
|
||||
HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
|
||||
/* DMA1_Channel3_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);
|
||||
HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
|
||||
/* DMA1_Channel4_IRQn interrupt configuration */
|
||||
HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
|
||||
|
||||
}
|
||||
|
||||
@@ -289,9 +353,59 @@ static void MX_GPIO_Init(void)
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 4 */
|
||||
|
||||
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
|
||||
{
|
||||
if(hspi == &hspi1)
|
||||
{
|
||||
HAL_SPI_Receive_DMA(&hspi1, data_out, sizeof(data_out));
|
||||
flag_receive = 1;
|
||||
static portBASE_TYPE xHigherPriorityTaskWoken;
|
||||
xHigherPriorityTaskWoken = pdFALSE;
|
||||
xSemaphoreGiveFromISR(semaphoreBin, &xHigherPriorityTaskWoken);
|
||||
}
|
||||
}
|
||||
/* USER CODE END 4 */
|
||||
|
||||
/* USER CODE BEGIN Header_StartDefaultTask */
|
||||
/**
|
||||
* @brief Function implementing the defaultTask thread.
|
||||
* @param argument: Not used
|
||||
* @retval None
|
||||
*/
|
||||
/* USER CODE END Header_StartDefaultTask */
|
||||
void StartCalcsUartTask(void const * argument)
|
||||
{
|
||||
/* USER CODE BEGIN 5 */
|
||||
/* Infinite loop */
|
||||
for(;;)
|
||||
{
|
||||
xSemaphoreTake(semaphoreBin, portMAX_DELAY);
|
||||
if(flag_cs == 1) {
|
||||
if(xSemaphoreTake(mutex, portMAX_DELAY) == pdTRUE) {
|
||||
//ЗАПИСЬ ДЛЯ ПЕРВОГО ГИРОСКОПА
|
||||
HAL_UART_Transmit_DMA(&huart1, data_in, sizeof(data_in));
|
||||
}
|
||||
xSemaphoreGive(mutex);
|
||||
}
|
||||
else if(flag_cs == 2) {
|
||||
if(xSemaphoreTake(mutex, portMAX_DELAY) == pdTRUE ) {
|
||||
//ЗАПИСЬ ДЛЯ ВТОРОГО ГИРОСКОПА
|
||||
HAL_UART_Transmit_DMA(&huart1, data_in, sizeof(data_in));
|
||||
}
|
||||
xSemaphoreGive(mutex);
|
||||
}
|
||||
else if(flag_cs == 3) {
|
||||
if(xSemaphoreTake(mutex, portMAX_DELAY) == pdTRUE ) {
|
||||
//ЗАПИСЬ ДЛЯ ВТОРОГО ГИРОСКОПА
|
||||
HAL_UART_Transmit_DMA(&huart1, data_in, sizeof(data_in));
|
||||
}
|
||||
xSemaphoreGive(mutex);
|
||||
}
|
||||
osDelay(1);
|
||||
}
|
||||
/* USER CODE END 5 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function is executed in case of error occurrence.
|
||||
* @retval None
|
||||
|
||||
Reference in New Issue
Block a user