STM32: Трудности при освоении

Кто любит RISC в жизни, заходим, не стесняемся.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Про Keil uVision 5

Сообщение HHIMERA »

TDuke писал(а):Ребята, я подумаю как вырезать глючный код. Потом выложу.
Не напрягайся... Глюки/тараканы у каждого свои... а следователно и методы борьбы с ними тоже разные...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Про Keil uVision 5

Сообщение HHIMERA »

Myp3ik писал(а):А если переключить оптимизацию в level0 ?
Самый плохой совет!!!
Потом ещё раз глюки отлавливать???
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
TDuke
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 08, 2012 22:02:38

Re: Про Keil uVision 5

Сообщение TDuke »

Еще одна мысль. У меня довольно много прерываний. 3 внешних, два от таймеров, от УАРТ. Проверю еще на предмет прерываний.

Но это не объясняет, почему под gcc работает, а под кейловским компилятором глючит. Тут наверно, какой-то нюанс пока неведомый мне.

Кстати под level0 еще одна переменная произвольно изменилась. Но только один раз при старте программы.
TDuke
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 08, 2012 22:02:38

Re: Про Keil uVision 5

Сообщение TDuke »

Хе! В системе постоянно возникают прерывания от УАРТ, хотя по нему ничего не передается. Иду разбираться. Вот что значит побыстрячку чужой код встроить. Ладно это не для этой темы.
Но все же это не объясняет странного поведения под кейлом. Как будет время попробую разобраться, что именно в коде сгенерированном кейловским компилятором вызывает затирание переменной.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: Про Keil uVision 5

Сообщение Myp3ik »

На RX пине подтяжка включена ?
Иван Сусанин - первый полупроводник :solder:
Реклама
TDuke
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 08, 2012 22:02:38

Re: Про Keil uVision 5

Сообщение TDuke »

Не, обычный аналоговый вход.

Код: Выделить всё

PORT.GPIO_Pin = GPIO_Pin_3;
PORT.GPIO_Mode = GPIO_Mode_IN_FLOATING;
USART2->SR дает - 00 1100 0000. Тоесть активны только флаги TC и TXE. Приема байта нету. Обработчик прерываний нужно полностью проверять.
Реклама
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: Про Keil uVision 5

Сообщение Myp3ik »

На RX UART должна быть подтяжка к плюсу. И желательно внешним резистором.
Иван Сусанин - первый полупроводник :solder:
Galizin
Мучитель микросхем
Сообщения: 477
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: STM32: Трудности при освоении

Сообщение Galizin »

сверте имя обработчика с таблицей векторов
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: STM32: Трудности при освоении

Сообщение menzoda »

Galizin писал(а):сверте имя обработчика с таблицей векторов
Так можно бесконечно гадать. Смысл? Нужен код, который автор не хочет давать, а то каким-то словоблудием занимаемся.
Спойлер- У меня не работает что-то.
- Что?
- Ну что-то, как-то, ничего не работает.
- Попробуй вариант А.
- Ну как-то что-то, не знаю, там работало, а тут нет.
- Попробуй вариант Б.
- Вроде что-то заработало... А нет, что-то не заработало и еще что-то отвалилось как-то.
- ....
Сначала переменные в отладчике не смотрелись, потом какие-то прерывания не срабатывали, или наоборот срабатывали когда не надо. Про косяк с переменными мы как-бы уже забыли, а потом опять его вспомнили. Предлагаю ультиматум - код или нечего обсуждать.
deemchik
Родился
Сообщения: 18
Зарегистрирован: Ср мар 13, 2013 22:50:19
Откуда: хкто его знает

Re: STM32: Трудности при освоении

Сообщение deemchik »

Столкнулся примерно с такой же проблемой. Только переменные, то сами сбрасываются, то устанавливаются, в функции которая вызывается из main. Переменные глобальные. Пробовал разные варианты и char, и int, static,volatile - бардак! Ни где больше как только в этой функции, они не изменяются и не используются. А те глобальные переменные которые используются, вполне корректно себя ведут. Даже если по шагам пройтись, меняются корректно, а как только отпустить отладку в свободное плаванье, тут начинается... После повторного цикла на этой же точке останова, переменная котора была установлена в 0 уже может быть единицей, а иногда и число 14 пролетало.
Даже элементарное, вот один из примеров:

Код: Выделить всё

		
uint32_t BtnLongCount = 0;			
int BtnPresed = 0;
...
void scan (void)
{
...
       BtnLongCount=0;
       BtnPresed=0; //при следующем вызове ф-ции тут уже 1!!!!
...
}
Хотя в условие где BtnPresed=1 даже как и требуется, не заходит! 2-дня с бубном танцы устраиваю.

Пысы. Хотелось бы узнать, у автора, чем все закончилось!? Или может кто сталкивался с подобным. Уже грешу на stm-ку, может поджарил...? С keil-а на кокос не хочется переходить, слишком уж грамоздкий код у кокоса (даже с 3 оптимизацией) получается.
Keil - 4.74
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: STM32: Трудности при освоении

Сообщение Мурик »

deemchik писал(а):Хотя в условие где BtnPresed=1 даже как и требуется, не заходит!
Условие так и написано?

Код: Выделить всё

if (BtnPresed=1)
deemchik писал(а):С keil-а на кокос не хочется переходить, слишком уж грамоздкий код у кокоса
Видимо в кокосе неправильно оптимизацию настраиваете. В EmBitz у которого тот же GCC что у кокоса, получается прошивка меньше в размерах чем в кейле.
deemchik
Родился
Сообщения: 18
Зарегистрирован: Ср мар 13, 2013 22:50:19
Откуда: хкто его знает

Re: STM32: Трудности при освоении

Сообщение deemchik »

Вобщем так. Логика работы следующая, на шинах данных 16х2 дисплея (D4-D7) сидят кнопки, подключенные, через диод и небольшую обвязку, к еще одной ноге порта стм-ки.
Ф-я Btns_Check (условно назвал scan) поочередно включает порт на вход и определяет состояние кнопки. Если кнопка нажата определяем длительность нажатия.
Длинное/короткое, соот-но включается счетчик. Инкрементируем индекс порта и переключаем порт на выход, для корректной работы дисплея. Когда произошло событие переполнения счетчика - что значит длительное нажатие, выпрыгиваем из инкремента, если нет ждем отжатия кнопки. Затем заносим в глобальную переменную соот-ю реакцию BtnSort или BtnLong в соот-ии нажатой, одной из 4-х кнопок. Т.е. в дефайне определены 8 состояний, одно из которых на выходе передается в глобальную переменную. Обнуляя счетчик и остальные "тригеры-защелки" переменные и т.д.
В этой ф-ии только операторы "if" ну и всякие присваивания декременты, инкременты...
Так вот, засада теперь получаестя на на этом BtnPresed=1; а уже в другом месте! Когда я нажимаю один раз кнопку все отрабатывается отлично! Но при повторном счетчик BtnLongCount++; длительности нажатия кнопки, в теле ф-ии сначала по условию в 0 как и положено, но когда заскакиваю в ф-ю на точку останова, где счетчик должен увеличиваться, в ватче его состояние уже 20. Если обнуляю вручную, и делаю шаг, он снова 20. А если выполняю F5 поставив на этой строке точку он увеличивается до опеределенного момента и слетает, но не в ноль а в 20. Этот счетчик пробовал уже и таймером инкрементировать, примерно такие же глюки. И такой примерно бардак после презаливки стм-ки в этой ф-ии может быть почти с любыми переменными.
А вот сейчас например, на строчке if(BtnState!=0){} --- хотя BtnState в ватче =0!!! выполняется условие, и я перескакиваю в скобки!

Код: Выделить всё

	#define BTN_LONG_TIME		50				//время фиксации длинного нажатия в милисекундах (1000 - 2500)
	#define BTN_SORT_TIME		4					//время обработки дребезга в милисекундах (10-100) 80=0x50

	#define BTN_SHRT_UP			1			/*бит короткого нажатия кнопки up*/ 
	#define BTN_SHRT_DN			2			/*бит короткого нажатия кнопки dn*/ 
	#define BTN_SHRT_LEFT		3			/*бит короткого нажатия кнопки left*/ 
	#define BTN_SHRT_RIGHT	4			/*бит короткого нажатия кнопки right*/ 
	#define BTN_LONG_UP			10			/*бит длинного нажатия кнопки up*/ 
	#define BTN_LONG_DN			20			/*бит длинного нажатия кнопки dn*/ 
	#define BTN_LONG_LEFT		30		/*бит длинного нажатия кнопки left*/ 
	#define BTN_LONG_RIGHT	40		/*бит длинного нажатия кнопки right*/ 

 int  BtnLongCount;			//последнее состояние кнопок перед отпусканием
 int BtnIndex = 0; // index of tested button
 int BtnLastIndex = 0; // index of tested button

 int BtnFlags = 0;

 int BtnLast;
 unsigned char BtnPresed;
int BtnState=0;
//int  BtnKey;
// ------------------------------------------------------------------------------//
void Btns_Check(void)
{  
 //unsigned char BtnKey=0;
 

	GPIO_InitTypeDef  GPIO_InitStructure;

  if (bBeep) return; // if beep, then reset
  
  /* Configure the BTN_BEEP_GPIO_PIN pin as input */
  GPIO_InitStructure.GPIO_Pin = BTN_BEEP_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(BTN_BEEP_GPIO_PORT, &GPIO_InitStructure);
  
	if (BtnIndex == 0)
  {
    LCD_HAL_Write(0x10);
    if (GPIO_ReadInputDataBit(BTN_BEEP_GPIO_PORT, BTN_BEEP_GPIO_PIN))
		{
			BtnState=BTN_SHRT_LEFT;
			BtnLastIndex=BtnIndex;
			//BtnKey=1;
		}
		else BtnState=0;
  }
  else if (BtnIndex == 1)//нажатиe кнопки up
  {
    LCD_HAL_Write(0x20);
    if (GPIO_ReadInputDataBit(BTN_BEEP_GPIO_PORT, BTN_BEEP_GPIO_PIN))
		{
			BtnState=BTN_SHRT_UP;
			BtnLastIndex=BtnIndex;
			//BtnKey=2;
		}
		else BtnState=0;
  }
  else if (BtnIndex == 2)
  {
    LCD_HAL_Write(0x40);
    if (GPIO_ReadInputDataBit(BTN_BEEP_GPIO_PORT, BTN_BEEP_GPIO_PIN))
		{
			BtnState=BTN_SHRT_DN;
			BtnLastIndex=BtnIndex;
			//BtnKey=3;
		}
		else BtnState=0;
  }
  else if (BtnIndex == 3)//BTN_RIGHT
  {
    LCD_HAL_Write(0x80);
    if (GPIO_ReadInputDataBit(BTN_BEEP_GPIO_PORT, BTN_BEEP_GPIO_PIN))
		{
			BtnState=BTN_SHRT_RIGHT;
			BtnLastIndex=BtnIndex;
			//BtnKey=4;
		}
		else BtnState=0;
  }
	
	if (BtnIndex == BtnLastIndex) //кнопка нажата таже
	{
		if(BtnState!=0)// key pressed
		{
			if(BtnState == BtnLast)//key=pressed key
			{
				if(BtnPresed==1) BtnLongCount++;//key pressed counter
				//если нажатие превысело счетчик долгого нажатия - срочный выход
				if(BtnLongCount>=BTN_LONG_TIME) 
					goto exit1;
			}
			else //первый вход
			{
				BtnFlags=0;
				BtnLast=BtnState;//store key
				BtnLongCount=0;//reset key pressed counter
				BtnPresed=1;//start pressed key counter
			}
		}
	else // key de-pressed
	{
		exit1:
		if(BtnPresed==1) //кнопка была нажата определяем длительность... BtnPresed=1;
		{
			if(BtnLongCount<BTN_SORT_TIME) //антидребезг!!!
			{
				if (BtnLongCount!=0)
				{
					BtnLongCount--;
					goto exit;
				}
			}
			if(BtnLongCount>=BTN_LONG_TIME) 
				BtnFlags=(BtnLast*10);
			else if(BtnLongCount>BTN_SORT_TIME)
				BtnFlags=BtnLast;
			BtnLast=0;
			BtnLongCount=0;//reset key pressed counter
		}
		BtnPresed=0;
	}
}
	exit:  
	BtnIndex++;
  
	if (BtnIndex >= 4) {BtnIndex = 0;}

	
  //GPIO_InitStructure.GPIO_Pin = BTN_BEEP_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(BTN_BEEP_GPIO_PORT, &GPIO_InitStructure);

}
Кажется я понял. Грабли у меня именно с динамическим переключением портов. Когда привязываю BtnIndex к одному порту кнопа отрабатывает нормально без глюков перменных. Буду разбираться.
deemchik
Родился
Сообщения: 18
Зарегистрирован: Ср мар 13, 2013 22:50:19
Откуда: хкто его знает

Re: STM32: Трудности при освоении

Сообщение deemchik »

Выходит, что я тупо вешаю мк нажатой кнопкой, в то время когда порт перешел на выход для дисплея!? :)
Увеличил токо-ограничивающий резистор перед портом мк и вроде все заработало! :shock: А оно не лыжи а я на асфальте... :)
Пошел тестить.
Последний раз редактировалось deemchik Вс авг 14, 2016 14:45:55, всего редактировалось 1 раз.
deemchik
Родился
Сообщения: 18
Зарегистрирован: Ср мар 13, 2013 22:50:19
Откуда: хкто его знает

Re: STM32: Трудности при освоении

Сообщение deemchik »

Немного подправил, добавил метку входа, теперь осталось убрать повторение, если не успел отпустить кнопку. Хотя, так и не понял, при чем тут резистор!? Входы/выходы толерантные... млин, голова вареник, запутался.
Ответить

Вернуться в «ARM»