Jump to content
xrou

Как сделать прием пакета неизвестной длины по UART

Recommended Posts

Здравствуйте, пытаюсь обрабатывать пакеты приходящие от ESP8266 (01), но проблема в том, что пакеты всегда разной длины ведь мы не знаем, что напишет пользователь (хотя даже ответы на AT команды всегда разной длины). Знаю, что в плате F0 есть прерывание по символу, но у меня F103C8T6. Как быть? Создать массив большого размера нельзя, т.к. HAL_Recieve_IT ждет пока не наберется нужное кол-во символов.

Приму любую идею и советы

Share this post


Link to post
Share on other sites

а зачем тебе знать длину пакета? Процесс приема по уарт довольно медленный, если на скоростях до 115200. Я при работе с 8266 использовал двухсимвольный буфер с приемом по дма и прерыванием по полубуферу.

Дальше просто производится парсинг посимвольный и инкрементное формирование строки программой. Окончание строки - маркер символ. Как правило \n

Если вообще обмен медленный (ну скажем 9600 бод) можно вообще односимвольный буфер юзать. Скопировать в прерывании ты успеешь. Но с ДМА приятнее и можно использовать скорости порядка 3,5 мегабит. Это конечно не стандарт, но 8266 вывозит. Вопрос только надо ли оно такое быстрое? Я при использовании уарта всегда стараюсь подобрать или рассчитать минимально возможную скорость обмена для комфортного выполнения задачи. Так все становится намного проще и стабильнее

вот код для работы с односимвольным буфером. Посмотри для примерчика. Тут работа по уарт с терминалом на компе. Командами с консоли конфигурируются центральные часы респределенной системы управления. Простенькая поделка где пакет неизвестной длинны, но ограничен определенной максимальной, длиннее которой быть не может. Скорость 9600

Скрытый текст


/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx_hal.h"
#include "dma.h"
#include "i2c.h"
#include "spi.h"
#include "usart.h"
#include "gpio.h"

/* USER CODE BEGIN Includes */
#include "lib_7219.h"
#include "string.h"
#include <stdio.h>
#include "stdlib.h"
/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
#define MAXSTRING 20
#define UART_PACKET_OK 0
#define UART_PACKET_TOO_LONG 1
#define UART_PACKET_CORRUPT 2
#define UART_BUSY 1
#define UART_CPLT 0

volatile uint8_t UART_TX_Busy = 0;
uint8_t UART_NewMessage = 0;
uint8_t UART1_rxBuffer = '\000';
char rxString[MAXSTRING];

uint8_t TimerData[8] = {0,0,0,0,0,0,0,0};
uint8_t OldTimerData[8] = {0,0,0,0,0,0,0,0};
uint8_t TimerDataNew = 0;
uint8_t ScreenTime[24] = {0,1,0,1, 0,2,0,2, 0,3,0,3, 0,4,0,4, 0,5,0,5, 0,6,0,6};
char SendingTime[14];

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void Error_Handler(void);

/* Private function prototypes -----------------------------------------------*/
void UART_Send (const char message[]);
void UART_CommandProcessor (void);
void Timer_read(void);
void TimerWrite(uint8_t, uint8_t);
void DisplayTime(void);
void SendTime(void);
void TimeCorrection(void);
void DayNight (void);

int main(void)
{

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SPI1_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();

	HAL_UART_Receive_DMA(&huart1, &UART1_rxBuffer, 1);
		
	StartDisplayTest(TEST_ON);
	HAL_Delay(1000);
	StartDisplayTest(TEST_OFF);
	HAL_Delay(1000);
	
	SetScanStart(NORMAL_OPERATION);
	SetScanLimit(0x05);
	SetDecodeMode(0xFF);
	
	// restore intensity level
	uint8_t intense_addr = 0x03;
	HAL_I2C_Master_Transmit(&hi2c1, 0xD0, &intense_addr, 1, 0xFFFF);
	HAL_I2C_Master_Receive(&hi2c1, 0xD0, &TimerData[3], 1, 0xFFFF);
	SetIntensity((TimerData[3]&0xF0)>>4);
	
	UART_Send("Timekeeper. V1. 09.2016. Uart started\n");

  while (1)
  {
		if(UART_NewMessage)	
		{
			UART_CommandProcessor();
			UART_NewMessage = 0;
		}
		Timer_read();
		DisplayTime();
		SendTime();
		TimeCorrection();
  }
}

void UART_Send (const char message[])
{
	while(UART_TX_Busy){};
	UART_TX_Busy = 1;
	HAL_UART_Transmit_DMA(&huart1, (uint8_t*)message, strlen(message));
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart1)
{
	UART_TX_Busy = 0;
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart1)
{
	static short int UART1_rxindex = 0;	
	static uint8_t UART1_ErrorFlag = UART_PACKET_OK;

	if (UART1_rxBuffer == 8 || UART1_rxBuffer == 127) // If Backspace or del
	{
		UART1_rxindex--; 
		if (UART1_rxindex < 0) UART1_rxindex = 0;
	}

	else if (UART1_rxBuffer == '\n') // If Enter
	{
		if (UART1_ErrorFlag == UART_PACKET_OK && UART1_rxindex)
		{
			rxString[UART1_rxindex] = 0;
			UART1_rxindex = 0;
			UART_NewMessage = 1;
		}
		else
		{
			UART_Send ("ERROR > UART1 packet too long\n");
			UART1_ErrorFlag = UART_PACKET_OK; // reset error state
		}
	}

	else
	{
		if (UART1_rxBuffer != '\r' && UART1_ErrorFlag == UART_PACKET_OK) // Ignore return
		{
			rxString[UART1_rxindex] = UART1_rxBuffer; // Add that character to the string
			UART1_rxindex++;
			if (UART1_rxindex >= MAXSTRING) // User typing too much, we can't have commands that big
			{
				UART1_ErrorFlag = UART_PACKET_TOO_LONG;
				UART1_rxindex = 0;
				rxString[UART1_rxindex] = '\000';
			}
		}
	}
}

// UART Commands decoder
// sett [HH.MM.SS] - set time
// setd [DD.MM.YY] - set date
// vctl - view control register
// sctl [OUT(1bit).FT(1bit).S(1bit).CAL(5bit)] - set control register
// sbrt [VAL] - set screen brightness
// any uknown string - HELP

void UART_CommandProcessor (void)
{
	char cmd_str_buf[4];
	static uint8_t command_recieved = 0;
		
	// copy command to buffer
	static char cmd_buf[MAXSTRING];
	strcpy(cmd_buf, rxString);
	
	// decode command
	if (strncmp("sett", cmd_buf, 4) == 0)  // if sett--------------------------------------
	{
		command_recieved = 1;
		
		uint8_t reg_buf = 0;
		
		reg_buf |= ((uint8_t)cmd_buf[6]-'0')|(((uint8_t)cmd_buf[5]-'0')<<4); // convert hours to BCD
		TimerWrite(0x02, reg_buf);
		reg_buf = 0;
		reg_buf |= ((uint8_t)cmd_buf[9]-'0')|(((uint8_t)cmd_buf[8]-'0')<<4); // convert minutes to BCD
		TimerWrite(0x01, reg_buf);
		reg_buf = 0;
		reg_buf |= ((uint8_t)cmd_buf[12]-'0')|(((uint8_t)cmd_buf[11]-'0')<<4); // convert seconds to BCD
		TimerWrite(0x00, reg_buf);
		
		UART_Send("Time is set\n");
	}
	
	if (strncmp("setd", cmd_buf, 4) == 0)  // if setd--------------------------------------
	{
		command_recieved = 1;
		
		uint8_t reg_buf = 0;
		reg_buf |= ((uint8_t)cmd_buf[6]-'0')|(((uint8_t)cmd_buf[5]-'0')<<4); // convert day to BCD
		TimerWrite(0x04, reg_buf);
		reg_buf = 0;
		reg_buf |= ((uint8_t)cmd_buf[9]-'0')|(((uint8_t)cmd_buf[8]-'0')<<4); // convert month to BCD
		TimerWrite(0x05, reg_buf);
		reg_buf = 0;
		reg_buf |= ((uint8_t)cmd_buf[12]-'0')|(((uint8_t)cmd_buf[11]-'0')<<4); // convert year to BCD
		TimerWrite(0x06, reg_buf);
		
		UART_Send("Date is set\n");
	}
	
	if (strncmp("vctl", cmd_buf, 4) == 0)  // if vctl--------------------------------------
	{
		command_recieved = 1;
		
		#define REGISTER_STRING 8
		static char EchoBuffer[REGISTER_STRING * 5 + 1];
	
		for (uint8_t i=0; i<REGISTER_STRING; i++)
		{
			sprintf(&EchoBuffer[i*5], "0x%02X", TimerData[i]);
			if (i>0) EchoBuffer[i*5-1] = ' ';
		}
		EchoBuffer[REGISTER_STRING * 5-1] = '\n';
		EchoBuffer[REGISTER_STRING * 5] = '\000';
		UART_Send("TimerData readed\n");
		UART_Send(EchoBuffer);
	}
	if (strncmp("sctl", cmd_buf, 4) == 0)  // if sctl--------------------------------------
	{
		command_recieved = 1;
		uint8_t reg_buf = atoi(&cmd_buf[5]);  	//convert param to int value
		TimerWrite(0x07, reg_buf);							//write value to ctrl reg
		UART_Send("Control register saved\n");	//echo message
	}
	
	if (strncmp("sbrt", cmd_buf, 4) == 0)  // if sbrt--------------------------------------
	{
		command_recieved = 1;
		
		strncpy(cmd_str_buf, &cmd_buf[5], 2);	// convert parameter to int
		uint8_t brightness = atoi(cmd_str_buf);
		
		if (brightness <= 0x0F) 								// check value
		{
			SetIntensity(brightness);

			uint8_t tmp;												// save brigtness in timer memory
			tmp = TimerData[3]&0x0F;
			tmp |= brightness<<4;
			TimerWrite(0x03,tmp);
			
			UART_Send("Intencity is set. Brightness saved in EEPROM\n");
		}
		else UART_Send("Incorrect param [00..15]\n");
	}
	
	if (!command_recieved)
	{
		UART_Send("Hello. This is timekeeper help\nsett HH.MM.SS - set time\nsetd DD.MM.YY - set date\nvctl - view control register\nsctl [OUT(1bit).FT(1bit).S(1bit).CAL(5bit)] - set control register\nsbrt [VAL] - set screen brightness\n"); 
	}
	command_recieved = 0;
}

void Timer_read(void)
{
	static uint8_t addr = 0;
	HAL_I2C_Master_Transmit(&hi2c1, 0xD0, &addr, 1, 0xFFFF);
	HAL_I2C_Master_Receive(&hi2c1, 0xD0, TimerData, 8, 0xFFFF);
}

void TimerWrite(uint8_t addr, uint8_t data)
{
	uint8_t tbuf[2] = {addr, data};
	// check I2C bus status?
	HAL_I2C_Master_Transmit(&hi2c1, 0xD0, tbuf, 2, 0xFFFF);
}

void DisplayTime(void)
{
	// time string format ScreenTime
	// [0] - date 10
	// [1] - date 10 position (0)
	// [2] - hours 10
	// [3] - hours 10 position (0)
	
	// [4] - date
	// [5] - date position (1)
	// [6] - hours
	// [7] - hours position (1)
	
	// [8] - month 10
	// [9] - month 10 position (2)
	// [10] - minutes 10
	// [11] - minutes 10 position (2)
	
	// [12] - month
	// [13] - month position (3)
	// [14] - minutes
	// [15] - minutes position (3)
	
	// [16] - year 10
	// [17] - year 10 position (4)
	// [18] - seconds 10
	// [19] - seconds 10 position (4)
	
	// [20] - year
	// [21] - year position (5)
	// [22] - seconds
	// [23] - seconds position (5)
	static uint8_t OldTimerData;
	
	if (TimerData[0]!=OldTimerData)
	{
		ScreenTime[0]  =  (TimerData[4]&0x30)>>4;			// date 10
		ScreenTime[2]  = ((TimerData[2]&0x30)>>4);		// hours 10
		ScreenTime[4]  =   TimerData[4]&0x0F;					// date
		ScreenTime[6]  =   TimerData[2]&0x0F;					// hours
		ScreenTime[8]  =  (TimerData[5]&0x10)>>4;			// month 10
		ScreenTime[10] =  (TimerData[1]&0x70)>>4;		// minutes 10
		ScreenTime[12] =   TimerData[5]&0x0F;					// month
		ScreenTime[14] =   TimerData[1]&0x0F;					// minutes
		ScreenTime[16] =  (TimerData[6]&0xF0)>>4;		// year 10
		ScreenTime[18] =  (TimerData[0]&0x70)>>4;		// seconds 10
		ScreenTime[20] =   TimerData[6]&0x0F;					// year
		ScreenTime[22] =   TimerData[0]&0x0F;					// seconds
			
		
		SetScanStart(NORMAL_OPERATION);
		SetScanLimit(0x05);
		SetDecodeMode(0xFF);
		SetIntensity((TimerData[3]&0xF0)>>4);
		
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_SPI_Transmit(&hspi1, &ScreenTime[0],  2, 0xFF); 
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_SPI_Transmit(&hspi1, &ScreenTime[4],  2, 0xFF); 
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_SPI_Transmit(&hspi1, &ScreenTime[8],  2, 0xFF);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);	
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_SPI_Transmit(&hspi1, &ScreenTime[12], 2, 0xFF);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);	
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_SPI_Transmit(&hspi1, &ScreenTime[16], 2, 0xFF); 
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
		HAL_Delay(1);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_SPI_Transmit(&hspi1, &ScreenTime[20], 2, 0xFF);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);	
		HAL_Delay(1);
		OldTimerData = TimerData[0];
	}
	
}

void SendTime (void)
{
	static uint8_t OldSeconds;
	
	if (ScreenTime[22]!=OldSeconds)
	{
		SendingTime[0] = ScreenTime[2]+'0';
		SendingTime[1] = ScreenTime[6]+'0';
		
		SendingTime[2] = ScreenTime[10]+'0';
		SendingTime[3] = ScreenTime[14]+'0';
		
		SendingTime[4] = ScreenTime[18]+'0';
		SendingTime[5] = ScreenTime[22]+'0';
		
		SendingTime[6] = ScreenTime[0]+'0';
		SendingTime[7] = ScreenTime[4]+'0';
		
		SendingTime[8] = ScreenTime[8]+'0';
		SendingTime[9] = ScreenTime[12]+'0';
		
		SendingTime[10] = ScreenTime[16]+'0';
		SendingTime[11] = ScreenTime[20]+'0';
		
		SendingTime[12] = '\n';	
		SendingTime[12] = '\n'; // zero terminate string
		
		OldSeconds = ScreenTime[22];
		
		UART_Send(SendingTime);
	}
}

void TimeCorrection(void)
{
	
}

void DayNight(void)
{
	
}
/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
  PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_SYSCLK;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

void Error_Handler(void)
{
  while(1) 
  {
  }
}

 

все что тебе надо в этом коде есть. Индийский говнокод конечно, это я давно писал, но смысл понятен

Edited by mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

Высокая надежность SiC! Как они этого добились?

За несколько лет кропотливых исследований и совершенствования технологии компания Infineon смогла довести показатели надежности и стабильности параметров высоковольтных и быстродействующих карбид-кремниевых транзисторов линейки CoolSiC практически до уровня их кремниевых собратьев.

Подробнее

17.10.2020 в 23:09, mail_robot сказал:

Дальше просто производится парсинг посимвольный и инкрементное формирование строки программой

Вот, это я и пытаюсь сделать, но куда формировать эту строку? Пытался копировать ее в char буфер, в принципе работало, но если передавать строку размером больше указанной в ...Recieve_IT то он просто обрубает не влезший кусок, хотя я сразу после от отправки строки обратно запускаю прерывание.

Подсмотрел как я реализовывал это дело в ардуино, там все проще, намного. Используется string в который можно добавлять символы пока память не треснет, а вот в STM я так и не смог подключить ни стринг, ни вектор - жалуется на дебри библиотеки iostream. Как это можно решить? Или есть какие-то ограничения не позволяющие использовать их? 

 

17.10.2020 в 23:09, mail_robot сказал:

но ограничен определенной максимальной, длиннее которой быть не может

Я пытаюсь вытащить все доступные точки WiFi из esp, но их может быть очень много, а всего для одной сети он дает полную характеристику, что занимает кучу места в буфере.

Да и данные от esp текут постоянно.

 

18.10.2020 в 18:03, MasterElectric сказал:

Или гугли что такое в UART IDLE. 

Полезная штука для передачи единичных команд.  

 

17.10.2020 в 23:09, mail_robot сказал:

Но с ДМА приятнее и можно использовать скорости порядка 3,5 мегабит

Куда нужна такая скорость? Все вот говорят, что для быстрых операций, но каких толком не говорят 

 

UPD: а где про все такое можно почитать? Просто куда не посмотри все все сами пишут и рассказывают, откуда они информацию берут? Есть что нибудь (видео, книга и тд и тп) где про вот это все расписано по полочкам, что куда и как?

Edited by xrou

Share this post


Link to post
Share on other sites

Материалы вебинара: МЭМС-датчики ST для работы со звуком – новые возможности

На вебинаре мы рассказали о микрофонах, их топологиях применения и возможностях, а так же о новых мультирежимных широкодиапазонных микрофонах с нижним портом и PDM-интерфейсом для систем с батарейным питанием. Вы можете посмотреть видеозапись вебинара, ознакомиться с презентацией и ответами на вопросы.

Подробнее

1 час назад, xrou сказал:

Полезная штука для передачи единичных команд

Это флаг, по которому можно понять что передача пакета окончена. В хале даже функция такая есть если мне не изменяет склероз. 

Share this post


Link to post
Share on other sites

Использование экосистемы STMicroelectronics: подключение датчиков к STM32G4

В статье описаны основные составляющие экосистемы STMicroelectronics для работы с микроконтроллерами STM32, а также приведен пример ее практического применения: создание проекта на базе STM32G4 с подключением датчиков и использованием отладочной платы NUCLEO-G474RE и платы расширения X-NUCLEO-IKS01A2.

Подробнее

11 часов назад, xrou сказал:

Просто куда не посмотри все все сами пишут

так и есть. Никто не принесет и не подаст. Ставишь задачу, читаешь референц и еррату и пришешь


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

Я правильно из обсуждения понял, что ардуинского string у stm32 не существует точно так же, как и delay?


В действительности всё выглядит иначе, чем на самом деле. ©

Share this post


Link to post
Share on other sites

а это чо? Ктонить вообще читал мой код?

#include "string.h"

вектор ты не сделаешь, динамика в библиотеках STM отсутствует. Ну и как бы похоже дело не в бобине


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites
14 минут назад, mail_robot сказал:

а это чо? Ктонить вообще читал мой код?

Если вопрос ко мне, то конечно нет. :D

Потому как мне сейчас не нужен этот код, вполне достаточно только понимания.

"string.h" - это Ваше личное творение?

 

Edited by smart_ed

В действительности всё выглядит иначе, чем на самом деле. ©

Share this post


Link to post
Share on other sites
7 часов назад, mail_robot сказал:

так и есть. Никто не принесет и не подаст

Не, я имею ввиду статьи про то как они все сами сделали исходя только из знания как работает uart.

 

5 часов назад, smart_ed сказал:

Я правильно из обсуждения понял, что ардуинского string у stm32 не существует точно так же, как и delay?

Ну стринг это вроде библиотечный класс и его можно подключить инклудом, а delay заменяется HAL_Delay

 

4 часа назад, mail_robot сказал:

вектор ты не сделаешь, динамика в библиотеках STM отсутствует.

Это особенность платформы? Жаль конечно, жизнь они облегчают сильно.

Share this post


Link to post
Share on other sites

Ну, что я короче сделал. Увеличил буфер. Память почти резиновая, так что можно.

Share this post


Link to post
Share on other sites
20.10.2020 в 20:10, xrou сказал:

Это особенность платформы?

компилятора и его библиотек. Нив Keil ни в кокосе добиться динамического выделения памяти я так и не смог. Думаю это ограничение связано с оглядкой на надежность. Везде где есть динамика это большая потенциальная дыра в надежности системы. Все ресурсы контроллера должны быть спланированы и зарезервированы жестко еще на этапе проектирования системы

string входит в состав библиотек компилятора (ну опять же как минимум в кайле и кокосе). Я не знаю почему у вас там не работает. Единственное надо конечно перед применением любой его функции ознакомиться с ее реализацией. Потому как там местами весьма и весьма отличается от типовых. Ну и памяти она конечно отжирает сразу прилично...

Edited by mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Этопричина? Чтотакаядвигательная17в? Какиеещёрадиодетализнаете? Ремонт конца, говорите? Нуу, это тяжело. Скорей всего никак. Без элементарных знаний, это невозможно. И подучите рус язык, где и как пользоваться знаками препинания. Или помехоподавительные. Но зато будет приобретён великолепный опыт  
    • Я полтора года назад у человека из рук в руки в Москве покупал такой за 400 рублей. Сейчас в Авито смотрю, именно 312 нет нигде. А мне нужен второй такой для проекта. Так- то да, на Тульском заводе торы мотают частникам без проблем и не дорого. Но цена транспортировки мб больше цены изделия.
    • да тебя никто не спрашивает вообще! исчезни раз и навсегда с моих тем, не пиши мне ничего и никогда, ретард! всю кровь выпил демон!
    • На сегодняшний день озвучено : Стоимость составит $99 в месяц и $499 за комплект.
    • Ну наклеит и чё, думаете чуйка поднимется на 3дб? А вот нифига. Меньше. А этого недостаточно. Причём от фокусирующего магнита Qts упадет в среднем на 0.1. Для звука хорошо, для поставленной задачи плохо. Тут однозначно что-то надо менять. Либо ас либо всё.
    • объяснит уже кто нить или нет, 10 вход для чего нужен?! че у тебя слов нет?! я тебе сразу сказал это питалово на реле. а ты вылез тут со своей тупостью.

  • Мультиметр ZOYI ZT-300AB с Bluetooth

  • Similar Content

    • By xrou
      Здравствуйте, пытаюсь подключить USB флешку к STM32F767ZI
       
      Включаю USB_OTG_FS - host only, (V bus и SOF  не включаю), USB HOST Class for fs ip - Mass Storage host class, FATFS (USE_LFN - в стеке) - USB_Disk
      В настройках USB_HOST требует, как я понял, пин отвечающий за питание устройства - PC1
      Код простейший, должен работать 100% а может нет. Внутренние файлы библиотек не менял
      Думаю что нет питания на USB устройство т.к. пробовал вставить туда ttl конвертер на котором есть светодиод питания и он не горит
       
      Ваши идеи и предположения? 
       
    • By xrou
      Здравствуйте, хочу подключить джойстик к stmке, но проблема в том что он пятивольтовый, а АЦП все, что больше 3.3 выдаёт как 4095. На ардуино есть контакт aref введённый на плату, но на stm, как я понял, он соединён с контактом питания и все что выше 3.3 вольта просто спалит кристал. 
      Подскажите как подключить пятивольтовое устройство к stmке. 
       
      P.s подключить джойстик к 3.3 не получится из-за появления огромных мёртвых зон.
    • By Black Jack
      Здравствуйте, программатор st-link не видит микроконтроллер STM32F103VET6. Присоединение кварца и внешнее тактирование не помогли. Что не так делаю, подскажите.


      схема.dch плата.dip
    • By strifonoff
      это снова я...
      Максимального быстродействия АЦП можно достичь при частоте АЦП 14 МГц, а этого можно добиться только при системной частоте 56 МГц (если внешний кварц на 8 МГц).
      Но возникает проблема со скоростями UART: значение регистра BRR не получится выставить так, что бы скорость была из стандартного ряда.
      Назрели несколько вопросов:
      1) возможно ли менять системную частоту на лету? (чую, что можно, но пока не знаю как) 
      2) критична ли ошибка в скорости UART по сравнению со стандартной? (что будет на другой стороне заранее не известно, т.к. любой может воткнуть свой девайс работающий на какой-то заранее согласованной стандартной скорости)
      3) как поведёт себя железо (состояние ОЗУ, регистров перефирии, состояние ног и т.д.) на изменение частоты? Две части программы () практически независимы, их объединяет только один массив, который наполняется в первой половине, а обрабатывается в другой.
       
    • By Deel
      Всем доброго времени суток!!! Нужна помощь ЗНАТАКОВ !!! Строим самодельный руль для ПК!!! Руль с прямым приводом (DirectDrive) на базе STM32. Двигатель управляется через BTS7960, всё как бы работает, но при большой нагрузке одна плата не справляется, выгорают чипы!!! И из-за этого хочется запараллелить две платы. Но и тут порой беда, две запараллеленные платы порой глючат, и двигатель не слушается! Вот и решил заново нарисовать свою схему, прошу проверить на правильность. Выкладываю оригинальную схему на плату от китайцев, и свою предполагаемую схему. Если есть ошибка, прошу сильно не пинайте, лучше подскажите



      Забыл упомянуть про движок - dynamo sliven pik 12 3/10-3


×
×
  • Create New...