Настолько давно забросил хардвару, что аж забыл свой аккаунт на коте... Создав новый пришел с поклоном к гуру!
Наткнулся на днях у себя в погребах на когда-то купленные и бережно упакованные AT91SAM7S512 и рассыпуху к ним. Тогда руки не добрались... Сейчас решил помучить зверьков, попробовать-таки великие, как многие говорят, ARMы, да не тут-то было...
Напаял кристалл, припаял кварц с блокировкой, нашаманил RC-PLL, даже на LM317T из USB ему подвел 3.3V. Софт установил!!!
И о чудо! Камень шьется по USB из-под SAM-BA, SAM-PROG, BOSSA, но делать нифига не делает...
Прошу Вашей помощи и поддержки в восстановлении истины и знаний
Код писался под IAR EW for ARM 7.50: попытка подрыгать ногой.
//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 помойка"... Не за такой помощью обращаюсь
По мнению оптимизатора этот код ничего не делает. Предупреждений в таком случае и не бывает, так как компилятор честно считает, что сделал благое дело - ускорил выполнение программы!
Я бы рекомендовал переписать delay так:
Код:
void delay(uint32_t N) { volatile uint32_t k;
for (k=0; k<N; k++) { } }
И мигать я бы рекомендовал не пять раз, а постоянно, прямо в while (1). По крайней мере, для начала.
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
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); }; }
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
YS, попробовал... Увы, результат тот же, PA0 всегда высокий...
Хм.
Тогда вопрос такой: а чтобы порт работал, точно не надо, скажем, включить его тактирование, или типа того?
Я с ARM от Atmel не работал, но вот в STM32, например, вся периферия (и порты тоже) по умолчанию отключена. Чтобы использовать, скажем, порт, надо сначала включить его тактирование в блоке управления тактированием. Может и тут как-то так?
Второе: на эту ножку по умолчанию не замаплена какая-нибудь альтернативная функция? Например, бывает так, что после старта определенные ножки используются под JTAG, скажем, и управление ими недоступно до перенастройки.
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
Все бы хорошо, да нифига. Думаю в сторону негенерирующего кварца, да проверить сейчас его нечем, осцилл с диапазоном over 1 MHz прибудет через пару недель только... Успокаиваю себя тем, что раз по USB шьется, значит и кварц генерит. Или вывод неправильный?
На данный момент, обложившись листингами разными, переписал код так:
Успокаиваю себя тем, что раз по USB шьется, значит и кварц генерит. Или вывод неправильный?
Кто знает... А там есть внутренний генератор (да, каюсь, мне лень читать документацию)? Может быть, попробуйте с ним?
Есть ли startup-файлы, доступные для редактирования? Может быть, стартовый код настраивает контроллер на неработающий/несуществующий источник тактирования?
Цитата:
По моим прикидкам на выводе PA3 должен быть меандр с частотой не выше 500 кГц (48МГц/96 = 500 кГц). Но его там нет...
А попробуйте не меандр, а просто устанавливать ножку в 1/0 и дальше бесконечный цикл. Если МК хоть как-то работает, то после заливания соответствующей прошивки состояние ножки, как вы понимаете, должно меняться.
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
А попробуйте не меандр, а просто устанавливать ножку в 1/0 и дальше бесконечный цикл. Если МК хоть как-то работает, то после заливания соответствующей прошивки состояние ножки, как вы понимаете, должно меняться.
Пробовал в самом начале пути Нет реакции
YS писал(а):
Есть ли startup-файлы, доступные для редактирования?
Вроде как нет, только тот конфиг, что я делаю в main() перед циклом.
YS писал(а):
А там есть внутренний генератор (да, каюсь, мне лень читать документацию)?
Есть, я читал документацию Именно на нем стартует МК и потом по моим настройкам в main() инициализирует PLL и внешний кварц.
YS писал(а):
Может быть, попробуйте с ним?
Сейчас буду репку чесать
YS писал(а):
Может быть, стартовый код настраивает контроллер на неработающий/несуществующий источник тактирования?
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 на выход
Вроде бы с виду все правильно и примитивнее некуда: - включаемся; - запускаем встроенный 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в), тоже никак...
Меандр у меня прошлой ночью таки замеандрил! Вычислил уже только с помощью симулятора в 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 , ну а эту тему можно закрывать
// Предделитель 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, с ним станет жить приятнее. Но я и со своими узкодиапазонниками вижу, что на кварце ничего не происходит...
Если оторвать кварц - по USB проц вообще не определяется. Значит кварц работает.
А не надо для FLASH выставить wait states? Как правило, при работе на частотах выше 16 МГц FLASH сама по себе не успевает выдавать данные, и в контроллерах применяются всякие трюки, чтобы это обойти. Это может быть необходимо включить явно.
Смысл обычно сводится к тому, что контроллер памяти на каждом такте системной шины выдает данные из буфера, а на каждом кратном такте читает данные из памяти. При этом память имеет более широкую шину, чем системная, так что за одно обращение извлекается несколько машинных слов, которые складываются в буфер.
_________________ Разница между теорией и практикой на практике гораздо больше, чем в теории.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения