STM32 на keil с нуля. Помогите пожалйста

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
Porada
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Сб авг 22, 2015 08:32:37
Откуда: Киев

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Porada »

Здравствуйте! Разбираюсь понемногу с STM32 и С++.
Сделал программу-счётчик нажатий на кнопку на базе STM32VLDiscovery с подключенным 4-х разрядным семисегментным индикатором.
Теперь хочу из функции кнопки создать класс. Возникают вопросы. Вот листинг:

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

class button
	{
		public:
			button(int ST_reg, int ST_bit, int ST_const);
			~button() {}
			bool GetRaise() const {return raise;}
			bool GetFall() const {return fall;}
			
		private:
			bool raise;  		// Переменная для возврата true для переднего фронта нажатия кнопки
			bool fall;	 		// Переменная для возврата true для заднего фронта нажатия кнопки
			bool mid_but1;	// Переменная для определения переднего и заднего фронта нажатия кнопки
			bool mid_but2;	// Переменная для определения переднего и заднего фронта нажатия кнопки
			bool but_fix;	  // Переменная для фиксации состояния удерживания кнопки
			int cnt1; // Переменная для отсчета состояния удерживания кнопки
			int cnt2 ; // Переменная для задержки фиксации состояния нажатой кнопки (антидребезг)
	};
	
	button::button(int ST_reg, int ST_bit, int ST_const)
{
		raise = 0; // Переменные для отображения нажатия кнопки - передний фронт
		fall = 0; // Переменные для отображения нажатия кнопки	- задний фронт
				
		if((ST_reg & ST_bit) == ST_const)		// Считываем состояние вывода порта с кнопкой
			{
				if(cnt2 <= 100) // Задаем условие ограничения счета для задержки антидребезга (передний фронт импульса)
					cnt2++;      // Счетчик задержки
				if(cnt2 > 100)  // Когда досчитал
					mid_but1 = 1;	 // присваиваем промежуточной переменной значение 1
			}
		else
			{
				if(cnt2 > 0)  // Задаем условие ограничения счета для задержки антидребезга (задний фронт импульса)
					cnt2--;     // Счетчик задержки
				if(cnt2 <= 0) // Когда досчитал
					mid_but1 = 0;  // присваиваем промежуточной переменной значение 0
			}
			
		if(mid_but2 < mid_but1)
			{
				raise = 1;  // Ловим момент изменения переменной - передний фронт импульса
				but_fix = 1;      // Присваиваем 1 промежуточной переменной
			}
		if(mid_but1 < mid_but2)
			{
				fall = 1;  // Ловим момент изменения переменной - задний фронт импульса		
				but_fix = 0;      // Присваиваем 0 промежуточной переменной
				cnt1 = 0;   // Сбрасываем счетчик
			}
		mid_but2 = mid_but1;  // Приравниваем промежуточные переменные, чтобы фронт был единичным			
			
		if(but_fix == 1) // Ловим состояние зажатой кнопки
			cnt1++; // пока кнопка зажата - инкрементируем счётчик
		if(cnt1 > 200000 && cnt1%2000 == 0) // если зажата долго, 2-3 секунды...
			raise = 1; // выдаём импульсы длительностью в такт с паузой где-то 0,1с
}
Сразу возникают вопросы:
1) Keil ругается на инициализацию переменной при объявлении. Вообще в С++ это допускается. Особенности компилятора или моя ошибка?
2) Мне нужно сделать так, чтобы при первом вызове методов класса переменные bool mid_but1, bool mid_but2, bool but_fix, int cnt1, int cnt2 инициализировались нулями, а дальше меняли своё значение согласно программе и не обнулялись при повторном вызове. Когда это была функция, я делал просто - объявил переменные перед телом функции и инициализировал нулями. Здесь так не получится. Можно решить в лоб - копировать значение переменной из main() и туда же возвращать, но нет ли решения лучше?
3) Пытался создавать ссылки на переменные. Тоже Keil ругается. Листинга уже нет, но, может, кто-нибудь что-то подскажет?
Нужно добиваться того чего хочется. В противном случае останется лишь довольствоваться тем, что есть.
Реклама
Аватара пользователя
Porada
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Сб авг 22, 2015 08:32:37
Откуда: Киев

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Porada »

С инициализацией я, кажется, разобрался. Правда, код после замены функции на класс ещё не возобновил работу, поэтому есть ещё один насущный вопрос - где подробно описано, как пользоваться отладчиком?
Нужно добиваться того чего хочется. В противном случае останется лишь довольствоваться тем, что есть.
Реклама
Аватара пользователя
Porada
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Сб авг 22, 2015 08:32:37
Откуда: Киев

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Porada »

Ну что ж, спасибо всем неравнодушным за молчаливую поддержку. Класс в итоге заработал, хоть и пришлось в итоге голову поломать. Если кому интересно, ниже листинг:

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

	class button
	{
		public:
			button(int ST_bit, int ST_const);
			~button() {}
			bool GetRaise(int ST_reg);
			bool GetFall() const;

		private:
			int itsST_reg;
			int itsST_bit;
			int itsST_const;
			bool raise;  		// Переменная для возврата true для переднего фронта нажатия кнопки
			bool fall;	 		// Переменная для возврата true для заднего фронта нажатия кнопки
			bool mid_but1;	// Переменная для определения переднего и заднего фронта нажатия кнопки
			bool mid_but2;	// Переменная для определения переднего и заднего фронта нажатия кнопки
			bool but_fix;	  // Переменная для фиксации состояния удерживания кнопки
			int cnt1; // Переменная для отсчета состояния удерживания кнопки
			int cnt2; // Переменная для задержки фиксации состояния нажатой кнопки (антидребезг)
	};

	button::button(int ST_bit, int ST_const)
	{
		itsST_bit = ST_bit;
		itsST_const = ST_const;
		mid_but1 = 0;
		mid_but2 = 0;
		but_fix = 0;
		cnt1 = 0;
		cnt2 = 0;
	}

	bool button::GetRaise(int ST_reg)
	{
		itsST_reg = ST_reg;
		raise = 0; // Переменные для отображения нажатия кнопки - передний фронт
		fall = 0; // Переменные для отображения нажатия кнопки	- задний фронт

		if((itsST_reg & itsST_bit) == itsST_const)		// Считываем состояние вывода порта с кнопкой
			{
				if(cnt2 <= 100) // Задаем условие ограничения счета для задержки антидребезга (передний фронт импульса)
					cnt2++;      // Счетчик задержки
				if(cnt2 > 100)  // Когда досчитал
					mid_but1 = 1;	 // присваиваем промежуточной переменной значение 1
			}
		else
			{
				if(cnt2 > 0)  // Задаем условие ограничения счета для задержки антидребезга (задний фронт импульса)
					cnt2--;     // Счетчик задержки
				if(cnt2 <= 0) // Когда досчитал
					mid_but1 = 0;  // присваиваем промежуточной переменной значение 0
			}

		if(mid_but2 < mid_but1)
			{
				raise = 1;  // Ловим момент изменения переменной - передний фронт импульса
				but_fix = 1;      // Присваиваем 1 промежуточной переменной
			}
		if(mid_but1 < mid_but2)
			{
				fall = 1;  // Ловим момент изменения переменной - задний фронт импульса
				but_fix = 0;      // Присваиваем 0 промежуточной переменной
				cnt1 = 0;   // Сбрасываем счетчик
			}
		mid_but2 = mid_but1;  // Приравниваем промежуточные переменные, чтобы фронт был единичным

		if(but_fix == 1) // Ловим состояние зажатой кнопки
			cnt1++;        // пока зажата - инкрементируем счетчик
		if(cnt1 > 200000 && cnt1%2000 == 0) // Если зажата долго, 2-3 секунды...
			raise = 1; // ...выдаем импульсы длительность в такт и паузой 0,2-0,3 секунды

		return raise;
}
Конечно, нужно ещё доделать отработку заднего фронта, но над этим буду работать после.
Нужно добиваться того чего хочется. В противном случае останется лишь довольствоваться тем, что есть.
Hardegen
Родился
Сообщения: 16
Зарегистрирован: Вт мар 28, 2017 12:32:15

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Hardegen »

Друзья, пишу в кейле (HAL + cube). Суть в чём, main файл пустого проекта совсем не пустой, и часто приходится скакать то в начало файла к переменным например, то в конец к обработчикам. И отнимает много времени прокрутка. Пока докрутишь, позабудешь зачем полез)
Однако, код генерируемый кубом хорошо структурирован и для переноса на другие МК пользовательский код помещается между комментариями пользователя в которых всегда присутствует слово "USER CODE".
И тут мысль, а нет ли в кейле возможности автоматически свернуть всё кроме областей между этими комментариями?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Fusion
Грызет канифоль
Сообщения: 272
Зарегистрирован: Пт ноя 13, 2009 10:39:32
Откуда: Москва
Контактная информация:

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Fusion »

Можно свернуть минусом слева от кода. Правда не все.
keil.jpg
(14.91 КБ) 280 скачиваний
Реклама
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение gauss »

Доброго времени суток, товарищи.
Кейлом пользуюсь уже который год, но что-то дал он сбой... :dont_know:
Раньше в проекте пересобирались только необходимые файлы, компиляция обычно занимала секунды 2-3.
ПОтом что-то случилось, и начал при каждой компиляции весь проект пересобираться полностью, а это две минуты.
Как так получилось - не знаю, честно.
Помогите, пожалуйста, может сталкивался кто. А то сплошное мучение - при каждой правке столько ждать :cry:
:idea:
Реклама
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение Oxford »

KEIL какой версии?
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Re: STM32 на keil с нуля. Помогите пожалйста

Сообщение gauss »

Oxford, 5.2
:idea:
Ответить

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