Arduino due reset

Умоляю помогите, уже руки опустились. Имею плату DUE, построил программу для управления этой платой через ModBus панелькой Delta HMI, программировал через FLProg, все было прекрасно пока мне не понадобилось управлять драйвером сервопривода по step dir. Все блоки которые нашел и тестировал мне не нравились т.к. на высоких частотах шаг увеличения частоты увеличивался. Аналоговое управление решил оставить на последок если не смогу осилить step dir
Нашел прекрасно работающий код просто не реального гения в моих глазах - @dimax

void setup() {
Serial.begin(9600);
REG_PIOC_OER|=1<<3; //PC3 будет выход
 REG_PIOC_PDR|=1<<3;//PC3 будет периферия
  REG_PIOC_ABSR|=1<<3; //периферия "Б" выбрана    
   REG_PMC_PCER1|=1<<4; //включить тактирование "PWM"    
   REG_PWM_WPCR=0;//отлючение защиты от записи 
   REG_PWM_CLK=0; //клоки АБ выключены
   REG_PWM_CMR0=1; //Мастерклок прескалер по умолчанию /2
  REG_PWM_CPRD0= 42000u; // период по умолчанию  -1000 Герц
 REG_PWM_CDTY0=21000ul; //дьюти  по умолчанию 50%
REG_PWM_ENA|=1<<0;//Включить PWM 0 канал
}

void loop() {
uint32_t divider=1, icr=0, freq2pwm=0; uint16_t duty=0;
if(Serial.available() > 0){
  freq2pwm = Serial.parseInt();      
    duty=Serial.parseInt();
    icr=(84E6 /freq2pwm /divider);
      for(byte i=1; i<12;i++){
        if (icr >65535) { 
           divider= 1<<i;
           icr=(84E6 /freq2pwm /divider); }
        else { REG_PWM_CMR0 = i-1; break; } //делитель в регистр
     }//end for
REG_PWM_CPRDUPD0=icr; //запись периода
 if (duty){ REG_PWM_CDTYUPD0= (uint32_t)icr*(100-duty)/100; } 
  else { REG_PWM_CDTYUPD0=icr/2;}
    Serial.print("Freq= "); 
   Serial.print((uint32_t)84E6/icr/divider); Serial.println(" Herz"); 
 }// end is serial
} //end loop

Протестировал на максимальной частоте драйвера 500кГц меня бы устроили и 100кГц. Но после зашил свой код и он перестал работать, панель выдает ошибки по связи, пины периодически самопроизвольно срабатывают, скорее всего из за попыток панели установить связь. Перерыл интернет как сделать сброс нашел rstc_start_software_reset(RSTC); и RSTC->RSTC_CR = 0xA5000005; но как я его только не загружал и питание отключал и ждал, не помогло. И сам пытался из скетча @dimax вернуть регистры на место, чего только мои кривые руки не натворили. Читать 1400 листов по этому процессору вгоняют в еще большую депрессию, а так не хочется ждать другую плату. Печали нет предела. Еще пробовал скетч @dimax

// выход генератора -пин 2 на Arduino DUE
void setup() {
Serial.begin(9600);
 REG_PIOB_OER|=1<<25; //b25 будет выход
  REG_PIOB_PDR|=1<<25;//b25 будет периферия
   REG_PIOB_ABSR|=1<<25; //периферия "Б" выбрана
    REG_PMC_PCER0|=1<<27; //включить тактирование "TC0" 
     REG_TC0_CMR0=(1<<14)|(1<<15)|(1<<18)|(1<<19);//WAVE конфиг
    }

void loop() {
static uint32_t freq2tc=0;
 if (Serial.available() > 0){
    freq2tc = Serial.parseInt();    
    REG_TC0_RC0= 21E6/freq2tc;  
   REG_TC0_CCR0=5;
    Serial.print(21E6/REG_TC0_RC0,0); 
     Serial.println(" Herz");
      } //end if serial..
}

но он не заработал у меня. Не ругайтесь сильно, зарегистрировался и пишу от отчаяния.

Постарайтесь обьяснить внятно, в чем именно проблема .

Вы зашили в Дуе какой-то код и теперь не можете прошить никакой другой? Или я понял Вас неправильно?

Сначала был зашит второй код, приведенный выше, не заработал, затем первый и он заработал лучше чем я предполагал. Попытался перекинуть прерывания на другой пин меняя регистры и вникая в суть кода, не вышло. Затем зашил свой изначальный код построенный в flprog, modbus отвалился, причем менял пины для подключения микросхемы max485 связи с HMI нет. Указанные методы сброса платы не помогли или я их не так применял. Но первый код если зашить все так же прекрасно работает.

А зачем плату то сбрасывать, если все прекрасно шьется?

Я делитант в этом вопросе, но мне кажется что изменения в некоторых регистрах повлияли на работу других пинов, из за чего и происходят сбои при работе в последующих записаных программах. Извините если я что то не так объясняю.

Отключение питания приводит регистры в девственный вид. Что то у вас в схемотехнике барахлит скорее всего !

1 лайк

Нет, это не так.

1 лайк

Большое спасибо, Вы мне очень помогли @Komandir @b707 . Действительно дело было в схемотехнике, серво драйвер фирмы TECO мешал работать связи между панелькой HMI Delta и arduino due хотя был совершенно на другом порту. Думаю не спеша смогу победить и эту проблему. Бесконечно признателен!