Перейти к содержанию

ATSAMD20G17 новый проц-новые глюки

впервые запускаю плату на этом чудесном проце. Тактирование от внешнего генератора 16мГц.

инициализация тактирования такая:

SYSCTRL->XOSC.reg=SYSCTRL_XOSC_STARTUP(0x04) | SYSCTRL_XOSC_ENABLE | SYSCTRL_XOSC_GAIN(0x4) | SYSCTRL_XOSC_AMPGC | SYSCTRL_XOSC_RUNSTDBY; //XCLK ON
while (!(SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_XOSCRDY)){};

GCLK->CTRL.reg = GCLK_CTRL_SWRST ;
 	while ( (GCLK->CTRL.reg & GCLK_CTRL_SWRST) && (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY) );  /* Wait for reset to complete */
      // wait states = 0
NVMCTRL->CTRLB.reg= NVMCTRL_CTRLB_CACHEDIS;
GCLK->GENCTRL.reg = GCLK_GENCTRL_ID_GCLK0 | GCLK_GENCTRL_SRC_XOSC | GCLK_GENCTRL_GENEN;  //SWITCH XCLK TO GCLK0
GCLK->GENCTRL.reg = GCLK_GENCTRL_ID_GCLK1 | GCLK_GENCTRL_SRC_XOSC | GCLK_GENCTRL_GENEN | GCLK_GENCTRL_OE;  //EXT_ADC_CLK
GCLK->GENDIV.reg = GCLK_GENDIV_ID_GCLK0 | GCLK_GENDIV_DIV(1);//DIV=1
GCLK->GENDIV.reg = GCLK_GENDIV_ID_GCLK1 | GCLK_GENDIV_DIV(2);//DIV=2 (EXT_ADC)
PM->CPUSEL.reg  = 0;//DIV=1
PM->APBASEL.reg = 0 ;
PM->APBBSEL.reg = 0 ;
PM->APBCSEL.reg = 0 ;

 

далее в цикле делаю такую хрень:

CYCLE:
 	PORTA.OUTTGL.reg = LED_RED;
PORTA.OUTTGL.reg = LED_RED;
PORTA.OUTTGL.reg = LED_RED;
PORTA.OUTTGL.reg = LED_RED;
PORTA.OUTTGL.reg = LED_RED;
PORTA.OUTTGL.reg = LED_RED;
PORTA.OUTTGL.reg = LED_RED;
PORTA.OUTTGL.reg = LED_RED;
PORTA.OUTTGL.reg = LED_RED;
PORTA.OUTTGL.reg = LED_RED;
goto CYCLE;

смотрю на такт и на порт LED_RED и вижу, что порт дергается синхронно с тактом и ровно в 4 раза медленнее, хотя по инструкции по идее должен дрыгаться за 1 такт.

При этом внешние такты на АЦП и на SPI выдаются такие как я и задал.

Что я делаю не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Что я делаю не так?

Не туда смотрите. Смотреть надо на ассемблерные команды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Не туда смотрите. Смотреть надо на ассемблерные команды.

в асме все нормально, одна С команда- одна инструкция:

       0x23a: 0x61ac         STR       R4, [R5, #0x18]
       0x23c: 0x61ac         STR       R4, [R5, #0x18]
       0x23e: 0x61ac         STR       R4, [R5, #0x18]
       0x240: 0x61ac         STR       R4, [R5, #0x18]
       0x242: 0x61ac         STR       R4, [R5, #0x18]
       0x244: 0x61ac         STR       R4, [R5, #0x18]
       0x246: 0x61ac         STR       R4, [R5, #0x18]
       0x248: 0x61ac         STR       R4, [R5, #0x18]
       0x24a: 0x61ac         STR       R4, [R5, #0x18]
       0x24c: 0x61ac         STR       R4, [R5, #0x18]
       0x24e: 0xe7f4         B.N       0x23a

по шагам щелкал - никаких вылетов из цикла в какие-либо прерывания нету.

такое ощущение, что где-то такт делится на 4, но где- понять не могу.

Изменено пользователем Schtirlitz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
такое ощущение, что где-то такт делится на 4, но где- понять не могу.

Во-первых: STR выполняется 2 такта; во-вторых - с чего Вы решили, что порт GPIO сидит на шине, работающей на частоте ядра?

В-третьих: отладчики в IDE обычно позволяют измерять время выполнения команд.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обычный порт за 1 такт никто не обещал, но IOBUS должен работать. Не знаю как у вас объявлен PORTA, но со стандартными заголовками это будет так:

 

PORT_IOBUS->Group[0].OUTTGL.reg = LED_RED;

Изменено пользователем ataradov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Обычный порт за 1 такт никто не обещал, но IOBUS должен работать. Не знаю как у вас объявлен PORTA, но со стандартными заголовками это будет так:

 

PORT_IOBUS->Group[0].OUTTGL.reg = LED_RED;

Стало в 2 раза быстрее щелкать.. теперь на 2 такта 1 смена уровня порта.

В документации где-то увидел "single cycle GPIO access", вот и решил проверить)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Стало в 2 раза быстрее щелкать.. теперь на 2 такта 1 смена уровня порта.

В документации где-то увидел "single cycle GPIO access", вот и решил проверить)

 

Это странно должно за 1 такт выполняться. Завтра на работе проверю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Это странно должно за 1 такт выполняться. Завтра на работе проверю.

А разве в ATSAM для области памяти GPIO разрешён буфер записи? Если нет - то конечно будет 2 такта.

Ну или по этой причине:

Other instructions cannot be pipelined after STR with register offset. STR can only be pipelined when it follows an LDR, but nothing can be pipelined after the store. Even a stalled STR normally only takes two cycles, because of the write buffer.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IOBUS -это отдельная шина. Насчет возможности конвееризации STR - нужно проверять и возможно переписывать по-другому как-то, хотя сходу не ясно как. В документации обещают один цикл - значит должен быть способ этого добиться или нужно документацию менять.

 

Сейчас поздно, голова уже не варит.

 

 

Этот текст относится к Cortex-M3, SAM D20 - это M0+, и там таких ограничений сходу не видно.

 

И "Table 3-1 Cortex-M0+ instruction summary" Cortex-M0+ TRM обещает 1 клок для single-cycle I/O port. Так что все должно работать.

Изменено пользователем ataradov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал с внутренним 8 MHz RC - все работает. Платы с внешним кристаллом под рукой нет, но все должно работать.

 

Каждый передний фронт 8 MHz выход переключается в противоположенное состояние (результирующая частота переключения 4 MHz).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня порт дергается с частотой 4 мГц при 16 тактирования.

Похоже всётаки с настройкой GCLK что-то не так.

Проц для меня новый, буду дальше разбираться..

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот полный рабочий проект. Может поможет.

 

Ну или если проблемы продолжатся - обращайтесь. Любые вопросы по SAM можно решить.

samd20_iobus.zip

Изменено пользователем ataradov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти