Список разделов Flyback.org.ru » не HV » Микроконтроллеры и всё, что с ними связано
Тему сейчас просматривают - зарегистрированных: 0, скрытых: 0 и гостей: 0
Зарегестрированные - Нет
Ответить с цитатой

Break_Neck
 


Ну если есть такой вопрос Smile Это защищенные процессора с аппаратным шифрованием рома-рама. Есть и посвежее и солиднее - еще более сложная задача для реверс-инжиниринга. Суть проста - все в проце аппаратно зашифрованно, ключ в озу - который подпитан батарейкой. Вобще то всеSmile

Добавлено: Tue Dec 26, 2017 11:03 pm
Ответить с цитатой

Behram
 


То есть, наебнув батарейку, девайс превращается в бесполезный хлам?Smile

Добавлено: Wed Dec 27, 2017 2:16 am
Ответить с цитатой

Ivani
 


Break_Neck писал(а):
Это защищенные процессора с аппаратным шифрованием рома-рама.
Так у Филипса вроде есть подобные?

Добавлено: Wed Dec 27, 2017 8:45 am
Ответить с цитатой

Break_Neck
 


Там много что есть для секурити, и да - отключив батарейку(при правильном написании софта даже на запитанном камне) - труп. У меня с таким процом девайс работает 12 лет, полет нормальный.

У филипса аналогов с таким уровнем секурности нет (для банкоматов например) - все что есть для подобных применений это батарейные далласы и MaxQ.

Добавлено: Wed Dec 27, 2017 10:29 am
Ответить с цитатой

pinguin
 


Пытаюсь изучать stm32 и возникают некоторые вопросы так как до этого с программированием не был знаком. Пользуюсь библиотекой HAL. Пытаюсь написать программу которая по наступлению внешнего прерывания должна избавиться от дребезга кнопки и изменять значение переменной counter. И как понимаю, функция прототипа обработчика должна виглядеть как
Код:

 int HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)

чтобы она могла вернуть значение переменной counter. Но при этом компилятор выдаёт ошибку "error:conficting types for HAL_GPIO_EXTI_Callback"
Код:

int button1_state;
int button2_state;
int counter;

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)
{
   if(GPIO_Pin==GPIO_PIN_1)
   {
      button1_state=0;
           if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)&&  button1_state==0)
           {
      
      counter++;
      button1_state=1;
      
      if(counter>8)
         {
         counter=0;
         }
                  
   }
   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==0 && button1_state==1)
      {
      button1_state=0;
       }
         return counter;
}
   //-----------------------------------------------------------
   if(GPIO_Pin==GPIO_PIN_2)
   {
          button2_state=0;
         
     if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)&&  button2_state==0)
          {
      counter--;
      button2_state=1;
            
         if(counter<0)
         {
         counter=0;
         }
                  
                  
   }
   if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)==0 && button2_state==1)
     {
      button2_state=0;
      }
      return counter;
   }
}


Подскажите, что я делаю не так ? Может писать отдельно обработчик нажатия и изменения переменной, а её вызывать при наступлении прерывания ?
И ещё, обьясните разницу между HAL_GPIO_EXTI_Callback и EXTI2_IRQHandler ?


Добавлено: Thu Mar 08, 2018 9:33 pm
Ответить с цитатой

Behram
 


А как ты это все писал? CubeMX юзал? В нем нужно выбрать нужную ногу, переключить ее на внешние прерывания и включить глобальные прерывания от нее в NVIC. После этого в stm32f4xx_it.c появляется функция - обработчик прерывания с кнопки.

Добавлено: Thu Mar 08, 2018 9:42 pm
Ответить с цитатой

pinguin
 


Да, всё так и сделано, в stm32f4xx_it.c есть тот самый EXTI_IRQHandler. Со светодиодом получалось обработать прерывания и Callback-ом и IRQHandler-ом. А вот с переменной никак ни там, ни там. Вот и интересуюсь какая между ними разница ибо примеры видел и такие, и такие.

Добавлено: Thu Mar 08, 2018 9:49 pm
Ответить с цитатой

Behram
 


Написал сейчас в прерывании счетчик, в зависимости от которого загораются 2 светодиода на плате, все работает нормально.
Код:

{
  /* USER CODE BEGIN EXTI0_IRQn 0 */

  /* USER CODE END EXTI0_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  /* USER CODE BEGIN EXTI0_IRQn 1 */
  count++;
  if (count == 1) HAL_GPIO_TogglePin(GPIOG, LD3_Pin);
    else if (count == 2) HAL_GPIO_TogglePin(GPIOG, LD4_Pin);
    else if (count == 3) {
      count = 0;
      HAL_GPIO_WritePin(GPIOG, LD3_Pin, GPIO_PIN_RESET);
      HAL_GPIO_WritePin(GPIOG, LD4_Pin, GPIO_PIN_RESET);
                          }
  /* USER CODE END EXTI0_IRQn 1 */
}


Добавлено: Fri Mar 09, 2018 6:44 pm
Ответить с цитатой

TheEvilGenius
 


А почему функция void при этом она возвращает counter? Ьак можно, и саму переменную 16 битной сделать

Добавлено: Sat Mar 10, 2018 7:19 am
Ответить с цитатой

N1X
 


TheEvilGenius писал(а):
она возвращает counter
А чего это она его возвращает? counter здесь - глобальная переменная. Модифицировать ее никто не запрещает и из прерывания... Понятие "возвращает" связано с ключевым словом "return", которого здесь нет )
Ну и ща вот понял еще к чему вопрос. Дело в том, что Callback - это технология необходимая для того, чтобы твою функцию могла вызвать сама библиотека по какому-то событию. Вид этой функции строго определен библиотекой. Поэтому если сказано, что функция ничего не возвращает (void), то так и должно быть. Зачем библиотеке код твоей клавиши? Он тебе нужен, вот и сохраняй в удобном месте Smile
Код:
/**
  * @brief  EXTI line detection callback
  * @param GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  /* NOTE : This function Should not be modified, when the callback is needed,
            the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}

Вот в библиотеке даже написано: NOTE : This function Should not be modified, when the callback is needed, the HAL_GPIO_EXTI_Callback could be implemented in the user file.
Т.е. хочешь воспользоваться - объяви как положено и пользуйся...


Добавлено: Mon Mar 12, 2018 11:00 am
Ответить с цитатой

TheEvilGenius
 


А ты его последнее условие посмотриSmile Вот и ретурн, и жалуется на то что ретурн будет инт, а функция войд, вот и несоответствие. Надо бы проверить.

Добавлено: Mon Mar 12, 2018 1:10 pm
Ответить с цитатой

N1X
 


TheEvilGenius писал(а):
А ты его последнее условие посмотри
Да, не догнал о чем ты, теперь видно, действительно return там не нужен, переменная то и так глобальная.

Добавлено: Mon Mar 12, 2018 6:56 pm
Ответить с цитатой

perezx
 


А поясните мне, пожалуйста, за вот такую глупую вещь.
Есть Аттини13, есть для нее вот такой код:
Код:

while (1)
   {
      c = c + 1;
      if (c > 4200000000) {c = 0; c1 = 0; c2 = 0; c3 = 0; c4 = 0;}
      
      if ((c4 == 0)&(outhigh == 0)) {PORTB |= INDICATOR_BIT; outhigh = 1; c4 = 100;};
      if ((c4 == 0)&(outhigh == 1)) {PORTB &= ~INDICATOR_BIT; outhigh = 0;  c4 = 200;};
      if (c4 > 0) {c4 = c4 - 1;};
   } //while 1

Дает, стало быть, сигнал прямоугольный заполнением 1/3.
Подключаю контроллер к USBASP, прошиваю, он сразу же на фантомном питании начинает генерить - все, как положено.
Отключаю от программатора, подаю питание - тишина.
Отключаю от питания, подключаю USBASP обратно - тишина.
Заново заливаю прошивку - опять все работает!


Добавлено: Sun May 20, 2018 9:05 am
Ответить с цитатой

Ivani
 


Если это весь код то нет инициализации генератора и делителя тактовой.

Добавлено: Sun May 20, 2018 9:56 am
Ответить с цитатой

perezx
 


Да ну не весь, конечно. С USBASPом-то работает - значит, нужные куски все есть Smile

Добавлено: Sun May 20, 2018 10:40 am
Ответить с цитатой

Тёма
Больше не студент


perezx писал(а):
Отключаю от программатора, подаю питание - тишина.
А если reset кратковременно на общий замкнуть, не начинает работать?

Добавлено: Sun May 20, 2018 12:03 pm
Ответить с цитатой

Ivani
 


При программировании может происходить инициализация регистров.
А еще ресет к питанию подтянут?

Добавлено: Sun May 20, 2018 12:08 pm
Ответить с цитатой

Денис
 


Угу, вероятна проблема с выводом ресета на плате с мк.

Добавлено: Sun May 20, 2018 1:03 pm
Ответить с цитатой

perezx
 


Фактически используется "голая" микросхема контроллера - 7805 в питании и выключатель "ресет". На ресете, когда программатор отключен, заведено +5. Замыкание на массу ничегошеньки не дает.
Код программы сократил до минимального, позволяющего устойчиво воспроизводить эффект:
Код:
#define F_CPU 1200000UL

#include <avr>
#include <util>


#define INDICATOR_BIT _BV(PB0)

int main()
{
   
   int outhigh = 0;
   DDRB |= INDICATOR_BIT;
   
   unsigned long c = 0;
   unsigned long c1,c2,c3,c4;
   ACSR=0x80;
   ADMUX=0b00000001; //ADC1
   ADCSRA=0b10000101;
   
   
   while (1)
   {
      c = c + 1;
      if (c > 4200000000) {c = 0; c1 = 0; c2 = 0; c3 = 0; c4 = 0;}
   
      if ((c4 == 0)&(outhigh == 0)) {PORTB |= INDICATOR_BIT; outhigh = 1; c4 = 100;};//round(c3/k);};
      if ((c4 == 0)&(outhigh == 1)) {PORTB &= ~INDICATOR_BIT; outhigh = 0;  c4 = 200;};//round(c3/k);};
      if (c4 > 0) {c4 = c4 - 1;};
   } //while 1
} //main


Добавлено: Sun May 20, 2018 1:53 pm
Ответить с цитатой

Electricman
Бес заземления


А я говорил - делай на логике Smile Взял бы 561ую серию - и с питанием учаться не пришлось бы.

Добавлено: Sun May 20, 2018 1:54 pm
Ответить с цитатой

perezx
 


Ты иди, иди, тебе еще амортизатор менять Smile

Добавлено: Sun May 20, 2018 4:51 pm
Ответить с цитатой

Николай
 


видел когда с китайским лабораторником тинька не дружила. кондюк рядом повесил - заработала. а просто от лабораторника без кондюка раз через раз запускалась.
какойто вч шум ей мозг ебал.

ты кастати вычитай прошивку обратно! когда второй раз к программатору подключишь. может и не сойтись. если не сойдется тоооо ->

-> фантомное питание при программировании зло и питание от программатора по тощему усб кабелю тоже зло. ебся пару дней, забраковав 20% контроллеров то не заводились,то висли... а потом при программировании питание нормальное подал - и все заработали, и записывались правильно, и проблем с запуском не было.

причем верификация сразу после записи почему-то может и проканать, а через пару минут уже не вычитывается. вот такая была чертовщина, а все изза питания

этот вариант самый правдоподобный

ну и вариант - контроллер хуевый.

Добавлено: Sun May 20, 2018 5:57 pm
Ответить с цитатой

Николян
 


У меня при простом повторении схем на микроконтроллерах руки опустились. А потом действительно кап в 0.1 подвешенный к выходу 7805 все решал.

Добавлено: Sun May 20, 2018 9:54 pm
Ответить с цитатой

perezx
 


Ларчик открывался чрезвычайно просто, как я и предполагал.
Переменная с4 на старте нигде не инициализируется. Видимо, при прошивке принудительно обнуляется вся область памяти, вот и с4 становится нулем. А при штатном старте - "как повезет".

Добавлено: Tue May 22, 2018 10:42 am
Ответить с цитатой

Vcoder
Магистр


А как же
Код:
if (c > 4200000000) {c = 0; c1 = 0; c2 = 0; c3 = 0; c4 = 0;}


Добавлено: Tue May 22, 2018 10:24 pm
Список разделов Flyback.org.ru » не HV » Микроконтроллеры и всё, что с ними связано
На страницу Пред.  1, 2, 3 ... 110, 111, 112 ... 150, 151, 152  След.     Просмотр темы целиком



Лицензионное соглашение

(c)Flyback.org.ru
Российское общество любителей высоких напряжений.
Использование материалов с данного сайта и форума возможно только с разрешения администрации.