2016-09-28 13 views
1

Я новичок в ARM и пытаюсь создать подчиненное устройство на STM32F103x. Также мне нужна отладка Serial Wire и FreeRTOS.Каков правильный способ создания подчиненного I2C с помощью FreeRTOS на STM32?

Я создаю новый проект STM32CubeMX. Существуют опции «Использовать функции FreeRTOS» в конфигурации NVIC. Но я не нашел никакой документации, ссылок или демонстраций о том, как это использовать.

stm32cube_nvic_options

EDIT 1: Так я делаю таким образом, на данный момент:

#include <string.h> 

#define MASTER_REQ_READ 0x44 
#define MASTER_REQ_EXEC 0x34 

#define CONN_Pin GPIO_PIN_13 
#define CONN_GPIO_Port GPIOC 

/* Recieve protocol struct from Main controller */ 
struct saatProtoExec { 
    uint8_t target; 
    uint8_t command; 
} execCommand; 

uint8_t execBufferSize = sizeof(execCommand); 


int main(void) 
{ 
    /*******************************/ 

    /* definition and creation of i2cWait */ 
    osThreadDef(i2cWait, i2cWaitForData, osPriorityRealtime, 0, 128); 
    i2cWaitHandle = osThreadCreate(osThread(i2cWait), NULL); 

    osKernelStart(); 
    /* We should never get here as control is now taken by the scheduler */ 

    /* Infinite loop */ 
    while (1) 
    { 
    } 

} 

/* i2cWaitForData function */ 
void i2cWaitForData(void const * argument) 
{ 
    /* Infinite loop */ 
    for(;;) 
    { 
     while(HAL_I2C_Slave_Receive_IT(&hi2c1, (uint8_t*)&bTransferRequest, 1)!= HAL_OK) 
     { 
      vTaskDelay(1); 
     } 

     /* Wait for I2C to get ready */ 
     while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY) 
     { 
      vTaskDelay(1); 
     } 

     /* Got command from main controller */ 
     if (bTransferRequest == MASTER_REQ_EXEC) 
     { 
      /* Recieve buffer */ 
      uint8_t execRxBuffer[execBufferSize]; 
      printf("EXEC BUFFER SIZE %d\n", execBufferSize); 

      /* Got data */ 
      while(HAL_I2C_Slave_Receive_IT(&hi2c1, (uint8_t*)execRxBuffer, execBufferSize)!= HAL_OK); 

      /* Wait for I2C to get ready */ 
      while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY) 
      { 
       vTaskDelay(1); 
      } 

      /* Lets print recieved RAW data */ 
      for (uint8_t k = 0; k < sizeof(execRxBuffer); k++){ 
       printf("0x%X\n", execRxBuffer[k]); 
      } 

      /* Lets combine recieved data to owr struct */ 
      memcpy(&execCommand, execRxBuffer, execBufferSize); 

      /* Lets print data from struct */ 
      printf("TARGET: 0x%X\n", execCommand.target); 
      printf("COMMAND: %u\n", execCommand.command); 

      /* Flush Rx buffers */ 
      Flush_Buffer((uint8_t*)execRxBuffer, execBufferSize); 

      /* Toggle LED2 */ 
      HAL_GPIO_TogglePin(CONN_GPIO_Port, CONN_Pin); 

     } 

     osDelay(1); 
    } 
} 

Он отлично работает в режиме неблокируемому, но в любом случае: правильно ли это сделать? Или, может быть, было бы правильно использовать Семафоры?

ответ

0

Я могу порекомендовать это руководство пользователя: Developing Applications on STM32Cube with RTOS.

Он имеет описание FreeRTOS о следующих моментах:

  • Free RTOS Источник организации
  • Портирование из Freertos на STM32
  • FreeRTOS API
  • FreeRTOS управления памятью
  • FreeRTOS маломощный
  • Конфигурация FreeRTOS

Также он имеет примеры применения основных функций операционной системы:

  • пример Создание резьбы
  • семафоров пример (между потоками, от ISR)
  • Мьютексы пример пример
  • Очереди
  • Пример таймеров
  • Показатель малой мощности

Существует пример проекта при условии, о создании потока в STM32CubeF1 пакете под:

\STM32Cube_FW_F1_V1.4.0\Projects\STM32F103RB-Nucleo\Applications\FreeRTOS\FreeRTOS_ThreadCreation 

этот пример использует STM32F103RB.

+0

Ну, я читал это уже и играл с примерами FreeRTOS от STM32Cube. Вопрос в том, какие функции FreeRTOS используются для чтения данных по I2C на STM32? Может ли ** HAL_I2C_Slave_Receive_IT ** использоваться в потоке FreeRTOS? – Bulkin

+0

Я полагаю. Вы можете добавить, хотя код Cube сгенерировал код, который использует функции FreeRTOS. Я считаю, что единственным критерием для ОС является то, что она должна быть уведомлена о прерываниях, поэтому она также может справляться со своими приоритетами. –

+0

Я добавил пример в теме. Правильно ли это делать? – Bulkin