реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ATSAMD20G17 новый проц-новые глюки
Schtirlitz
сообщение Jun 13 2018, 18:43
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 7-02-06
Из: Москва
Пользователь №: 14 070



впервые запускаю плату на этом чудесном проце. Тактирование от внешнего генератора 16мГц.
инициализация тактирования такая:
CODE
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 ;


далее в цикле делаю такую хрень:
CODE
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 выдаются такие как я и задал.
Что я делаю не так?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 13 2018, 19:42
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 661
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Schtirlitz @ Jun 13 2018, 21:43) *
Что я делаю не так?

Не туда смотрите. Смотреть надо на ассемблерные команды.
Go to the top of the page
 
+Quote Post
Schtirlitz
сообщение Jun 13 2018, 19:50
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 7-02-06
Из: Москва
Пользователь №: 14 070



Цитата(jcxz @ Jun 13 2018, 22:42) *
Не туда смотрите. Смотреть надо на ассемблерные команды.

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

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 - Jun 13 2018, 19:52
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 13 2018, 20:03
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 661
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Schtirlitz @ Jun 13 2018, 22:50) *
такое ощущение, что где-то такт делится на 4, но где- понять не могу.

Во-первых: STR выполняется 2 такта; во-вторых - с чего Вы решили, что порт GPIO сидит на шине, работающей на частоте ядра?
В-третьих: отладчики в IDE обычно позволяют измерять время выполнения команд.
Go to the top of the page
 
+Quote Post
ataradov
сообщение Jun 13 2018, 20:06
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 004
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



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

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

Сообщение отредактировал ataradov - Jun 13 2018, 20:06
Go to the top of the page
 
+Quote Post
Schtirlitz
сообщение Jun 13 2018, 20:56
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 7-02-06
Из: Москва
Пользователь №: 14 070



Цитата(ataradov @ Jun 13 2018, 23:06) *
Обычный порт за 1 такт никто не обещал, но IOBUS должен работать. Не знаю как у вас объявлен PORTA, но со стандартными заголовками это будет так:

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

Стало в 2 раза быстрее щелкать.. теперь на 2 такта 1 смена уровня порта.
В документации где-то увидел "single cycle GPIO access", вот и решил проверить)
Go to the top of the page
 
+Quote Post
ataradov
сообщение Jun 14 2018, 05:46
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 004
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



QUOTE (Schtirlitz @ Jun 13 2018, 13:56) *
Стало в 2 раза быстрее щелкать.. теперь на 2 такта 1 смена уровня порта.
В документации где-то увидел "single cycle GPIO access", вот и решил проверить)


Это странно должно за 1 такт выполняться. Завтра на работе проверю.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 14 2018, 06:24
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 661
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ataradov @ Jun 14 2018, 08:46) *
Это странно должно за 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.
Go to the top of the page
 
+Quote Post
ataradov
сообщение Jun 14 2018, 06:42
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 004
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



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

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


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

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

Сообщение отредактировал ataradov - Jun 14 2018, 06:50
Go to the top of the page
 
+Quote Post
ataradov
сообщение Jun 14 2018, 16:45
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 004
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



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

Каждый передний фронт 8 MHz выход переключается в противоположенное состояние (результирующая частота переключения 4 MHz).
Go to the top of the page
 
+Quote Post
Schtirlitz
сообщение Jun 14 2018, 19:27
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 7-02-06
Из: Москва
Пользователь №: 14 070



У меня порт дергается с частотой 4 мГц при 16 тактирования.
Похоже всётаки с настройкой GCLK что-то не так.
Проц для меня новый, буду дальше разбираться..


Go to the top of the page
 
+Quote Post
ataradov
сообщение Jun 14 2018, 21:42
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 004
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



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

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

Сообщение отредактировал ataradov - Jun 14 2018, 21:43
Прикрепленные файлы
Прикрепленный файл  samd20_iobus.zip ( 372.96 килобайт ) Кол-во скачиваний: 2
 
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2018 - 11:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.00909 секунд с 7
ELECTRONIX ©2004-2016