|
|
  |
ATSAMD20G17 новый проц-новые глюки |
|
|
|
Jun 13 2018, 18:43
|

Участник

Группа: Участник
Сообщений: 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 выдаются такие как я и задал. Что я делаю не так?
|
|
|
|
|
Jun 13 2018, 19:50
|

Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 13 2018, 20:56
|

Участник

Группа: Участник
Сообщений: 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", вот и решил проверить)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|