Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Вт апр 05, 2016 11:16:05

Здравствуйте! Разбираюсь понемногу с 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 ругается. Листинга уже нет, но, может, кто-нибудь что-то подскажет?

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

Вт апр 05, 2016 15:08:46

С инициализацией я, кажется, разобрался. Правда, код после замены функции на класс ещё не возобновил работу, поэтому есть ещё один насущный вопрос - где подробно описано, как пользоваться отладчиком?

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

Вт апр 05, 2016 17:26:39

Ну что ж, спасибо всем неравнодушным за молчаливую поддержку. Класс в итоге заработал, хоть и пришлось в итоге голову поломать. Если кому интересно, ниже листинг:
Код:
   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;
}


Конечно, нужно ещё доделать отработку заднего фронта, но над этим буду работать после.

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

Сб ноя 18, 2017 01:35:53

Друзья, пишу в кейле (HAL + cube). Суть в чём, main файл пустого проекта совсем не пустой, и часто приходится скакать то в начало файла к переменным например, то в конец к обработчикам. И отнимает много времени прокрутка. Пока докрутишь, позабудешь зачем полез)
Однако, код генерируемый кубом хорошо структурирован и для переноса на другие МК пользовательский код помещается между комментариями пользователя в которых всегда присутствует слово "USER CODE".
И тут мысль, а нет ли в кейле возможности автоматически свернуть всё кроме областей между этими комментариями?

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

Сб ноя 18, 2017 20:22:09

Можно свернуть минусом слева от кода. Правда не все.
keil.jpg
(14.91 KiB) Скачиваний: 171

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

Вт дек 12, 2017 04:10:17

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

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

Вт дек 12, 2017 14:01:03

KEIL какой версии?

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

Вт дек 12, 2017 20:51:15

Oxford, 5.2
Ответить