Перейти к содержанию
    

Redaer

Участник
  • Постов

    19
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Redaer

  • Звание
    Участник
    Участник
  1. смена бодрейта в AT91SAM7X256

    Доброго вам времени суток Подскажите пожалуйста, есть ли какие-нибудь особенности в смене бодрейта уарта, скажем так, на горячую? То есть во время выполнения программы мне необходимо менять baudrate уарта. Так вот столкнулся с тем, что в буфере приемника нет никаких данных в то время, как их я вижу на осцилографе. Конкретизирую:) АРМ общается на скорости 28800 с модемом, затем в один прекрасный момент нужно поменять скорость на 115200. Меняю. Посылаю "привет" модему, тот как вежливый объект отвечает:) Но в АРМе почему-то нет никакой информации. Процедура инициализации уарта: void USART_init(unsigned int baudrate) { AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS; AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA, AT91C_PA0_RXD0 | AT91C_PA1_TXD0, 0 ); AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1<<AT91C_ID_US0); AT91C_BASE_US0->US_IER = AT91C_US_ENDRX | AT91C_US_RXRDY; AT91F_US_Configure (AT91C_BASE_US0, MCK, AT91C_US_ASYNC_MODE | AT91C_US_NBSTOP_2_BIT, baudrate, 0); AT91C_BASE_US0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN; AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_US0, INTERRUPT_LEVEL_7, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, Usart0_c_irq_handler); AT91C_BASE_US0->US_RPR = (unsigned int)&buff_rx; AT91C_BASE_US0->US_RCR = 256; AT91C_BASE_US0->US_TCR = 0; AT91C_BASE_US0->US_RTOR = 10000; AT91F_PDC_Open(AT91C_BASE_PDC_US0); AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US0); } Собственно, я попробовал просто вызвать в коде выше указанную процедуру с другим параметром baudrate . . . // Код общения с модемом на скорости 28800 AT91C_BASE_US0->US_THR = 0x21; sleep(100); AT91F_US_Put(AT91C_BASE_US0, baseAddress, 4); sleep(100); USART_init(115200); // Пытаюсь поменять бодрейт sleep(100); AT91C_BASE_US0->US_THR = 0x21; sleep(100); AT91C_BASE_US0->US_THR = 0x00; // вот после этой посылки должно прийти 160 байт от модема, и они приходят, но в буфере buff_rx нет ничего. Причем дальнейшая работа на 115200 вполне так может осуществляться... То есть, если модем присылает по одному байту, то в буфере они оказываются. Подскажите пожалуйста, в чем особенность работы с переменным бодрейтом и приемом информации по нему?
  2. 2Сергей Борщ: понятно, что В - это прыжок. Вопрос в другом, почему IAR так интерпетирует вызов процедуры. Она объявлена в другом файле. 2Dog Pawlowa: смешно :) но все нормально в этом плане. Подобных дефайнов я не делаю.
  3. Добрый день Вопрос у меня в следующем. Пишу программулинку на IAR 4.40 под ARM, собсно пытаюсь продебажить, и вот увидел в дизассемблере этой самой программки вот такую строчку: [u]WriteTest();[/u] 000005A0 EAFFFFFE B 0x000005A0 Я так понимаю, команда В - это прыжок по какому-либо адресу, так почему он прыгает на тот же... Если идти в дебагере по шагам, то с этой строчки он сдвинутся не может. Собсно попробовал добавить вызовы других процедур до WriteTest() - ситауция изменилась лишь адресом, но действие то же - прыжок на вызов самой себя. Подскажите, пожалуйста, в чем косяк
  4. Большое спасибо за развернутые ответы:) Че-то я не сообразил по поводу темы про АВР.
  5. Здравствуйте Дабы не засорять конференцию похожими темами, задам свой вопрос здесь. Пытаюсь с помощью IAR 4.40 запрогать AT91SAM7S256. Так вот вопрос состоит в следующем: Можно ли с помощью иара залить во флешь процессора 2 разные программы переопределив в файлах at91SAM7S256_64KRAM.xlc и at91SAM7S256_NoRemap.xlc параметр -DROMSTART В частности первую программку хочется залить по адресу 0x0 вторую же по адресу 0x2000 Я так понимаю, при запуске АРМ начинает работать с нулевого адреса. Так? Собсно, хочется из первой программки(бутлоадер своеобразные) прыгнуть на вторую(основную)... Можно ли это сделать посредством ассемблеровской вставки asm("B 0x2000") И ещё вопрос. При загрузке программы в АРМ посредством ИАРа какие-нть происходят действия с флеш (полностью ли она затирается или начиная с аддреса, обозначенного в xlc)? Попробовал в бутлоадере сделать asm("B 0x2000"). Залил во флеш. Потом в основной проге в обоих xcl изменяю -DROMSTART=0x00002000. Пытаюсь залить во флеш через дебагер. Ну и дебагер у меня подвисает, т.е. как я понимаю, прыжка не происходит на адрес 0x2000 со стороны бутлоадера. Уж простите за сумбурное объяснение проблемы. Прошу вас, задавайте вопросы, попытаюсь раскрыть тему более полно. Помогите советом или ссылкой на доки, пожалуйста
  6. nRF9E5

    Добрый день Не хочется создавать новую тему, поэтому спрошу в этой Вы пытались запрограммить nrf9E5? Можно в кратце рассказать, через какие регистры можно получить информацию от внтуреннего 905-го приемо-передатчика? Ну или ткните в документацию... Создаю прошивку для процессора 8051 на Кейле, но пока не пойму, как заставить nrf905 передавать данные. З.Ы. В качестве проверки использую уже настроенные nrf905 натсроенный как приемник и подключенный к at91sam7s256. Так вот он даже несущую не регистрирует от nrf9E5.
  7. Чтобы не открывать новую тему... :) считываю содержимое flash полностью и сохраняю в файл затем очищаю flash заново записываю данные(если снова считать, то получается идентичный первому файл) выкл./вкл. питание, а процессо не хотит работать что я не так делаю? нужно ли как-то ещё вектора прерываний модифицировать или что-то ещё с ними делать? at91sam7s256 в IAR'е пытаюсь прогать заранее спасибо за наставление на путь истинный :))
  8. SpiritDance, да че-то все равно не хотит...:(
  9. 2vmp, MSBF в нуле... 2Edmundo, как я понял, регистр векторов прерываний находится вот здесь, то есть затереть я его никак не могу своими действиями: [/size] Можно тогда ещё вопрос по получению информации по уарту и записи её во flash? Я посылаю 256 байт зараз по уарту и принимаю их в буфер, который потом записываю во flash, так вот... Если просто запускаю программу(слушающую и записывающую), то во flash ничего не пишется(когда читаю из неё, то получаю F0 00 00 00 FF FF FF и т.д.) Ежели по шагам выполняю программу со свеверменной подачей порций информации, то все отлично записывается, что я не так делаю? Код вот такой: while(1) { while(!(AT91F_US_RxReady(AT91C_BASE_US1))); AT91F_Flash_Write(testAdr, 256, buff_rx); COM1->US_RPR = (unsigned int)&buff_rx[0]; COM1->US_RCR = 256; testAdr += 0x100; } [size="2"][/size] AT91F_Flash_Write - процедура записи во flash: - дизактивация прерываний - запись во flash - активация прерываний
  10. Я реверсию битов сделал Вот ещё вопрос, когда, во флешь что-то пишешь, её нужно предварительно очистить(как я понял, забить 0xFF). Но во флеше, насколько я знаю, хранится таблица векторов прерываний, она не сотрется? И вообще, какой у нее адрес? З.Ы. Начинаю писать с такого адреса 0x100000
  11. Может быть... В общем, просто реверс в проге, которая скидывает инфу с компа сделал. Вроде работает... Но все равно интересно, че за глюк такой...
  12. Интуитивно мне кажется, что при работе с флеш бит-реверсии получиться не может (справедливости ради скажу, что в SAM'ах флешку не щупал). А вот при работе с последовательными интерфейсами -- запросто :) , сами понимаете. Ага, только если на КОМ посылается больше 1 байта, то он передает их в обратном порядке, т.е.: если посылать по кому 0x1234, то он отправит их как 0x3412, а никак не 0x589 -- проверял на арме прием данных происходит так(не пинать :) , но дружеский подзатыльник можно ) unsigned int testAdr = 0x100000; while(1) { while(!(AT91F_US_RxReady(AT91C_BASE_US1))); //жду, когда что-либо будет на RX TestEFC(testAdr); // Пишу во флешь данные из RX-буфера(массив типа unsigned int buff_rx[64]) testAdr += 0x100; //изменение адреса записи } инициализация буфера на прием AT91C_BASE_US1->US_RPR = (unsigned int)&buff_rx; AT91C_BASE_US1->US_RCR = 64; Вот думаю, может в каком-нть месте произвести реверсию, к примеру, при отправке с компа на уарт арма?.. Есть смысл?
  13. Ха! Действительно, как не заметил... Если посылаю с компа на комп по КОМ-порту, то все корректно приходит, без реверсии... То же самое наблюдается и в ИАРе, когда пошагово выполняю, т.е. в RX-массиве оказываются верные 4-хбайтовые числа... Получается, что меняются старшие и младшие биты местами... Вернее считывание числа из массива происходит наоборот... А как-нть этого можно избежать? Edmundo, cпасибо за подсказку, буд дальше мучать :)
  14. Проблема состоит в том, что по уарту приходят данные и записываются в буфер, который я пытаюсь записать во флеш и, соответственно, считать из флеша. Так вот записываю я одни данные, а считываются другие, вернее, происходит какая-то странная подмена одних байтов другими. К примеру(все в шестнадцатиричном виде): | Записываю | Считываю | | 0F | F0 | | EA | 57 | | FE | 7F | и т.п. Вот функции, которыми пользуюсь для записи, считывани во и из flash __ramfunc void EFC_Init(void) { while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(100 << 16)) | AT91C_MC_FWS_1FWS; while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); } __ramfunc unsigned int EFC_WritePage(unsigned int adr, unsigned int *pbuf) { unsigned int *pflash; unsigned int page; unsigned int region; unsigned int i; pflash = (unsigned int *)adr; page = (adr & 0x3FFFF) / EFC_PAGE_SIZE; region = (page/EFC_PagesInTheLockRegion); EFC_Init(); if (AT91C_BASE_MC->MC_FSR & (region << 16)) { // lock set, clear it AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 << 16)) | AT91C_MC_FWS_2FWS; AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (region << 8 ) | AT91C_MC_FCMD_UNLOCK; } while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); for (i = 0; i < EFC_PAGE_SIZE_UINT; i++) if (pbuf[i] != 0) { *(pflash + i) = *(pbuf + i); } AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (page << 8 ) | AT91C_MC_FCMD_START_PROG; while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); return 1; } __ramfunc void TestEFC(unsigned int adr) { AT91F_AIC_DisableIt (AT91C_BASE_AIC, AT91C_ID_US1); AT91F_AIC_DisableIt (AT91C_BASE_AIC, AT91C_ID_PIOA); while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); EFC_WritePage(0x100000 | adr, (unsigned int*)tryInt); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA); __ramfunc ReadFromAddress(unsigned int address) { AT91F_AIC_DisableIt (AT91C_BASE_AIC, AT91C_ID_US1); AT91F_AIC_DisableIt (AT91C_BASE_AIC, AT91C_ID_PIOA); while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY)); EFC_ReadPage(address, buff_tx); while(!(AT91F_US_TxReady(AT91C_BASE_US1))); AT91F_US_Put(buff_tx, EFC_PAGE_SIZE); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA); COM1->US_TPR = (unsigned char)&buff_tx[0]; COM1->US_TCR = 0; } Прогаю sam7s256 в iar.
  15. SAM7Sxx flash write

    Можно вопрос по SAM7S256? Стоит задача: Программа работает из flash, при поступлении определенного сигнала по радиоканалу, flash должна скопировать кусок себя в RAM и запустить эту свою часть из нее. Вопрос: как передать управление из flash в RAM? Для этого нужно какие-то флаги поднимать? З.Ы. Пытаюсь программировать в IAR
×
×
  • Создать...