Не напрягайся... Глюки/тараканы у каждого свои... а следователно и методы борьбы с ними тоже разные...TDuke писал(а):Ребята, я подумаю как вырезать глючный код. Потом выложу.
STM32: Трудности при освоении
Re: Про Keil uVision 5
"Я не даю готовых решений, я заставляю думать!"(С)
- Реклама
Re: Про Keil uVision 5
Самый плохой совет!!!Myp3ik писал(а):А если переключить оптимизацию в level0 ?
Потом ещё раз глюки отлавливать???
"Я не даю готовых решений, я заставляю думать!"(С)
Re: Про Keil uVision 5
Еще одна мысль. У меня довольно много прерываний. 3 внешних, два от таймеров, от УАРТ. Проверю еще на предмет прерываний.
Но это не объясняет, почему под gcc работает, а под кейловским компилятором глючит. Тут наверно, какой-то нюанс пока неведомый мне.
Кстати под level0 еще одна переменная произвольно изменилась. Но только один раз при старте программы.
Но это не объясняет, почему под gcc работает, а под кейловским компилятором глючит. Тут наверно, какой-то нюанс пока неведомый мне.
Кстати под level0 еще одна переменная произвольно изменилась. Но только один раз при старте программы.
Re: Про Keil uVision 5
Хе! В системе постоянно возникают прерывания от УАРТ, хотя по нему ничего не передается. Иду разбираться. Вот что значит побыстрячку чужой код встроить. Ладно это не для этой темы.
Но все же это не объясняет странного поведения под кейлом. Как будет время попробую разобраться, что именно в коде сгенерированном кейловским компилятором вызывает затирание переменной.
Но все же это не объясняет странного поведения под кейлом. Как будет время попробую разобраться, что именно в коде сгенерированном кейловским компилятором вызывает затирание переменной.
- Реклама
Re: Про Keil uVision 5
Не, обычный аналоговый вход.
USART2->SR дает - 00 1100 0000. Тоесть активны только флаги TC и TXE. Приема байта нету. Обработчик прерываний нужно полностью проверять.
Код: Выделить всё
PORT.GPIO_Pin = GPIO_Pin_3;
PORT.GPIO_Mode = GPIO_Mode_IN_FLOATING;Re: Про Keil uVision 5
На RX UART должна быть подтяжка к плюсу. И желательно внешним резистором.
Иван Сусанин - первый полупроводник 
Re: STM32: Трудности при освоении
сверте имя обработчика с таблицей векторов
Re: STM32: Трудности при освоении
Так можно бесконечно гадать. Смысл? Нужен код, который автор не хочет давать, а то каким-то словоблудием занимаемся.Galizin писал(а):сверте имя обработчика с таблицей векторов
Спойлер
- У меня не работает что-то.- Что?
- Ну что-то, как-то, ничего не работает.
- Попробуй вариант А.
- Ну как-то что-то, не знаю, там работало, а тут нет.
- Попробуй вариант Б.
- Вроде что-то заработало... А нет, что-то не заработало и еще что-то отвалилось как-то.
- ....
Re: STM32: Трудности при освоении
Столкнулся примерно с такой же проблемой. Только переменные, то сами сбрасываются, то устанавливаются, в функции которая вызывается из main. Переменные глобальные. Пробовал разные варианты и char, и int, static,volatile - бардак! Ни где больше как только в этой функции, они не изменяются и не используются. А те глобальные переменные которые используются, вполне корректно себя ведут. Даже если по шагам пройтись, меняются корректно, а как только отпустить отладку в свободное плаванье, тут начинается... После повторного цикла на этой же точке останова, переменная котора была установлена в 0 уже может быть единицей, а иногда и число 14 пролетало.
Даже элементарное, вот один из примеров:
Хотя в условие где BtnPresed=1 даже как и требуется, не заходит! 2-дня с бубном танцы устраиваю.
Пысы. Хотелось бы узнать, у автора, чем все закончилось!? Или может кто сталкивался с подобным. Уже грешу на stm-ку, может поджарил...? С keil-а на кокос не хочется переходить, слишком уж грамоздкий код у кокоса (даже с 3 оптимизацией) получается.
Keil - 4.74
Даже элементарное, вот один из примеров:
Код: Выделить всё
uint32_t BtnLongCount = 0;
int BtnPresed = 0;
...
void scan (void)
{
...
BtnLongCount=0;
BtnPresed=0; //при следующем вызове ф-ции тут уже 1!!!!
...
}
Пысы. Хотелось бы узнать, у автора, чем все закончилось!? Или может кто сталкивался с подобным. Уже грешу на stm-ку, может поджарил...? С keil-а на кокос не хочется переходить, слишком уж грамоздкий код у кокоса (даже с 3 оптимизацией) получается.
Keil - 4.74
Re: STM32: Трудности при освоении
Условие так и написано?deemchik писал(а):Хотя в условие где BtnPresed=1 даже как и требуется, не заходит!
Код: Выделить всё
if (BtnPresed=1)Видимо в кокосе неправильно оптимизацию настраиваете. В EmBitz у которого тот же GCC что у кокоса, получается прошивка меньше в размерах чем в кейле.deemchik писал(а):С keil-а на кокос не хочется переходить, слишком уж грамоздкий код у кокоса
Re: STM32: Трудности при освоении
Вобщем так. Логика работы следующая, на шинах данных 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!!! выполняется условие, и я перескакиваю в скобки!
Кажется я понял. Грабли у меня именно с динамическим переключением портов. Когда привязываю BtnIndex к одному порту кнопа отрабатывает нормально без глюков перменных. Буду разбираться.
Ф-я 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);
}Re: STM32: Трудности при освоении
Выходит, что я тупо вешаю мк нажатой кнопкой, в то время когда порт перешел на выход для дисплея!? 
Увеличил токо-ограничивающий резистор перед портом мк и вроде все заработало!
А оно не лыжи а я на асфальте...
Пошел тестить.
Увеличил токо-ограничивающий резистор перед портом мк и вроде все заработало!
Пошел тестить.
Последний раз редактировалось deemchik Вс авг 14, 2016 14:45:55, всего редактировалось 1 раз.
Re: STM32: Трудности при освоении
Немного подправил, добавил метку входа, теперь осталось убрать повторение, если не успел отпустить кнопку. Хотя, так и не понял, при чем тут резистор!? Входы/выходы толерантные... млин, голова вареник, запутался.


