В качестве эксперемента посмотречть че будет если выставил для ФАПЧ множитель 7 и делитель 1. Получается частота тактирования ядра и переферии 103.219Мгц при кварце 14.7456МГц. При работе из флеша сразу ессесено возникает Page Abort Exeption, а вот при работе из паямяти все чудно рабоет, без збоевэ, в качестве теста зациклил переключение вывода порта - осцилограф мерит частотц 29,54Мгц
кусок кода
Код
#define FastIOMeandr(fiomask) \
{\
int fiomask = _BV(4);\
int fiopin_addr = FIOPIN_ADDR;\
__asm__ ("\
mov r0 , #0x01; /*установка SCS=1*/ \
str r0 , %0 ; \
ldr r0 , %3 ; /*установка FIODIR = ~fiomask*/\
str r0 , %1 ; \
ldr r0 , %3 ; /*установка FIOMASK = fiomask */\
mvn r0 , r0 ; \
str r0 , %2 ; \
ldr r1 , %4 ; /*загрузка адреса FIOPIN*/\
ldr r0 , %3 ; \
mov r2 , #0x0 ; \
Lab: \
str r0 , [r1]; str r2 , [r1]; str r0 , [r1];str r2 , [r1]; str r0 , [r1]; str r2 , [r1]; \
str r0 , [r1]; str r2 , [r1]; str r0 , [r1];str r2 , [r1]; str r0 , [r1]; str r2 , [r1]; \
..... очень много раз эти пары строк....
str r0 , [r1]; str r2 , [r1]; str r0 , [r1];str r2 , [r1]; str r0 , [r1]; str r2 , [r1]; \
str r0 , [r1]; str r2 , [r1]; str r0 , [r1];str r2 , [r1]; str r0 , [r1]; str r2 , [r1]; \
b Lab; "\
: \
: "m"(SCS) , "m"(FIODIR) , "m"(FIOMASK) , "m"(fiomask) , "m"(fiopin_addr)\
: "r0" , "r1" , "r2"\
); \
Чето цифры не сходятся, если предположить что тратится по одному такту на инструкцию, частота переключения должна быть ~51Мгц (APBDIV выставлен равным 1-без деления частоты AHB), прчем 103.219 даже близко нацело не делится на 29,54.
Почему так?
Эксперементы с разгоном могут привести к неприятностям?