Ну ладно, попробую сам изложить результаты своих хождений по граблям. Авось кому-нибудь пригодится. Рассказываю по опыту работы с SAM9XE.
В процессоре есть 2 кеша (I и D) + write buffer. I-кеш - для команд, D - для данных, работает в режиме write back (отложенная запись) и write through (сквозная запись). Write Buffer - небольшой буфер, в который попадают данные при записи, чтобы не держать процессор.
Кеш команд включается независимо от MMU. Кеш данных и write buffer включаются только при включенном MMU.
При работе MMU в простейшем случае логическое адресное пространство 4 гигабайта делится на 4096 секций по 1 мегабайту. Для каждой секции задается физический адрес (тоже с точностью до мегабайта) и аттрибуты кеширования. Секция может быть задана как некешируемая совсем, только write buffer, кеш WT, кеш WB.
Для работы MMU нужна таблица дескрипторов. Ее размер в простейшем случае составляет 16 килобайт.
Маленькая хитрость: нормальное выполнение кода и прерываний из флеша у меня получилось только когда я переадресовал логические адреса 00000000 на физические 00200000.
Режим DMA (работа PDC) никак не учитывает существование кеша. Чтобы добиться нормальной работы PDC нужно либо не включать кеш, либо регулярно чистить кеш и write buffer, либо (предпочтительный метод) создать в адресном пространстве некешируемую секцию (потратив на нее 1 мегабайт) и разместив буфера в этой секции.
У меня получилось работать с PDC и буфером во внешнем ОЗУ (SDRAM).