мигающий светодиод на teensy3.2 с программированием руки

Я новичок в программировании рук. Я использую teensy 3.2 с чипом микроконтроллера MK20DX256, а светодиод подключен к PTC5 MC.

Я написал этот код, чтобы мигать светодиодом.

Проект строится без ошибок, но HEX-файл не мигает светодиодом. Я использую загрузчик teensy для программирования платы с помощью HEX-файла.

Вот мой код:

#include "MK20D7.h"
void delay(unsigned int);

int main(void) {
  SystemCoreClockUpdate(); /* Get Core Clock Frequency */
  SysTick_Config(SystemCoreClock/1000); /* Generate interrupt each 1 ms */

    PORTC->PCR[5]= 256; //declared as GPIO
    PTC->PDDR=0x00000010;
    while(1){
      PTC->PDOR=0x00000010;
      delay(500);
      PTC->PDOR=0x00000000;
      delay(500);
    }
    
    void delay(unsigned int ms){
      unsigned int i,j;
    
      for(i=0;i<ms;i++)
      for(j=0;j<20000;j++);
    }
}

Пожалуйста, помогите мне найти, что не так с этим кодом


person blessed    schedule 10.01.2021    source источник
comment
Вы уверены, что ваши циклы в функциях delay() не полностью оптимизированы? Побочных эффектов нет.   -  person πάντα ῥεῖ    schedule 10.01.2021
comment
Если у вас есть прерывание каждые 1 мс, вы должны использовать это прерывание для увеличения счетчика, а не пытаться отключить циклы. Если циклы не оптимизировать, они, вероятно, будут работать слишком быстро.   -  person user4581301    schedule 11.01.2021
comment
Я не знаком с тинси-системой, поэтому не могу рассказать вам, как установить (поиск по ключевому слову!) Подпрограмма обслуживания прерываний, которая будет обрабатывать прерывание и увеличивать счетчик, но delay может быть таким же простым, как установка счетчика на ноль, затем цикл, пока счетчик не достигнет ms, а затем возврат.   -  person user4581301    schedule 11.01.2021
comment
вы не хотите сначала начинать с прерываний, поэтому вы можете удалить это, и вам вообще не нужно возиться с системными часами. вам нужно, в зависимости от части, включить gpio, сделать выводы gpio выходом. и делать то, что вы делаете, делая штифт высоким и низким с задержками.   -  person old_timer    schedule 11.01.2021


Ответы (1)


Сначала попробуйте это, посмотрите, загорится ли светодиод и останется ли он

# include "MK20D7.h"
int main(void)
{
PORTC->PCR[5]= 256; //declared as GPIO
PTC->PDDR=0x00000010;
PTC->PDOR=0x00000010;
//PTC->PDOR=0x00000000;
while(1) continue;
}

Если нет то нужно разобрать, см ниже.

Тогда попробуйте это

# include "MK20D7.h"
int main(void)
{
PORTC->PCR[5]= 256; //declared as GPIO
PTC->PDDR=0x00000010;
//PTC->PDOR=0x00000010;
PTC->PDOR=0x00000000;
while(1) continue;
}

и посмотреть, если он идет / остается выключенным

Тогда попробуйте это

# include "MK20D7.h"
void delay(unsigned int );

int main(void)
{
PORTC->PCR[5]= 256; //declared as GPIO
PTC->PDDR=0x00000010;
while(1)
{
PTC->PDOR=0x00000010;
delay();
PTC->PDOR=0x00000000;
delay();
}

}

void delay(void)
{
volatile unsigned int j;
for(j=0;j<20000;j++);
}

Предполагая, что у вас есть правильный заголовочный файл, а двоичный файл собран и связан правильно и т. д. В идеале вы хотите разобрать двоичный файл, проверить векторную таблицу, чтобы убедиться в ее размещении и правильном содержании. Изучите код после основной метки и сравните его с документацией для нескольких используемых регистров.

PSOR и PCOR проще в использовании

PTC->PSOR=1<<5;
delay();
PTC->PCOR=1<<5;
delay();
person old_timer    schedule 10.01.2021
comment
Я новичок в программировании оружия. Я понятия не имею о дизассемблировании. Решения, которые вы предложили, ни одно из них не работает в моем случае. Может быть, проблема в связывании. когда я пытаюсь отладить, ни один из регистров не меняет свое значение. что мне делать? пожалуйста, помогите мне начать - person blessed; 11.01.2021