Код: Выделить всё
; Для микроконтроллера AT91SAM9G45 выполняются следующие действия:
;
; - включается кэш-память инструкций;
; - производится переход на систему команд Thumb;
; - запрещается работа сторожевого таймера;
; - в качестве источника синхронизации выбирается главный генератор частотой
; 12 МГц (MAINCK; микроконтроллер спроектирован в расчёте именно на эту часто-
; ту внешнего кварцевого резонатора);
; - на выходе PLLA устанавливается частота 400 МГц (PLLACK);
; - частота процессора (PCK) устанавливается равной частоте PLLA, т.е. 400 МГц;
; - главная частота периферийных контроллеров (MCK) устанавливается равной трети
; частоты PLLA, т.е. 133 МГц;
; - выполняется настройка линий ввода-вывода, на этапе генерации отведённых под
; определённые применения;
; - настраивается матрица межсоединений;
; - на заданные периферийные контроллеры подаётся синхронизация.
MACRO
CPU_INIT
; Включение кэша инструкций.
mrc p15, 0, R1, c1, c0, 0
orr R1, R1, #0x00001000
mcr p15, 0, R1, c1, c0, 0
; Переход на систему команд Thumb.
blx %F10
THUMB
; Запрет сторожевого таймера.
10 ldr R0, =BASE_WDT
movs R1, #1
lsls R1, #p_WDT_MR_WDDIS
str R1, [R0, #WDT_MR]
; Переход на низкоскоростной генератор, чтобы настроить PLL.
ldr R4, =BASE_PMC
ldr R5, [R4, #PMC_MCKR]
movs R1, #m_PMC_MCKR_CSS
bics R5, R1
str R5, [R4, #PMC_MCKR]
20 ldr R2, [R4, #PMC_SR]
lsrs R2, #p_PMC_INTR_MCKRDY + 1
bcc %B20
; Запуск главного генератора и ожидание его готовности. На его раскачку
; требуется не более 2 мс, т.е. примерно 66,5 низкочастотных циклов.
ldr R0, =(9 << p_CKGR_MOR_OSCOUNT) + (1 << p_CKGR_MOR_MOSCEN)
str R0, [R4, #CKGR_MOR]
30 ldr R0, [R4, #PMC_SR]
lsrs R0, #p_PMC_INTR_MOSCS + 1
bcc %B30
; Запуск PLLA и ожидание её готовности. На запуск схемы ФАПЧ требуется
; не более 50 мкс, т.е. менее двух низкочастотных циклов. Для получения
; выходной частоты 400 МГц входная частота (12 МГц) делится на 3 и умно-
; жается на 100.
movs R0, #1 << p_PMC_PLLICPR_ICPLLA
adds R7, R4, #4
str R0, [R7, #PMC_PLLICPR - 4]
ldr R0, =(1 << p_CKGR_PLLAR_ALWAYS_1) + \
(99 << p_CKGR_PLLAR_MULA) + \
(3 << p_CKGR_PLLAR_OUTA) + \
(2 << p_CKGR_PLLAR_PLLACOUNT) + \
(3 << p_CKGR_PLLAR_DIVA)
str R0, [R4, #CKGR_PLLAR]
40 ldr R0, [R4, #PMC_SR]
lsrs R0, #p_PMC_INTR_LOCKA + 1
bcc %B40
; Выбор источника частоты процессора и периферийных устройств. Таковой
; будет частота, вырабатываемая PLLA, т.е. 400 МГц. Одновременное изме-
; нение значений полей MDIV и CSS недопустимо, поэтому настройка источ-
; ника синхронизации и делителей производится в два этапа.
ldr R5, =(PMC_MCKR_PLLADIV2_OFF << p_PMC_MCKR_PLLADIV2) + \
(PMC_MCKR_MDIV_3 << p_PMC_MCKR_MDIV) + \
(PMC_MCKR_PRES_1 << p_PMC_MCKR_PRES)
str R5, [R4, #PMC_MCKR]
50 ldr R2, [R4, #PMC_SR]
lsrs R2, #p_PMC_INTR_MCKRDY + 1
bcc %B50
movs R2, #PMC_MCKR_CSS_PLLA << p_PMC_MCKR_CSS
orrs R5, R2
str R5, [R4, #PMC_MCKR]
60 ldr R1, [R4, #PMC_SR]
lsrs R1, #p_PMC_INTR_MCKRDY + 1
bcc %B60
; Включение синхронизации периферийных контроллеров.
movs R0, #0
mvns R0, R0
str R0, [R4, #PMC_PCDR]
str R0, [R4, #PMC_SCDR]
ldr R0, =IO_PMC_PCER
str R0, [R4, #PMC_PCER]
ldr R0, =IO_PMC_SCER
str R0, [R4, #PMC_SCER]