Форум РадиоКот https://radiokot.ru/forum/ |
|
Вспомним старое доброе (ARM7) https://radiokot.ru/forum/viewtopic.php?f=22&t=148463 |
Страница 1 из 2 |
Автор: | L_VL [ Вт сен 19, 2017 22:27:34 ] |
Заголовок сообщения: | Вспомним старое доброе (ARM7) |
Всем привет, коты! Настолько давно забросил хардвару, что аж забыл свой аккаунт на коте... Создав новый пришел с поклоном к гуру! Наткнулся на днях у себя в погребах на когда-то купленные и бережно упакованные AT91SAM7S512 и рассыпуху к ним. Тогда руки не добрались... Сейчас решил помучить зверьков, попробовать-таки великие, как многие говорят, ARMы, да не тут-то было... Напаял кристалл, припаял кварц с блокировкой, нашаманил RC-PLL, даже на LM317T из USB ему подвел 3.3V. Софт установил!!! И о чудо! Камень шьется по USB из-под SAM-BA, SAM-PROG, BOSSA, но делать нифига не делает... Прошу Вашей помощи и поддержки в восстановлении истины и знаний Код писался под IAR EW for ARM 7.50: попытка подрыгать ногой. Код: #include <Atmel\ioat91sam7s512.h> #include <stdio.h> AT91PS_PIO m_pPio = AT91C_BASE_PIOA; //it's a simple delay void Delay (unsigned long a) { while (--a!=0); } int main(void) { // Configure led m_pPio->PIO_SODR = AT91C_PIO_PA0; // Set PA18 to HIGH -> led off m_pPio->PIO_OER = AT91C_PIO_PA0; // Configure PA8 as output unsigned long i; for(i = 0; i < 5; i++) { m_pPio->PIO_CODR = AT91C_PIO_PA0; Delay(55000); m_pPio->PIO_SODR = AT91C_PIO_PA0; Delay(55000); } // Main loop while (1); } Очень прошу лапами не бить, на дверь не указывать со словами "Нашел старье..." или "Atmel помойка"... Не за такой помощью обращаюсь |
Автор: | smalcom [ Ср сен 20, 2017 15:39:31 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Код: но делать нифига не делает... "ничо не работает" - это фраза из бухгалтерии. Код: Delay(55000); Почти со стопроцентной вероятностью компилятор это выкинет. и наконец Код: while (1); тут обычно люая вычислительная система ничего не делает. |
Автор: | L_VL [ Ср сен 20, 2017 15:52:11 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Код: но делать нифига не делает... "ничо не работает" - это фраза из бухгалтерии. Ага, только он работает, но ничего не делает Код: Delay(55000); Почти со стопроцентной вероятностью компилятор это выкинет. За что? Да и не выкинул даже warning'ов и наконец Код: while (1); тут обычно люая вычислительная система ничего не делает. Да, только перед тем при старте должно 5 раз аж поморгать в цикле... Пока никаких продвижений |
Автор: | YS [ Вс сен 24, 2017 19:00:17 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Цитата: За что? Да и не выкинул даже warning'ов По мнению оптимизатора этот код ничего не делает. Предупреждений в таком случае и не бывает, так как компилятор честно считает, что сделал благое дело - ускорил выполнение программы! Я бы рекомендовал переписать delay так: Код: void delay(uint32_t N) { volatile uint32_t k; for (k=0; k<N; k++) { } } И мигать я бы рекомендовал не пять раз, а постоянно, прямо в while (1). По крайней мере, для начала. |
Автор: | L_VL [ Вс сен 24, 2017 19:56:36 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
YS, попробовал... Увы, результат тот же, PA0 всегда высокий... Код: #include <Atmel\sam7s\AT91SAM7S512.h> #include <stdio.h> #include <stdint.h> AT91PS_PIO m_pPio = AT91C_BASE_PIOA; //it's a simple delay void Delay(uint32_t N) { volatile uint32_t k; for (k=0; k<N; k++) { } } int main(void) { // Configure led m_pPio->PIO_SODR = AT91C_PIO_PA0; // Set PA18 to HIGH -> led off m_pPio->PIO_OER = AT91C_PIO_PA0; // Configure PA8 as output // Main loop while (1){ m_pPio->PIO_CODR = AT91C_PIO_PA0; Delay(55000); m_pPio->PIO_SODR = AT91C_PIO_PA0; Delay(55000); }; } Как-то с Мегами таких проблем с запуском не было |
Автор: | abc [ Вс сен 24, 2017 22:04:55 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Вообще, такая тема уже есть - пишите апологетам, они там мигают даже лампочками на утюгах. viewtopic.php?f=62&t=105290 |
Автор: | YS [ Вс сен 24, 2017 22:24:01 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Цитата: YS, попробовал... Увы, результат тот же, PA0 всегда высокий... Хм. Тогда вопрос такой: а чтобы порт работал, точно не надо, скажем, включить его тактирование, или типа того? Я с ARM от Atmel не работал, но вот в STM32, например, вся периферия (и порты тоже) по умолчанию отключена. Чтобы использовать, скажем, порт, надо сначала включить его тактирование в блоке управления тактированием. Может и тут как-то так? Второе: на эту ножку по умолчанию не замаплена какая-нибудь альтернативная функция? Например, бывает так, что после старта определенные ножки используются под JTAG, скажем, и управление ими недоступно до перенастройки. |
Автор: | L_VL [ Пн сен 25, 2017 19:06:42 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
abc писал(а): а чтобы порт работал, точно не надо, скажем, включить его тактирование, или типа того? Ну в целом наверное надо, про такое я читал Увы, литературы толковой не нашел, пришлось нахлебываться тем, что есть в интернетах Вечером обязательно попробую Добавлено after 8 hours 45 minutes 22 seconds: Итак, эксперименты проведены Код: #include <Atmel\sam7s\AT91SAM7S512.h> #include <stdio.h> #include <stdint.h> //it's a simple delay void Delay(uint32_t N) { volatile uint32_t k; for (k=0; k<N; k++) {} } int main(void) { // Определяем указатели на структуры питания, сброса, порта PIOA AT91PS_PMC pPMC = AT91C_BASE_PMC; AT91PS_RSTC m_pRSTC = AT91C_BASE_RSTC; AT91PS_PIO m_pPio = AT91C_BASE_PIOA; // Настраиваем сброс по RST m_pRSTC->RSTC_RCR = 0xA5000008; m_pRSTC->RSTC_RMR = 0xA5000001; Delay(1000); // Настройка контроллера Flash AT91C_BASE_MC->MC0_FMR = ((AT91C_MC_FMCN)&(48 <<16)) | AT91C_MC_FWS_1FWS ; // Запрет WatchDog'а AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // Генератор - внешний кварц + PLL pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN )); while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS)); // Настройка PLL pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x05) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (25<<16))); while(!(pPMC->PMC_SR & AT91C_PMC_LOCK)); while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); // Коэффициент деления для PLL = 2 pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK; while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); // Настройка порта PA m_pPio->PIO_PER = 1 << AT91C_PIO_PA3; // Разрешить работу пина m_pPio->PIO_OER = 1 << AT91C_PIO_PA3; // Установить пин PA0 на выход pPMC->PMC_PCER = 1 << AT91C_ID_PIOA; // Включить тактирование порта m_pPio->PIO_CODR = 1 << AT91C_PIO_PA3; // Очистить бит пина (PA0 = 0) // Main loop while (1){ m_pPio->PIO_CODR = AT91C_PIO_PA3; Delay(55000); m_pPio->PIO_SODR = AT91C_PIO_PA3; Delay(55000); }; } Специально взял пин PA3, у него только одна функция доступна - пин ввода-вывода. Результат тот же - нифига! |
Автор: | L_VL [ Вт сен 26, 2017 20:01:05 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
В рамках продолжения эксперимента был заземлен корпус кварца. Блокировочные емкости поставлены 10 пФ. Менялся сам контроллер. Результат - нулевой... |
Автор: | YS [ Вт сен 26, 2017 21:04:53 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Мне все же кажется, что вы что-то не включили на программном уровне. Кстати, у этого МК нет ли случаем специальных ножек (опять же, как у STM32), которые выбирают, откуда он будет загружать программу (FLASH/RAM/etc)? |
Автор: | smalcom [ Вт сен 26, 2017 21:40:57 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
http://electronix.ru/forum/index.php?ac ... t&id=20707 |
Автор: | L_VL [ Ср сен 27, 2017 18:15:36 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Все бы хорошо, да нифига. Думаю в сторону негенерирующего кварца, да проверить сейчас его нечем, осцилл с диапазоном over 1 MHz прибудет через пару недель только... Успокаиваю себя тем, что раз по USB шьется, значит и кварц генерит. Или вывод неправильный? На данный момент, обложившись листингами разными, переписал код так: Код: #include <Atmel\sam7s\AT91SAM7S512.h> #include <stdio.h> #include <stdint.h> //it's a simple delay void Delay(uint32_t N) { volatile uint32_t k; for (k=0; k<N; k++) {} } int main(void) { // Определяем указатели на структуры питания, сброса, порта PIOA AT91PS_PMC pPMC = AT91C_BASE_PMC; AT91PS_PIO m_pPio = AT91C_BASE_PIOA; AT91C_BASE_MC->MC0_FMR = AT91C_MC_FWS_1FWS ; pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x40 <<8) | AT91C_CKGR_MOSCEN )); while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS)); pPMC->PMC_PLLR = AT91C_CKGR_USBDIV_1|(16<<8) | (AT91C_CKGR_MUL & (72<<16)) | (AT91C_CKGR_DIV & 14); while(!(pPMC->PMC_SR & AT91C_PMC_LOCK)); while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK; while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA) ; //Включаем тактировние AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, AT91C_PIO_PA1) ; //Конфигурируем порт на выход AT91F_PIO_SetOutput( AT91C_BASE_PIOA, AT91C_PIO_PA1); //Включаем вывод // Main loop while (1){ m_pPio->PIO_CODR = AT91C_PIO_PA3; Delay(96); m_pPio->PIO_SODR = AT91C_PIO_PA3; Delay(96); }; } По моим прикидкам на выводе PA3 должен быть меандр с частотой не выше 500 кГц (48МГц/96 = 500 кГц). Но его там нет... Чтение флэша каждый раз подтверждает то, что было в него записано... |
Автор: | YS [ Ср сен 27, 2017 19:14:42 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Цитата: Успокаиваю себя тем, что раз по USB шьется, значит и кварц генерит. Или вывод неправильный? Кто знает... А там есть внутренний генератор (да, каюсь, мне лень читать документацию)? Может быть, попробуйте с ним? Есть ли startup-файлы, доступные для редактирования? Может быть, стартовый код настраивает контроллер на неработающий/несуществующий источник тактирования? Цитата: По моим прикидкам на выводе PA3 должен быть меандр с частотой не выше 500 кГц (48МГц/96 = 500 кГц). Но его там нет... А попробуйте не меандр, а просто устанавливать ножку в 1/0 и дальше бесконечный цикл. Если МК хоть как-то работает, то после заливания соответствующей прошивки состояние ножки, как вы понимаете, должно меняться. |
Автор: | L_VL [ Ср сен 27, 2017 19:20:35 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
YS писал(а): А попробуйте не меандр, а просто устанавливать ножку в 1/0 и дальше бесконечный цикл. Если МК хоть как-то работает, то после заливания соответствующей прошивки состояние ножки, как вы понимаете, должно меняться. Пробовал в самом начале пути Нет реакции YS писал(а): Есть ли startup-файлы, доступные для редактирования? Вроде как нет, только тот конфиг, что я делаю в main() перед циклом. YS писал(а): А там есть внутренний генератор (да, каюсь, мне лень читать документацию)? Есть, я читал документацию Именно на нем стартует МК и потом по моим настройкам в main() инициализирует PLL и внешний кварц. YS писал(а): Может быть, попробуйте с ним? Сейчас буду репку чесать YS писал(а): Может быть, стартовый код настраивает контроллер на неработающий/несуществующий источник тактирования? Неработающий еще куда ни шло, но несуществующий |
Автор: | YS [ Ср сен 27, 2017 20:20:32 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Цитата: Неработающий еще куда ни шло, но несуществующий Не, ну и такое тоже бывает, да. |
Автор: | L_VL [ Чт сен 28, 2017 20:30:55 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Всем добрый вечер! Итак, до чего я добрался, пока курил доку и читал Редькина... Код: #include <Atmel\sam7s\AT91SAM7S512.h> int main(void) { AT91PS_PMC pPMC = AT91C_BASE_PMC; AT91PS_PIO m_pPio = AT91C_BASE_PIOA; // Настроить внутренний RC-генератор pPMC->PMC_MCKR |= AT91C_PMC_CSS_SLOW_CLK; // Дождаться стабилизации частоты while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); pPMC->PMC_PCER = 1 << AT91C_ID_PIOA; // Включить тактирование порта m_pPio->PIO_PER = 1 << AT91C_PIO_PA3; // Использовать PA3 как линию ввода-вывода m_pPio->PIO_OER = 1 << AT91C_PIO_PA3; // Установить пин PA0 на выход m_pPio->PIO_CODR = 1 << AT91C_PIO_PA3; // Очистить бит пина (PA3 = 0) while (1){ }; } Вроде бы с виду все правильно и примитивнее некуда: - включаемся; - запускаем встроенный RC-генератор на 32 кГц; - включаем порт ВВ; - ставим "вечный" 0 на выводе 3. Вот только на выводе PA3 постоянно 1!!! Пробовал даже в инициализации отключить подтяжку ножки порта к питанию Код: pPMC->PMC_PCER = 1 << AT91C_ID_PIOA; // Включить тактирование порта m_pPio->PIO_PER = 1 << AT91C_PIO_PA3; // Разрешить работу пина m_pPio->PIO_PPUDR = 1 << AT91C_PIO_PA3; // Отключаем подтяжку m_pPio->PIO_OER = 1 << AT91C_PIO_PA3; // Установить пин PA0 на выход Но безрезультатно... На ножке всегда 1... Добавил емкостей по линии VDD_CORE (1.8в), тоже никак... Я в растерянности окончательно |
Автор: | L_VL [ Пт сен 29, 2017 17:46:23 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Друзья! Коллеги! Всем спасибо за оказанное содействие! Отдельная благодарность YS! Меандр у меня прошлой ночью таки замеандрил! Вычислил уже только с помощью симулятора в IAR. Код Код: pPMC->PMC_PCER = 1 << AT91C_ID_PIOA; // Включить тактирование порта m_pPio->PIO_PER = 1 << AT91C_PIO_PA3; // Использовать PA3 как линию ввода-вывода m_pPio->PIO_OER = 1 << AT91C_PIO_PA3; // Установить пин PA0 на выход Оказался не совсем корректным, потому что в Atmel\sam7s\AT91SAM7S512.h записан define Код: #define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 И на выходе я получал не <<, а << (<<) то есть вместо PA3 я попадал в PA6! Вот такой конфуз Но попутно поначитался про архитектуру, про настройку периферии и ЗГ, так что опыт не совсем пустой Пойду играться с генератором и PLL , ну а эту тему можно закрывать |
Автор: | YS [ Пт сен 29, 2017 18:08:48 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Цитата: Меандр у меня прошлой ночью таки замеандрил! ЫЫЫ!!! Цитата: Отдельная благодарность YS! Не за что, всегда рад помочь! |
Автор: | L_VL [ Ср окт 04, 2017 22:56:45 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Хэхэй! Эт снова я Всем привет У меня, вообщем, опять траблы с этим чудом На внутреннем RC-генераторе все работает зачетно и стабильно, а вот с запуском внешнего никак ничего не выходит Пробовал запускаться от самого кварца на 18,432 МГц: Код: // Время запуска кварца и включение самого кварца pPMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0xFF << 8)) | AT91C_CKGR_MOSCEN); while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS)); // Выбор источника тактирования CSS_MAIN без предделителя pPMC->PMC_MCKR = (AT91C_PMC_PRES_CLK | AT91C_PMC_CSS_MAIN_CLK); while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); На кварце тишина, код не исполняется. Пробовал на кварце с PLL: Код: // Настройка циклов флэш-контроллера AT91C_BASE_MC->MC0_FMR = ((AT91C_MC_FMCN & 48) | AT91C_MC_FWS_1FWS); // Отключение сторожевого таймера AT91C_BASE_WDTC -> WDTC_WDMR = AT91C_WDTC_WDDIS; // Настройка тайминга запуска и запуск кварца pPMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & 0x06) | AT91C_CKGR_MOSCEN); while(!(pPMC -> PMC_SR & AT91C_PMC_MOSCS)); // Настройка множителей и таймингов ФАПЧ pPMC -> PMC_PLLR = ((AT91C_CKGR_DIV & 0x05) | (AT91C_CKGR_PLLCOUNT & 28) | (AT91C_CKGR_MUL & 25)); while(!(pPMC->PMC_SR & AT91C_PMC_LOCK)); while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); // Предделитель 2 (т.к. PLL на 96 МГц, а для проца и USB требуется 48) pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; while(!(pPMC -> PMC_SR & AT91C_PMC_MCKRDY)); // Выбор сигнала тактирования - PLL pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK; while(!(pPMC -> PMC_SR & AT91C_PMC_MCKRDY)); И снова ничего Иными словами кварц не запускается. Кварц менял, емкости подключал/отключал, корпус кварца заземлял. Грешил, было, на проц, но... Если оторвать кварц - по USB проц вообще не определяется. Значит кварц работает. Если оторвать PLL - проц так же не определяется. Значит и PLL работает. Никто не подскажет, что за грабли? Пы.Сы. Все жду осцилл с диапазоном over100mhz, с ним станет жить приятнее. Но я и со своими узкодиапазонниками вижу, что на кварце ничего не происходит... |
Автор: | YS [ Чт окт 05, 2017 10:22:11 ] |
Заголовок сообщения: | Re: Вспомним старое доброе (ARM7) |
Цитата: Если оторвать кварц - по USB проц вообще не определяется. Значит кварц работает. А не надо для FLASH выставить wait states? Как правило, при работе на частотах выше 16 МГц FLASH сама по себе не успевает выдавать данные, и в контроллерах применяются всякие трюки, чтобы это обойти. Это может быть необходимо включить явно. Смысл обычно сводится к тому, что контроллер памяти на каждом такте системной шины выдает данные из буфера, а на каждом кратном такте читает данные из памяти. При этом память имеет более широкую шину, чем системная, так что за одно обращение извлекается несколько машинных слов, которые складываются в буфер. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |