Перейти к содержанию

STM32 для чайника


ART_ME

Рекомендуемые сообщения

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

а с чего бы он вдруг подвис? Или он у вас под виндой работает?

 

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

Вопрос только - для чего так осторожно дуть на воду?

Ответ - от незнания. Т.к. с контроллерами пока на Вы и опыта нет, посетила, может и дурацкая мысль, но все же, что будет, если с АЦП вдруг что-то случится и он начнет выдавать, например, одни и те же значения (подвиснет каким-то странным образом), как результат устройство будет работать некорректно.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

5 часов назад, Гость Гость сказал:

 (значения АЦП не обновляются и висят постоянно старые значения)

У Вас параллельнный интерфейс? Обычно нет. То есть АЦП по упр. сигналам шины исправно выдает данные, НО они не обновляются по тем же упр. сигналам... Странное подвисание для автомата..

Можно, конечно, предусмотреть и такой фантаситческий случай и сбрасывать АЦП, например, по RESET..

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

В 21.02.2018 в 09:15, Гость Гость сказал:

Может кто-нибудь подсказать, как производить проверку на корректность работы АЦП? Т.е. интересует, чтобы вдруг не случилось так, что АЦП стал выдавать неправильные значения, может просто подвис (значения АЦП не обновляются и висят постоянно старые значения) или еще что-то, в результате чего все устройство стало работать неправильно. Как в таком случае правильно производить контроль?

Для начало скинь код, там может быть не автоматическое переобразование. Может быть что каналы не так выбраны, или с инжектированых снимаеш даные.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Доброго времени суток, нашел хорошую статью Usart прием и отправка строки. Настроил на порт Usart3 перестал работать, попробовал на Usart2 перекинуть тоже не работает, как правильно переделать подскажите...

stm32-uart-spl.rar

Ссылка на комментарий
Поделиться на другие сайты

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

а как ТЫ переделывал?

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

#include "stm32f10x.h" 

GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

	unsigned char Buffer[512];	//	Буфер
	int a,b;

void init()
{
//------------------------------------------------------------
//	UART
//------------------------------------------------------------
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//Configure GPIO pin 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;		//	Tx
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;	//	Rx
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
//	Configure UART
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART3, &USART_InitStructure);
  USART_Cmd(USART3, ENABLE);
}

void delay(unsigned long p)
{
	while(p>0){p--;}
}

void send_Uart(USART_TypeDef* USARTx, unsigned char c)
{
	while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE)== RESET){}
		USART_SendData(USARTx, c);
}

unsigned char getch_Uart(USART_TypeDef* USARTx)
{
	while(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE) == RESET){}
	return USART_ReceiveData(USARTx);
}

//	Отправка строки в USTR
void send_Uart_str(USART_TypeDef* USARTx, unsigned char *s)
{
  while (*s != 0) 
    send_Uart(USARTx, *s++);
}

//	выводим число в UART. Максимальная длина числа 6 цифр
void send_int_Uart(USART_TypeDef* USARTx,long c)
{
	unsigned long d=10000000;
	char temp,flag=0;
	if(c<0)
	{
		send_Uart(USARTx,'-');
		c=-c;
	}
	do
	{
		c=c%d;
		d=d/10;
		temp=c/d;
		if(temp!=0)
		{
			flag=1;
		}
		if(flag==1)
		{
			send_Uart(USARTx,temp+'0');
		}
	}
	while(d>1);
}

//	Читаем число (в ASCII) с UART. Максимальной длиной в 8 знаков. 
//	Завершение ввода по вводу любого не цифрового символа
long read_int_uart(USART_TypeDef* USARTx)
{
	unsigned char temp=0,index=0,flag=0;
	long value=0;
	temp=getch_Uart(USARTx);
	if(temp=='-')
	{
		flag=1;
		temp=getch_Uart(USARTx);
		index++;
	}
	do
	{
		index++;
		if((47<temp)&&(temp<58))
		{
			value=value*10+temp-48;
		}
		else
		{
			index=255;
		}
		if(index<7)
		{
			temp=getch_Uart(USARTx);
		}
	}while(index<7);
	
	
/*	while(index<7)
	{
		value=value*10+temp;
		if(flag==0)
		{
			flag=2;
		}
		else
		{
			temp=getch_Uart(USARTx);
		}
		index++;
		if((47<temp)&&(temp<58))
		{
			temp=temp-48;
		}
		else
		{
			index=255;
		}
	}*/
	if(flag==1)
	{
		value=-value;
	}
	return value;
}

//	читаем текстовую строку с UART, до ввода <enter>. Максимальная длина строки 512Байт
void read_str_uart(USART_TypeDef* USARTx,unsigned char* s)
{
	unsigned char temp;
	unsigned int index=0;
	while(index<512)
	{
		temp=getch_Uart(USARTx);
		if(temp!=13)
		{
			*s++=temp;
		}
		else
		{
			index=512;
		}
		index++;
	}
}

int main(void)
{

	init();

	while(1)
	{
			send_Uart_str(USART3,"alex-exe.ru\n");
	send_Uart_str(USART3,"Enter string\n");
	read_str_uart(USART3, Buffer);
	send_Uart_str(USART3,"Input string - ");
	send_Uart_str(USART3, Buffer);
	send_Uart(USART3,'\n');

	send_Uart_str(USART3,"Enter two numbers separated by a space\n");
	a=read_int_uart(USART3);
	b=read_int_uart(USART3);
	send_Uart_str(USART3,"a + b = ");
	send_int_Uart(USART3, a+b);
	send_Uart(USART3,'\n');
	}
}

 

 

Ссылка на комментарий
Поделиться на другие сайты

ну так вроде ничего не забыл. А как именно "не работает"? Вообще ничего не пишет в консоли?

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

Ссылка на комментарий
Поделиться на другие сайты

в конце концов окажется что RX/TX на свистке попутал

Изменено пользователем mail_robot

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

Ссылка на комментарий
Поделиться на другие сайты

Доброго времени суток, решил подключить sim800 к stm32f103c8 настроил usart3 и проверил через cp2102 Bridge Controller (USB to UART), обмен строками происходит, а вот место cp2102 подключаю sim800 ответ не получаю

#include "stm32f10x.h" 
 
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
 
    unsigned char Buffer[512];  //  Буфер
    int a,b;
 
void init()
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;      //  Tx
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  //  Rx
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
 
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 
  USART_Init(USART3, &USART_InitStructure);
  USART_Cmd(USART3, ENABLE);
}
 
void delay(unsigned long p)
{
    while(p>0){p--;}
}
 
void send_Uart(USART_TypeDef* USARTx, unsigned char c)
{
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE)== RESET){}
        USART_SendData(USARTx, c);
}
 
unsigned char getch_Uart(USART_TypeDef* USARTx)
{
    while(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE) == RESET){}
    return USART_ReceiveData(USARTx);
}
 
//  Отправка строки в USTR
void send_Uart_str(USART_TypeDef* USARTx, unsigned char *s)
{
  while (*s != 0) 
    send_Uart(USARTx, *s++);
}
 
//  читаем текстовую строку с UART, до ввода <enter>. Максимальная длина строки 512Байт
void read_str_uart(USART_TypeDef* USARTx,unsigned char* s)
{
    unsigned char temp;
    unsigned int index=0;
    while(index<512)
    {
        temp=getch_Uart(USARTx);
        if(temp!=13)
        {
            *s++=temp;
        }
        else
        {
            index=512;
        }
        index++;
    }
}
 
int main(void)
{
 
    init();
        
    send_Uart_str(USART3, "AT");
        read_str_uart(USART3, Buffer);
    
}

 

В 02.03.2018 в 09:05, mail_robot сказал:

в конце концов окажется что RX/TX на свистке попутал

@mail_robot  ничего не попутал, просто на том камне 3 usart не было не посмотрел в док, просто поменял на stm32f103c8 все норм

Ссылка на комментарий
Поделиться на другие сайты

Инициализацию правильно провёл? Павер кей дернул? На ноге статуса то что нужно появилось? Скорость передачи правильная? Попробуй первой командой отправить "AAA\r\n".

Изменено пользователем GOR23
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Добрый день. Простой вроде бы вопрос, но оказалась дыра в знаниях). Как должна называться функция обработчика прерываний PVD в HAL. К примеру для таймера 2:

void TIM2_IRQHandler(void)
{
}

Не могу найти название для PVD. Да и не совсем ясно откуда эти названия берутся, и где привязываются к вектору прерывания.

Ссылка на комментарий
Поделиться на другие сайты

34 minutes ago, GOR23 said:

Не могу найти название для PVD. Да и не совсем ясно откуда эти названия берутся, и где привязываются к вектору прерывания.

В файле startup_stm32___.s

Ссылка на комментарий
Поделиться на другие сайты

@MasterElectric Детектор падения напряжения. Может генерировать прерывание когда напряжение падает ниже порога (Макс порог 2.9В). Если батарейное питание, то крайне нужная вещь.

Ссылка на комментарий
Поделиться на другие сайты

На старших моделях есть BOR (brown out reset) находится в options bytes. Получается прямой аналог фьюзов bod level на avr. Но на stm32f103 такой штуки нет. Потому приходиться мудрить с прерываниями. В моем случае это нужно из за того что работаю с микросхемами FRAM и FLASH. А они по даташиту работают до 2,7 вольт. А контроллеру то пофиг, он будет с ними работать пока не вырубиться на 2х вольтах.

Ссылка на комментарий
Поделиться на другие сайты

Ребята, подскажите, на входе АЦП установлен делитель (110кОм на 10кОм), параллельно сопротивлению 10кОм висит конденсатор на 10нФ и стабилитрон (3.9В). Подобное включение видел на некоторых схемах, в которых так защищают вход АЦП от бросков. Собрал, но значения АЦП нелинейны и чем больше увеличивается измеряемое напряжение, тем больше нелинейность. Стабилитрон убираю - все нормально. Как я понимаю, получается что стабилитрон начинает работать сразу, не дожидаясь 3.9В и чем больше входное напряжение, тем больше, как я понимаю, он "подсаживает". Подскажите, почему так?

Ссылка на комментарий
Поделиться на другие сайты

Надо периодически измерять напряжение в борт.сети автомобиля 24В, возможны броски до 200В, подскажите, насколько целесообразно дополнительно устанавливать внешние защитные диоды от бросков по входу АЦП? Делитель напряжения получается 100кОм к 10 кОм, может с такими номиналами сопротивлений делителя справится и встроенная "защита"? Правильно ли я понимаю, что в случае с использованием внешних диодов, стабилитрон, ограничивающий возможное поднятие питание контроллера в данном случае не нужен из-за большого значения R1 и более низкого выходного сопротивления стабилизатора 3.3В (LM117), т.е. сильно напряжение не поднимет? Если не использовать внешние диоды, может тогда имеет смысл увеличить делитель до 1МОм к 100кОм?

dd.gif

Ссылка на комментарий
Поделиться на другие сайты

всю эту городьбу надо ставить на входе буферного повторителя. АЦП стм-ки имеет на входе УВХ емкостного типа, шутки с которым обычно заканчиваются не очень 

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

Ссылка на комментарий
Поделиться на другие сайты

В 17.03.2018 в 11:13, mail_robot сказал:

всю эту городьбу надо ставить на входе буферного повторителя

Проблема в том, что очень ограничен в размерах ПП, поэтому добавить ОУ не совсем представляется возможным (по-крайней мере не попадались подобные миниатюрные схемные рализации), но защитить вход все же хочется. Поставить, например, внешнюю сборку из 2-х диодов Шоттки + стабилитрон с сопротивлением по схеме выше, еще куда не шло. Хотя с делителем R1 (100кОм...150кОм) на R2 (10кОм), если я правильно посчитал, должно с головой хватить и встроенных защитных диодов в STM и стабилитрон не нужен, т.к. питание выше 4В не должно поднять при импульсе в 200В.

Изменено пользователем Денис Николев
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
    • Типа такого: https://aliexpress.ru/item/2044864227.html?sku_id=58855020183
    • поняли неправильно. У ТЛ494 никакой защиты нет, усилители ошибки не защита, они не должны приводить к ложным импульсам. Причем тут "микруха" ?  надо нагружать ВСЁ. До сих пор вообще непонятно о каком ИИП идет речь и сколько у него каналов. Бесполезно схему рисовать? - Помогать так бесполезно. Картина кривая по самое "немогу" продолжаются картинки, снятые через ногу и без цены деления.
×
×
  • Создать...