ART_ME

STM32 для чайника

2096 posts in this topic

Guest Гость   
Guest Гость
1 час назад, mail_robot сказал:

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

 

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

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

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

Share this post


Link to post
Share on other sites
Alex Falcon    210
5 часов назад, Гость Гость сказал:

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

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

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

Share this post


Link to post
Share on other sites
Skyluck    0
В 21.02.2018 в 09:15, Гость Гость сказал:

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

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

Share this post


Link to post
Share on other sites

Опорное решение: компоненты для защиты RS-485

Компания Bourns анонсировала новую (4-ю) версию демонстрационной платы для тестирования защиты низковольтных слаботочных цепей от токовых перегрузок и импульсных перенапряжений, в частности, для защиты интерфейса RS-485. Мы собрали для вас всю самую интересную информацию по данной теме на одной странице.

Подробнее...

LoKeR    0

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

stm32-uart-spl.rar

Share this post


Link to post
Share on other sites

Видео вебинара «Уникальный подход MORNSUN к разработке DC/DC-преобразователей. Что на выходе?»

На сайте КОМПЭЛ доступны материалы вебинара, посвященные последнему поколению DC/DC преобразователей с фиксированным входом R3 от MORNSUN. Вы можете посмотреть видеозапись, ознакомиться с презентацией и ответами на вопросы.

Подробнее...

LoKeR    0
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');
	}
}

 

 

Share this post


Link to post
Share on other sites
mail_robot    1503

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

Share this post


Link to post
Share on other sites
LoKeR    0

Доброго времени суток, решил подключить 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 все норм

Share this post


Link to post
Share on other sites
GOR23    41

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

Edited by GOR23

Share this post


Link to post
Share on other sites
GOR23    41

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

void TIM2_IRQHandler(void)
{
}

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

Share this post


Link to post
Share on other sites
snn_krs    58
34 minutes ago, GOR23 said:

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

В файле startup_stm32___.s

Share this post


Link to post
Share on other sites
GOR23    41

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

Share this post


Link to post
Share on other sites
GOR23    41

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

Share this post


Link to post
Share on other sites
Guest Гость   
Guest Гость

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

Share this post


Link to post
Share on other sites

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

dd.gif

Share this post


Link to post
Share on other sites
mail_robot    1503

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

Share this post


Link to post
Share on other sites
В 17.03.2018 в 11:13, mail_robot сказал:

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

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

Edited by Денис Николев

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoticons maximum 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...