Например TDA7294

Форум РадиоКот • Просмотр темы - STM32 на keil с нуля. Помогите пожалйста
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср апр 17, 2024 01:39:09

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 28 ]    , 2
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: STM32 на keil с нуля. Помогите пожалйста
СообщениеДобавлено: Вт апр 05, 2016 11:16:05 
Первый раз сказал Мяу!
Аватар пользователя

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Сб авг 22, 2015 08:32:37
Сообщений: 23
Откуда: Киев
Рейтинг сообщения: 0
Здравствуйте! Разбираюсь понемногу с 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 
Первый раз сказал Мяу!
Аватар пользователя

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

_________________
Нужно добиваться того чего хочется. В противном случае останется лишь довольствоваться тем, что есть.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 на keil с нуля. Помогите пожалйста
СообщениеДобавлено: Вт апр 05, 2016 17:26:39 
Первый раз сказал Мяу!
Аватар пользователя

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Сб авг 22, 2015 08:32:37
Сообщений: 23
Откуда: Киев
Рейтинг сообщения: 3
Ну что ж, спасибо всем неравнодушным за молчаливую поддержку. Класс в итоге заработал, хоть и пришлось в итоге голову поломать. Если кому интересно, ниже листинг:
Код:
   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;
}


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

_________________
Нужно добиваться того чего хочется. В противном случае останется лишь довольствоваться тем, что есть.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: STM32 на keil с нуля. Помогите пожалйста
СообщениеДобавлено: Сб ноя 18, 2017 01:35:53 
Родился

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


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: STM32 на keil с нуля. Помогите пожалйста
СообщениеДобавлено: Сб ноя 18, 2017 20:22:09 
Грызет канифоль
Аватар пользователя

Карма: 6
Рейтинг сообщений: 202
Зарегистрирован: Пт ноя 13, 2009 10:39:32
Сообщений: 272
Откуда: Москва
Рейтинг сообщения: 0
Можно свернуть минусом слева от кода. Правда не все.
Вложение:
keil.jpg [14.91 KiB]
Скачиваний: 256


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: STM32 на keil с нуля. Помогите пожалйста
СообщениеДобавлено: Вт дек 12, 2017 04:10:17 
Держит паяльник хвостом
Аватар пользователя

Зарегистрирован: Сб янв 16, 2010 15:34:57
Сообщений: 920
Откуда: Sevsk/Moscow
Рейтинг сообщения: 0
Доброго времени суток, товарищи.
Кейлом пользуюсь уже который год, но что-то дал он сбой... :dont_know:
Раньше в проекте пересобирались только необходимые файлы, компиляция обычно занимала секунды 2-3.
ПОтом что-то случилось, и начал при каждой компиляции весь проект пересобираться полностью, а это две минуты.
Как так получилось - не знаю, честно.
Помогите, пожалуйста, может сталкивался кто. А то сплошное мучение - при каждой правке столько ждать :cry:

_________________
:idea:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 на keil с нуля. Помогите пожалйста
СообщениеДобавлено: Вт дек 12, 2017 14:01:03 
Опытный кот
Аватар пользователя

Карма: 4
Рейтинг сообщений: 11
Зарегистрирован: Вт окт 23, 2012 13:17:25
Сообщений: 823
Откуда: Киселевск
Рейтинг сообщения: 0
KEIL какой версии?

_________________
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 на keil с нуля. Помогите пожалйста
СообщениеДобавлено: Вт дек 12, 2017 20:51:15 
Держит паяльник хвостом
Аватар пользователя

Зарегистрирован: Сб янв 16, 2010 15:34:57
Сообщений: 920
Откуда: Sevsk/Moscow
Рейтинг сообщения: 0
Oxford, 5.2

_________________
:idea:


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 28 ]    , 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y