Я новичок в ARM и пытаюсь создать подчиненное устройство на STM32F103x. Также мне нужна отладка Serial Wire и FreeRTOS.Каков правильный способ создания подчиненного I2C с помощью FreeRTOS на STM32?
Я создаю новый проект STM32CubeMX. Существуют опции «Использовать функции FreeRTOS» в конфигурации NVIC. Но я не нашел никакой документации, ссылок или демонстраций о том, как это использовать.
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);
}
}
Он отлично работает в режиме неблокируемому, но в любом случае: правильно ли это сделать? Или, может быть, было бы правильно использовать Семафоры?
Ну, я читал это уже и играл с примерами FreeRTOS от STM32Cube. Вопрос в том, какие функции FreeRTOS используются для чтения данных по I2C на STM32? Может ли ** HAL_I2C_Slave_Receive_IT ** использоваться в потоке FreeRTOS? – Bulkin
Я полагаю. Вы можете добавить, хотя код Cube сгенерировал код, который использует функции FreeRTOS. Я считаю, что единственным критерием для ОС является то, что она должна быть уведомлена о прерываниях, поэтому она также может справляться со своими приоритетами. –
Я добавил пример в теме. Правильно ли это делать? – Bulkin