Jump to content

    

I_am_Lexx

Участник
  • Content Count

    25
  • Joined

  • Last visited

Community Reputation

0 Обычный

About I_am_Lexx

  • Rank
    Участник
  • Birthday 07/26/1984

Контакты

  • Сайт
    http://
  • ICQ
    0
  1. Точнее не файл "C:\...\pic30\crt0_extended24.s" а исходя из кода линкера "crt1_extended24.o". Т.е. исходники уже скомпилированы. OUTPUT_ARCH("24FJ128GA606") #if __XC16_VERSION__ > 1027 CRT0_STARTUP(crt0_extended24.o) CRT1_STARTUP(crt1_extended24.o) #else CRT0_STARTUP(crt0_extended.o) CRT1_STARTUP(crt1_extended.o) #endif #if __XC16_VERSION__ > 1027 /* * Define how to startup, by default we initialize * everything as normal; change to crt_start_mode to * preserve preserved data on a restart * * Or define your own __crt_start_mode fucntion */ CRT_STARTMODE(crt_start_mode_normal) #endif
  2. В целом у меня получился бутлодер. Но не все. Структуру бутлодера я не выбирал. Делал, как коллега по работе. Но он на Ассемблере пишет с пустого листа. Стек сам инициализирует: mov mov mov #__SP_init,w15 #__SPLIM_init,w0 w0,_SPLIM ; initialize w15 ; ; initialize SPLIM У меня на Си стек инициализируется сам. Точно механизм я не знаю. Код приведенный ниже формируется сам с адреса 0x00100. Первые 3 строки - это инициализация стека. И только с строки 12 переход в main(). 1 00100 226B6F MOV #0x26B6, W15 2 00102 26FF0E MOV #0x6FF0, W14 3 00104 88010E MOV W14, SPLIM 4 00106 200301 MOV #0x30, W1 5 00108 E00001 CP0 W1 6 0010A 320002 BRA Z, 0x110 7 0010C 202001 MOV #0x200, W1 8 0010E 880191 MOV W1, DSRPAG 9 00110 200000 MOV #0x0, W0 10 00112 E00000 CP0 W0 11 00114 320002 BRA Z, 0x11A 12 00116 020000 CALL 0x0 13 00118 000000 NOP 14 0011A 023000 CALL main 15 0011C 000000 NOP 16 0011E DA4000 BREAK 17 00120 FE0000 RESET 18 00122 FFFFFF NOPR Как я понял это дело находится по адресу C:\...\pic30\crt0_extended24.s. Кусок кода ниже. ;; Initialize stack and PSV window ;; ;; registers used: w1 ;; (w0 is cleared by device reset, so ARGC = 0) ;; ;; Inputs (defined by user or linker): ;; __SP_init = initial value of stack pointer ;; __SPLIM_init = initial value of stack limit register ;; Inputs (defined by linker): ;; __const_length = length of section .const ;; __const_psvpage = PSVPAG setting for section .const ;; ;; Outputs: ;; (does not return - resets the processor) ;; ;; Calls: ;; _main ;; .weak __user_init, __has_user_init mov #__SP_init,w15 ; initialize w15 mov #__SPLIM_init,w14 Значения __SP_init и __SPLIM_init вычисляются автоматически при компиляции. Системные константы. Это вершина стек и размер стека. При изменении программы они меняются. А мой бутлодер не меняет эту область. Чтобы обойти эту проблему я хочу явно указать начало и размер стека и не менять их от версии к версии. На Ассемблере это можно сделать так. .section my_stack, stack, address(0x1800) .space 0x100 Прошу объяснить, 1) как это можно сделать в Си, учитывая, что код формируется до вызова main() или 2) как указать в линкере, чтобы стек был в нужном месте, нужного размера.
  3. Доброго дня. Делаю bootloader. PIC24F. XC16. MPLAB 5.00. Увертюра: Архитектура такая, что в одном проекте размещаю bootloader и application. В линкере секции разбиты так, что стирается только определенная область памяти. В эту область записывается приложение, которое разрабатывается в этом же проекте, а не отдельно от загрузчика. Все, как мне казалось сделал, но не работает. Если залить это же приложение, то работает. Если добавить в приложение хотя бы один Nop(), то перестает работать. При запуске программы с 0x00 адреса программа переходит не в функцию main(), а инициализирует стек, переменные, возможно, еще что-то. Эти команды формируются автоматически (компилятором) в стираемой мною области программы (во время перепрошивки). MOV #0x1BBA, W15 MOV #0x6FF0, W14 MOV W14, SPLIM NOP MOV #0x0, W0 CP0 W0 BRA Z, CORCON_RESET MOV #0x10, W0 MOV W0, CORCON RCALL __psv_init RCALL __crt_start_mode, __crt_start_mode_normal CP0 W0 BRA NZ, 0x4072 MOV #0x6F6C, W0 MOV #0x0, W1 BRA 0x4076 MOV #0x0, W0 MOV #0x0, W1 IOR W0, W1, [W15] BRA Z, 0x407C RCALL __data_init, __data_init_da MOV #0x0, W0 CP0 W0 BRA Z, 0x4086 CALL 0x0 NOP CALL main NOP Мне нужно разместить эту часть программы (автоматически формируемую инициализацию) по жестко указанному адресу, т.к. в эту область переходит контроллер из адреса 0x0 при запуске, а код по адресу 0x0 я не меняю при перепрошивке. Задача: "прибить гвоздями" эту часть кода. Что и куда приписать в линкере?
  4. STM32. Перенастройка UART.

    Спасибо за советы, попробуем.
  5. STM32. Перенастройка UART.

    Используется не HAL, а библиотека стандартной периферии. "Нельзя" - это не идеология, а просто не получается. Перенастройка модуля UART для того, чтобы TX UART работал через DMA или без DMA. Связаны ли эти настройки?
  6. Подскажите, как перенастроить UART в STM32. У меня товарищ делает перенастройку UART в STM32 при помощи каких-то готовых функций(я STM не программирую). Результатом является то, что при перенастройке модуль UART выключается и включается снова. В то время, когда UART выключается, "отпускается" линия RX и TX. Напряжение там просаживается на небольшое время. Товарищ говорит, что по другому нельзя. На PIC я делаю перенастройку UART без выключения модуля. Эффекта "отпускания" линии нет. Можно ли в STM32 перенастроить UART без выключения модуля? Если можно, то лучше код или ссылку.
  7. Всем доброго дня. Проблема в следующем. Не могу научиться писать/стирать flash в микроконтроллере PIC24FJ1024GB606. Среда: MPLAB X. Компилятор: XC16 ver.1.26. Сказу скажу, что в структуре памяти разбираюсь не очень, но программирую PIC давно. Так что некоторые вещи понимаю. Ранее для записи настроечных параметров в микроконтроллер, типа PIC24FJ64GB004, использовал библиотеку DEE Emulation 16-bit - эмулятор EEPROM. Использовал функции read, write и горя не знал. При попытке запустить ее (DEE) на PIC24FJ1024GB606 оказалось, что она не работает. Стал смотреть ее. Оказалось регистр NVMCOM - регистр контроля Flash памяти в библиотеке DEE не соответствует требуемому. Попробовал поменять - не помогло. Далее в библиотеке разбираться не стал. Открыл документы даташит на мк и "PIC24F Flash Program Memory" - DS30009715C. Надергал примеров из документа на flash. В итоге получилось следующее: unsigned int __attribute__((section(".defaults"), space(prog))) factoryPARAM[512]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; // объявил область памяти. Доработанный пример стирания из даташита на мк: void erasing(void) { // C example using MPLAB XC16 unsigned long progAddr = (unsigned long)(&factoryPARAM); // Address of row to write unsigned int offset; //Set up pointer to the first memory location to be written NVMADRU = progAddr>>16; // Initialize PM Page Boundary SFR NVMADR = progAddr & 0xFFFF; // Initialize lower word of address NVMCON = 0x4003; // Initialize NVMCON asm("DISI #5"); // Block all interrupts with priority <7 // for next 5 instructions __builtin_write_NVM(); // check function to perform unlock // sequence and set WR } Не стирает. Пример ниже выдернул из "PIC24F Flash Program Memory". factoryPARAM - моя область памяти. void erasing(void) { unsigned int offset; NVMCON = 0x4003; offset = __builtin_tbloffset(factoryPARAM); TBLPAG = __builtin_tblpage(factoryPARAM); __builtin_tblwtl(offset, 0); __builtin_disi(5); __builtin_write_NVM(); } Ничего не стирает. Прошу помочь разобраться, чего я делаю не так. С библиотекой начинал работать за 5 мин. Сейчас убил 2 дня пробуя все варианты. Читать документы полностью тяжко. Естественно, прошу помощи именно по указанному семейству МК, типа PIC24FJ1024GA610/GB610 FAMILY, ну или аналоги.
  8. Привет! Хочу снизить энергопотребление модуля Wifi (RN-171) при помощи введения его в сон. Модуль раз в секунду периодически просыпается, скидывает на сервер информацию с датчиков и вновь уходит в сон. Режим работы TCP Client. ОДНАКО(!) при выходе из сна 200-300 мс тратится на готовность к передаче (при периоде 1 сек). Таким образом теряются все выгоды скважности. Можно или каким образом настроить модуль, чтобы время готовности к передаче стало менее (< 10 - 100 мс). Или же это так Wifi устроен в принципе. И еще, у меня все настройки номер канала Wifi и IP сервера прописано жестко. Так, что время на поиск канала и сети должно быть минимально.
  9. Помогите создать большой массив для PIC18F25K20, MPLAB C18. В документации у них все просто получается, а у меня более 256 байт в массиве выдает syntax error. Думаю надо чего-то в link-файле прописать, а что именно не знаю. Я примерно так делаю или вроде того(многое перепробовал) типа ключей const и изменения имен секций //---------------------------------------- #pragma romdata const_table rom unsigned ASCII[][16] = { //0x00 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //0x01 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, ....... }; #pragma const_table //-----------------------------------------
  10. Вопросы по FEKO

    Так и не смог разобраться с Feko. Знающих прошу обратить внимание. http://electronix.ru/forum/index.php?showtopic=101065
  11. Здравствуйте! Требуется разработать антенну для RFID 860 Мгц. Антенна должна быть согласована с чипом RFID(двухинтерфейсная память spi и rfid). Входные данные: - Известен входной импеданс чипа - Антенна должна работать с ридером на дальности не хуже других пассивных rfid датчиков с таким же размером - Антенна планируется планарная для печатной платы - Длина антенны < 10см Возможный путь решения задачи - CadFeko, но в Feko не преуспел - не моя специализация. Здесь обсуждал свои попытки в форуме: http://electronix.ru/forum/index.php?showt...5809&st=330 На счет цены вопроса, жду предложений от Вас, ибо сколько это стоит понятия не имею. А хватит денег оплатить разработку или нет зависит от денег конторы. Так, что жду предложений от Вас и буду благодатен за консультацию по ценам. Т.е. тех кто знает, прошу отписать сколько это стоит. С уважением, Алексей.
  12. Вопросы по FEKO

    Цитата(antenna_hunter @ Feb 24 2012, 15:23) К сожалению, у меня есть только версия 6.0, а Ваш проект создан, по всей видимости, в 6.1 и не запускается. Эх, как бы заполучить работающую 6.1... Вот для примера картинка "успешного" возбуждения диполя, находящегося в свободном пространстве: А скажите каким образом у Вас порт получается с обозначением красно-синим кружочком посередине линии. У меня красно-синий кружок в вершине line. Может это принцииально!? И еще, соединены ли все компаненты при помощи union? Если не соединять порт, то mesh можно выполнить, но выдает ошибку при расчетах. На счет версии 6.1.1 у меня trial версия 45 дней, потом "кердык" или ставить lite со всеми ее ограничениями.
  13. Вопросы по FEKO

    Цитата(I_am_Lexx @ Feb 22 2012, 14:03) Нужно промоделировать какой будет импеданс у простого полуволнового вибратора, чтобы знать нужно ли согласование антенны с входным импедансом подключаемой микросхемы. Как сделать правильно. Если линия на которой порт встык с диполями выдает ошибку. Если порт длиннее(налазит на диполи), тоже выдает ошибку. Ошибка выдается при слиянии компанентов командой union. После этого выполнить команду mesh невозможно.((
  14. Вопросы по FEKO

    Цитата(antenna_hunter @ Feb 24 2012, 13:06) Для вибратора этот самый элемент "line" следует поместить между двумя его плечами. За счет Voltage source сами плечи возбудятся противофазно, что и должно быть в действительности. А как на счет длины line? имеет ли смысл его длина? И в какую точку полосков его подсоединять. Ведь если разместить вершины line на стороны(edges) прямоугольных плеч вибратора, то при расчетах Feko выдаст ошибку, т.к. при выполнении операции mesh получится треугольник, у которого одна сторона совпадает в двумя другими. Надеюсь понятен вопрос. А то весьма сложное предложение получилось. Если в чем-то я не прав - поправьте.
  15. Вопросы по FEKO

    Цитата(antenna_hunter @ Feb 24 2012, 09:30) Постройте модель самого вибратора, например, из цилиндров или полоскового исполнения (Вы не сказали, какой именно формы он будет), и задайте возбуждение посредством порта Voltage source. Такой вариант как раз позволит определить величину входного сопротивления. Исполнение в виде полосков. В примере видел, что Voltage source размещается на геометрическом элементе line. Причем, подключение к антенне производят в одной точке. Как же мне указать, что антенна должна быть подключена к микросхеме в двух точках, как указано на рисунке выше, и, как повлияет длина элемента line(если пользоваться им) на параметры модели.