реклама на сайте
подробности

 
 
> Прерывания, Хелп
Muxamor
сообщение Feb 21 2007, 09:00
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 289
Регистрация: 4-05-05
Из: Novosibirsk
Пользователь №: 4 722



Понадобилось прерывание от UART0 и всплыла следующая проблема, так как у меня программа записывается не с начало внутренней флэшки а с адреса 40002000 из за этого не правильно обрабатывается прерывание. Если писать прогу с начало тоесть с адреса 40000000 то все отлично работает.
Подскажите где нужно подправить . help.gif
Камень STR711FR2


--------------------
Бубен - однако штука шаманская!!!

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Ivan_Kov
сообщение Feb 22 2007, 18:17
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 30-10-06
Из: г. Курск
Пользователь №: 21 787



Цитата
Вынужден обратиться к вам через лично письмо так как очень нужно зделать прирывание .
Не моглши бы вы прислать как именно нужно написать копирование векторов.
Если нужно могу выслать совй 71x_init.s.
Должен признать что не евляюсь знатаком асеблера ARM ядра. sad.gif
Вот 51 асемблер другое дело на арм перлез совсем недавно и еще не знаю всех тонкостей!
Зарание спасибо .

К сожалению, не могу оказать вам помощь в полной мере. Во первых, потому как и сам я новичок в этой области. Я начал заниматься embeded буквально пару-тройку месецев назад, т.к. сменил работу. До этого имел дело только с Win. Во-вторых, сами понимаете, что первые месяцы на новом месте - самые сложные, поэтому писать и отлаживать эту процедуру просто нет времени. Честно говоря, не вижу ничего супер сложного в том, чтобы скопировать из одной области памяти - в другую. И совсем не обязательно делать это на ассемблере, C - вполне справиться с этой задачей.
Из того что копирование вызывает у вас затруднения, я делаю вывод, что у вас есть пробелы в знании структуры микроконтроллера, очень рекомендую почитать мануал к нему, без базисных понятий вы все равно далеко не уедите.
В высланом примере в строках 125-133 производится копирование всей программы из флеша в озу, а в строках 136-142 в регистре BOOTCONF 2-м младшим битам присваивается значение 10b:
Код
;copying whole image into RAM
        LDR     r0, =0         ;r0 = start address from which to copy
        LDR     r3, =|Image$$ZI$$Base|;r3 = number of bytes to copy
        LDR     r1, =RAM_Base    ;r1 = start address where to copy
copy_ram
        LDR     r2, [r0], #4        ;Read a word from the source
        STR     r2, [r1], #4        ;copy the word to destination
        SUBS    r3, r3, #4    ;Decrement number of words to copy
        BNE     copy_ram
        

        MOV     r0, #RAM_mask
;now do mapping
        LDR     r1, =CPM_Base_addr
        LDRH    r2, [r1, #BOOTCONF_off_addr];Read BOOTCONF Register
        BIC     r2, r2, #0x03    ;Reset the two LSB bits of BOOTCONF Register
        ORR     r2, r2, r0    ;change the two LSB bits of BOOTCONF Register
        STRH    r2, [r1, #BOOTCONF_off_addr];Write BOOTCONF Register

на С это будет выглядеть примерно так(не проверял):
Код
#define VECTORS_IN_RAM ((void*)0x20000000)
#define VECTORS_IN_FLASH ((void*)0x40002000)  /* ??? */
#define BOOTCONF (*((int*)<адрес регистра(см. мануал)>))

memcpy(VECTORS_IN_RAM, VECTORS_IN_FLASH, 0x40); /* как заметил тов. Сергей Борщ*/
BOOTCONF = (BOOTCONF & (~3)) | 2; /* мапим на адр 0*/


PS Ошибся: в регистр BOOTCONF надо писать 10b а не 01b. Не точность исправил 23.02
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01353 секунд с 7
ELECTRONIX ©2004-2016