Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2148 и PLL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
gladov
Имеем камень LPC2148, ревизии А. Кварц 12.000 MHz. Во флеше прошиты бутлоадер второго уровня и собсно код.
Как всегда, первым запускается бут. У него инициализация (в IAR переопределена __low_level_init()) делается так:
Код
    __interwork int __low_level_init(void)
    {
        PLLCON = 0;
        PLLFEED = PLLFEED_DATA1;
        PLLFEED = PLLFEED_DATA2;

        //VPBDivider config
        VPBDIV_bit.VPBDIV = 1;

        // MAM init
        MAMCR_bit.MODECTRL = 0;
        MAMTIM_bit.CYCLES = 1;
        MAMCR_bit.MODECTRL = 2;   // MAM functions fully enabled

        MEMMAP = 1;
  }

В main() он сразу же передает управление в пользовательскую программу, которая слинкована в адреса 0х2000 - 0х7FFFF. И ее таблица векторов прерываний уложена в адрес 0x2000. Вот на него я и передаю управление. Т.е. точкой входа в код является ее родной вектор ресета. Далее мы попадаем в __low_level_init() основного кода, который заводит PLL на 48МГц:
Код
    __interwork int __low_level_init(void)
    {
        //VPBDivider config
        VPBDIV_bit.VPBDIV = 2;

        PLLCFG_bit.MSEL = 3;      // = 1 при 24МГц
        PLLCFG_bit.PSEL = 0x1;   // = 2 при 24МГц
        PLLCON_bit.PLLE = 1;     // Enable PLL

        PLLFEED = PLLFEED_DATA1;
        PLLFEED = PLLFEED_DATA2;

        while (!PLLSTAT_bit.PLOCK); // Wait PLL lock

        PLLCON_bit.PLLC = 1; // Connect PLL
        PLLFEED = PLLFEED_DATA1;
        PLLFEED = PLLFEED_DATA2;

        // MAM init
        MAMCR_bit.MODECTRL = 0;
        MAMTIM_bit.CYCLES = 3;      // = 2 при 24МГц
        MAMCR_bit.MODECTRL = 2;

        MEMMAP = 1;
        return 1;
    }


С точки зрения камня, эта настройка повторная, т.к. ресета не было. Камень вешается вглухую на инсрукциях MAM init. Если вместо них написать еще что-то, то повиснем на этом чем-то. Светодиодами удалось выяснить, что вешается через 1-10 инструкций после записи PLLFEED.
Причем, именно вешается, а не аборт и т.п. (на них висят мои обработчики и они не срабатывают)! JTAG отваливается с падением IAR'a.
При этом если перестроить PLL на 24 мега (я в коде поставил комменты в тех строках, которые меняются при переходе на 24мега) все работает как часы.
Сам основной код без бутлоадера тоже прекрасно заводится на 48МГц и из ОЗУ и из флеша.
Пробовал играться с MAM - толку нет совсем. Errata тоже молчит на эту тему sad.gif

Напоминает ситуацию, описанную тут. Там как раз упоминается нечетный CCO divider. У меня и получается что при 48МГц P=1, а при 24 P=2. Ну точнее в регистры пишется 1 и 2, а само деление производится на 2 или 4 соответственно.

PS: Если из первой инициализации вообще убрать строки с PLL (ибо он и так после ресета должен быть выключен), то ничего не меняется.
Никто с такой бедой не сталкивался?
GetSmart
Проц начинает работать на 48 (?) МГц когда у него MAMTIM_bit.CYCLES = 1. Это НЕПРАВИЛЬНО. Прежде чем переключаться на высокую частоту PLL нужно СПЕРВА менять MAMTIM_bit.CYCLES, а уж потом переключать PLL. При переключении на низкую частоту наоборот, сначала PLL, а затем MAMTIM_bit.CYCLES.
gladov
Цитата(GetSmart @ Oct 18 2010, 01:21) *
Проц начинает работать на 48 (?) МГц когда у него MAMTIM_bit.CYCLES = 1. Это НЕПРАВИЛЬНО. Прежде чем переключаться на высокую частоту PLL нужно СПЕРВА менять MAMTIM_bit.CYCLES, а уж потом переключать PLL. При переключении на низкую частоту наоборот, сначала PLL, а затем MAMTIM_bit.CYCLES.


А ведь и правда вчера недосмотрел! Пробовал вообще МАМ отключать во второй инициализации, а про первую я и забыл совсем. А там как раз стоит
Код
MAMTIM_bit.CYCLES = 1;
MAMCR_bit.MODECTRL = 2;   // MAM functions fully enabled


Спасибо, beer.gif а то вчера вообще голова уже не соображала. Сейчас попробую исправить, но уверен, что все пойдет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.