Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с внешним кварцем ATSAM4SD32C
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Грендайзер
Всем доброго времени суток. Пытаю отладочную плату SAM4S-EK2 на базе контроллера ATSAM4SD32C. Пытаюсь заставить микросхему тактироваться от внешнего кварца 12МГц. Делаю всё как указано в даташите. Сначала перевожу процессор на тактирование от низкочастотного внутреннего генератора:
PMC -> PMC_MCKR = PMC_MCKR_CSS_SLOW_CLK;
Тут всё работает, процессор действительно начинает медленно работать. Далее запускаю кварцевй генератор:
PMC -> CKGR_MOR = CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCRCF_12_MHz| CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCXTST_Msk | CKGR_MOR_KEY_PASSWD;
При этом если разбить данную строчку на 2, т.е.:
PMC -> CKGR_MOR = CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCRCF_12_MHz| CKGR_MOR_KEY_PASSWD;
PMC -> CKGR_MOR = CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCXTST_Msk | CKGR_MOR_KEY_PASSWD;
то выскакивает ошибка о которой скажу ниже.
И так, кварцевый генератор запускается (смотрю осциллографом на резонаторе, есть генерация).
Далее жду некоторое время:
for(int i = 0; i < 10000; i++)
{}
Далее ставлю кварцевый генератор, как основной и переключаюсь с низкочастотного генератора на кварцевый:
PMC -> CKGR_MOR = CKGR_MOR_MOSCSEL | CKGR_MOR_KEY_PASSWD;
PMC -> PMC_MCKR = PMC_MCKR_CSS_MAIN_CLK;
Компилю... Всё норм... но после прошивки ничего не происходит, а при повторной попытке прошить выскакивает ошибка, как на картинке. Единственный способ перепрошить - притянуть ногу ERASE к 0 и затем передёрнуть питание. Есть подозрения на программатор Atmel-ICE. 3 дня уже убил, всё перепробовал.
DmitryM
Цитата(Грендайзер @ Feb 18 2015, 10:49) *
Всем доброго времени суток. Пытаю отладочную плату SAM4S-EK2 на базе контроллера ATSAM4SD32C. Пытаюсь заставить микросхему тактироваться от внешнего кварца 12МГц.

#define SYS_BOARD_OSCOUNT (CKGR_MOR_MOSCXTST(0x8U))
#define SYS_CKGR_MOR_KEY_VALUE CKGR_MOR_KEY(0x37) /* Key to unlock MOR register */

/* Initialize main oscillator */
if (!(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL)) {
PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD | SYS_BOARD_OSCOUNT |
CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN;
uint32_t timeout = 0xFFFF;
while (!(PMC->PMC_SR & PMC_SR_MOSCXTS) && --timeout) {
}
}

/* Switch to 3-20MHz Xtal oscillator */
PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD | SYS_BOARD_OSCOUNT |
CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL;
uint32_t timeout = 0xFFFF;
while (!(PMC->PMC_SR & PMC_SR_MOSCSELS) && --timeout) {
}
PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) |
PMC_MCKR_CSS_MAIN_CLK;
uint32_t timeout = 0xFFFF;
while (!(PMC->PMC_SR & PMC_SR_MCKRDY) && --timeout) {
}

Цитата
Далее жду некоторое время:
for(int i = 0; i < 10000; i++)
{}

Так делать нежелательно. Нужно дожидаться выставления флагов в статусном регистре.
Грендайзер
DmitryM, большое спасибо, вроде заработало! cheers.gif 3 дня блин... blink.gif
Не могли бы Вы ещё несколько вопросо просветить:
1) По коду:
PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) |PMC_MCKR_CSS_MAIN_CLK;
можно прокомментировать эту строку?
2) Из-за чего происходила ошибка?
3) И последний, как отработать прерывания в данной микросхеме? Т.е. в AVR я помню когда писал на ассемблере, задавал вектор прерываний, тем самым указывая процессору, какую подпрограмму надо выполнять если произошло именно это прерывание, когда писал на C использовал ф-ции из ToolChein'а но помню с этими ф-циями были какие то проблемы. Вот и сейчас использовать ф-ции которые Atmel предлагает - опять гадать в чём проблема. Тем более недавно пытался такой пользоваться, так выскочела та же ошибка...
DmitryM
Цитата(Грендайзер @ Feb 18 2015, 12:11) *
Не могли бы Вы ещё несколько вопросо просветить:
1) По коду:
PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) |PMC_MCKR_CSS_MAIN_CLK;

Обратите внимание, что MCKR Read/Write. Т.е. очистка поля CSS и задание CSS_MAIn_CLOCK без изменения остальных полей.
Цитата
2) Из-за чего происходила ошибка?

Возможно, переключение на нестабилизированный генератор. Разбираться надо подробнее.
Цитата
3) И последний, как отработать прерывания в данной микросхеме? Т.е. в AVR я помню когда писал на ассемблере...

Примерно как в AVR.
Например, прерывание от USART0.

void USART0_Handler( void )
{
...
}

Дополнительная настройка:

NVIC_SetPriority(USART0_IRQn, 6);
NVIC_EnableIRQ(USART0_IRQn);
USART0->US_IER = US_IER_RXRDY;

Весь перечень доступных ХХХ_Handler для данного кристала описан в startup_sam4s.c
Грендайзер
Большое спасибо за помощь. Теперь всё ясно! sm.gif
Грендайзер
Здравствуйте, снова появился вопрос. Заметил данную проблемку достаточно давно, но не придавал значение, а вот теперь не пойму в чём дело..
Написал вот такую программку:
Код
PIOA -> PIO_PER = PIO_PER_P19;        // 1: Отключаю переферию
PIOA -> PIO_PER = PIO_PER_P20;        // 1: Отключаю переферию
PIOC -> PIO_PER = PIO_PER_P20;        // 1: Отключаю переферию

while(!((PIOA -> PIO_PSR & (PIO_PSR_P19 | PIO_PSR_P20)) && (PIOC -> PIO_PSR & PIO_PSR_P20)))
{}
                
PIOA -> PIO_OER = PIO_OER_P19;        // 1: PIOA19 -> Input
PIOA -> PIO_OER = PIO_OER_P20;        // 1: PIOA20 -> Input
PIOC -> PIO_OER = PIO_OER_P20;        // 1: PIOC20 -> Input
                
while(!((PIOA -> PIO_OSR & (PIO_OSR_P19 | PIO_OSR_P20)) && (PIOC -> PIO_OSR & PIO_OSR_P20)))
{}

PIOA -> PIO_SODR = PIO_CODR_P19 | PIO_CODR_P20;    // 1: PIOA19,20 -> '1'
PIOC -> PIO_СODR = PIO_SODR_P20;    // 1: PIOС20 -> '0'                                                
                
    while (1)
    {}
}


На ноги порта А (P19, P20) выдаётся 1, а порта С (P20) - 0. К данным ножкам подключены светодиоды. К порту А через резисторы, а ножка PC20 управляет затвором ключика, который и управляет диодом. Т.о. Если на ножках PIOA19,20 единицы - светодиоды не горят, а светодиод которым управляет ключик не горит, когда на затворе 0. Всё вроде бы нормально, диоды PIOA19,20 - погашены, а вот PIOC20 - раз в 15...20 сек. загорается. Проверил импульс на затворе осциллографоом, и впрямь, переодически ножка PIOC20 генерит импульс, при том, дочтаточной длительности, что бы его можно было заметить. В чём дело?
aaarrr
Может, watchdog срабатывает с такой периодичностью?
Грендайзер
aaarrr, только что отключил watchdog и... действительно маргание исчезло blink.gif Большое спасибо за подсказку. С этими армами беда какая то... никак не получается всё сразу понять sad.gif
Грендайзер
Снова здравствуйте, возник очередной вопрос, правда не совсем по ARMам, но вот не знаю куда лучше написать. Продолжая работать с ATsam4sd32c решил начать разбираться с АЦП и ЦАП (до этого с АЦП и ЦАП почти не работал, не было необходимости). Ну вот начал читать в даташите (Electrical Characteristics) характеристики АЦП. Нашёл табличку (на картинке). Никак не пойму... как я понял частота тактирования АЦП (fADC) может лежать в пределах от 1 до 22МГц. Так же я увидел такую строчку Sampling Frequency (fS), этот параметр лежит в интервале от 0,05МГц до 1МГц. Но что он значит? Sample - это насколько я помню выборка. Почему она измеряется в мегагерцах? Никак не могу понять, сигнал с какой максимальной частотой я могу оцифровать?
Aleksandr Baranov
22MHZ - это тактовая частота. Как сказано в строчке 6, на преобразование требуется 20 импульсов тактовой частоты. Видимо, какое-то небольшое время еще нужно на выборку.
Golikov A.
Частота измеряется в герцах, любая, даже семплирования. То есть когда пишут 20 мегосемплов, это имеют мегосемплов в секунду, то есть 20 МГц. Так что никаких противоречий я не вижу.

Также из таблички частота с которой надо тактировать АЦП может быть от 1 до 22 МГц, время одно преобразования 20 тактов,
22 МГц/20 = 1.1 МГц - вот максимальная частота выборок
то есть 1.1 Мегасемплов в секунду.
так же можете получить нижнюю границу.

А отцифровать вы можете сигнал до половины частоты дискретизации, с условием правильной фильтрации и желанием полного востановления формы сигнала по теореме котельникова, кажется...
Грендайзер
Цитата
Видимо, какое-то небольшое время еще нужно на выборку.

Да, совершенно точно, в описании на АЦП сказано, что ему надо сколько то тактов на взятие отсчёта + 10 тактов.
Цитата
22 МГц/20 = 1.1 МГц - вот максимальная частота выборок

Всё, теперь понял. Я упустил из вида такой параметр, как скорость преобразования и думал что преобразование происходит по фронтам синхросигнала. Частота семплирования это - частота, с которой я реально могу оцифровать сигнал... соответственно частота оцифровываемого сигнала не должна превышать fs/2. Aleksandr Baranov, Golikov A., спасибо за раъяснения.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.