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

Вебинар «МЭМС-датчики ST для работы со звуком – новые возможности» (28.10.2020)

28 октября все желающие приглашаются для участия в вебинаре, посвященном семейству МЭМС-датчиков STMicroelectronics для акустических приложений. Предметом детального рассмотрения на вебинаре станут микрофоны, их топологии применения и возможности. Вы услышите о новых мультирежимных широкодиапазонных микрофонах с нижним портом и PDM-интерфейсом для систем с батарейным питанием.

Подробнее

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

STM32L562E-DK – первая отладочная платформа ST на ядре ARM Cortex-M33

STMicroelectronics представляет демонстрационно-отладочную платформу на базе ядра Cortex-M33 – STM32L562E-DK. Данная платформа основана на микроконтроллере нового семейства – STM32L5. STM32L562E-DK позволяет разработчику в полной мере раскрыть и опробовать новые возможности микроконтроллеров STM32L5 с тщательно проработанным функционалом для обеспечения высокого уровня безопасности и защиты.

Подробнее

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

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

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

Share this post


Link to post
Share on other sites

Тест уровня кондуктивной помехи электронного устройства

Электромагнитная совместимость (ЭМС) является важным параметром электронных устройств, особенно это актуально в современном мире, насыщенном разнообразными гаджетами. Специалисты компании Mornsun подготовили видеоролик по тестированию одной из составляющих ЭМС – кондуктивной помехи.

Подробнее

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

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...

  • Сообщения

    • Никак. Ток, который может выдать солнечная батарея и потребляемый Вашими 100 светодиодами Вы сопоставили?  Можно, конечно, попытаться парочку фундаментных бетонных блоков перевезти за один раз "Запорожцем"... 
    • Я же подтянул к земле, а подаю не больше пяти Вольт. Кабель короткий, пол метра не более.
    • Походу вылетают входы если ты звонишь длинный кабель???  Вешай на каждый вход по защитной цепочке от статики и стабилитроны от превышения напряжения... у тебя по входам получаються  емкости, в них наводиться что то и при кз получаешь большой сквозной ток... ставь токоограничительные резисторы по входам....  чем больше номинал тем надежнее будет. 
    • 74НСхх - КМОП серия. Хотя входы этого класса микросхем как-то худо-бедно и защищены диодами, но всё равно чувствительны и к внешним наводкам и к переполюсовкам по питанию.  Компреме? 
    • Старый конь борозды не портит.
    • Народ,всем привет,такой вопрос. Я учусь на заочке,пришла лаба,сделать простенькую печатаную схему в 5 версии. Такой вопрос,может у кого есть или кто может помочь? потому что про сессию заранее не сказали,все дистанционно,ничего не могу понять
    • Все схемы - окаменевшие фекалии мамонта. Воняют одинаково.

  • Датчик температуры с резьбовым креплением. Тип K. Диапазон температур: 0-400

  • Similar Content

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



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


    • By For the North !
      Подскажите, как подключить электретный микрофон к отладочной плате stm32f0discovery. Выбрал микрофон VS4011S36, 4,5 В, 4 мм. Нужно знать конкретно какие провода к каким входам подключать. Заранее спасибо!


      https://static.chipdip.ru/lib/735/DOC000735976.pdf   --- Datasheet на плату
    • By xrou
      Здравствуйте. Собираю светодиодный индикатор. Использую stm32F103C8T6, сдвиговый регистр 74HC595 (HYC 825Z - не знаю что это значит), светодиодный индикатор на 10 светодиодов SHB10R.
      Подключаю по такой схеме
      https://cxemka.com/upload/art/74hc595_spi_stm32/connection_stm32_74hc595_spi.svg
      Код в Keil с использованием HAL и Cube
       
      Проблема: на индикаторе то вообще ничего не зажигается, то надо раз 10 нажать резет и только спустя какое то время оно начинает работать, но не правильно:

      По идее оно должно зажечь сначала весь индикатор, 4 светодиода, 2 и так по кругу. Но оно иногда проскакивает состояния, зажигает левые светодиоды.

      Подскажите в чем может быть проблема, изучаю stm совсем не много еще толком ничего не знаю. Можно ли вообще использовать HAL для передачи данных? или писать самому.
       
    • By admin
      В видео протестируем плату Nucleo G474RE и проверим насколько она быстрее Arduino Uno.
      Текстовый вариант инструкции, как превратить отладочную плату STM в Arduino: https://www.compel.ru/lib/132248
      Плата Nucleo-G474RE: https://www.electronshik.ru/item/ST/NUCLEO-G474RE
      Arduino Uno: https://www.electronshik.ru/item/ARDUINO/ARDUINO%20UNO%20REV3
      Репозиторий проекта stm32duino: https://github.com/stm32duino/Arduino_Core_STM32
      Репозиторий benchmark’а: https://github.com/PaulStoffregen/CoreMark
      Пи тест, вторая часть: https://youtu.be/uLOWYE-JJpA
      Пи тест, первая часть: https://youtu.be/ozu1IUjH1_Q
      Платы XNucleo: https://www.st.com/content/st_com/en/search.html#q=xnucleo-t=tools-page=1
×
×
  • Create New...