Jump to content

    

pokk

Участник
  • Content Count

    142
  • Joined

  • Last visited

Community Reputation

0 Обычный

About pokk

  • Rank
    Частый гость

Recent Profile Visitors

2022 profile views
  1. Делаю hex для bootloader в stm32f405. В файле линкера создал блок образа IMAGE_HEAD (урезанный там больше указателей) и перенес туда адрес начала таблицы прерываний. и два региона для хранение настроек FlashDefault_region, располагаються в последних двух секторах. /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\linker\ST\IcfEditor\stm32f40x_fsmc.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08020000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_FLASH_start__ = 0x08020000; define symbol __ICFEDIT_region_FLASH_end__ = 0x080FFFFF; define symbol __ICFEDIT_region_FSMC11_start__ = 0x0; define symbol __ICFEDIT_region_FSMC11_end__ = 0x0; define symbol __ICFEDIT_region_FSMC12_start__ = 0x0; define symbol __ICFEDIT_region_FSMC12_end__ = 0x0; define symbol __ICFEDIT_region_FSMC13_start__ = 0x0; define symbol __ICFEDIT_region_FSMC13_end__ = 0x0; define symbol __ICFEDIT_region_FSMC14_start__ = 0x0; define symbol __ICFEDIT_region_FSMC14_end__ = 0x0; define symbol __ICFEDIT_region_NAND1_start__ = 0x0; define symbol __ICFEDIT_region_NAND1_end__ = 0x0; define symbol __ICFEDIT_region_NAND2_start__ = 0x0; define symbol __ICFEDIT_region_NAND2_end__ = 0x0; define symbol __ICFEDIT_region_PCARD_start__ = 0x0; define symbol __ICFEDIT_region_PCARD_end__ = 0x0; define symbol __ICFEDIT_region_CCRAM_start__ = 0x10000000; define symbol __ICFEDIT_region_CCRAM_end__ = 0x1000FFFF; define symbol __ICFEDIT_region_SRAM1_start__ = 0x20000000; define symbol __ICFEDIT_region_SRAM1_end__ = 0x2001BFFF; define symbol __ICFEDIT_region_SRAM2_start__ = 0x2001C000; define symbol __ICFEDIT_region_SRAM2_end__ = 0x2001FFFF; define symbol __ICFEDIT_region_BKPR_start__ = 0x40024000; define symbol __ICFEDIT_region_BKPR_end__ = 0x40024FFF; /*--------------------Sector0---------------------------------------*/ /*--------------------Sector10---------------------------------------*/ define symbol __ICFEDIT_region_FlashDefault_start__ = 0x080C0000; define symbol __ICFEDIT_region_FlashDefault_end__ = 0x080DFFFF; /*--------------------Sector_11---------------------------------------*/ define symbol __ICFEDIT_region_FlashVar_start__ = 0x080E0000; define symbol __ICFEDIT_region_FlashVar_end__ = 0x080FFFFF; /*--------------------------------------------------------------*/ /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x2000; define symbol __ICFEDIT_size_heap__ = 0x2000; /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region FLASH_region = mem:[from __ICFEDIT_region_FLASH_start__ to __ICFEDIT_region_FLASH_end__ ]; define region FSMC_region = mem:[from __ICFEDIT_region_FSMC11_start__ to __ICFEDIT_region_FSMC11_end__] | mem:[from __ICFEDIT_region_FSMC12_start__ to __ICFEDIT_region_FSMC12_end__] | mem:[from __ICFEDIT_region_FSMC13_start__ to __ICFEDIT_region_FSMC13_end__] | mem:[from __ICFEDIT_region_FSMC14_start__ to __ICFEDIT_region_FSMC14_end__]; define region NAND_region = mem:[from __ICFEDIT_region_NAND1_start__ to __ICFEDIT_region_NAND1_end__ ] | mem:[from __ICFEDIT_region_NAND2_start__ to __ICFEDIT_region_NAND2_end__ ]; define region PCARD_region = mem:[from __ICFEDIT_region_PCARD_start__ to __ICFEDIT_region_PCARD_end__ ]; define region CCRAM_region = mem:[from __ICFEDIT_region_CCRAM_start__ to __ICFEDIT_region_CCRAM_end__ ]; define region SRAM_region = mem:[from __ICFEDIT_region_SRAM1_start__ to __ICFEDIT_region_SRAM1_end__ ] | mem:[from __ICFEDIT_region_SRAM2_start__ to __ICFEDIT_region_SRAM2_end__ ]; define region BKPR_region = mem:[from __ICFEDIT_region_BKPR_start__ to __ICFEDIT_region_BKPR_end__ ]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; initialize by copy { readwrite }; //initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application do not initialize { section .noinit }; //place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; define block IMAGE_HEAD with fixed order {readonly section .intvec, section .intvecTail}; place in FLASH_region {readonly,first block IMAGE_HEAD}; //place in PCARD_region { readonly section application_specific_ro }; place in CCRAM_region { block CSTACK, section .ccram }; place in SRAM_region { readwrite, block HEAP }; place in BKPR_region { section .backup_sram }; define region FlashDefault_region = mem:[from __ICFEDIT_region_FlashDefault_start__ to __ICFEDIT_region_FlashDefault_end__]; define region FlashVar_region = mem:[from __ICFEDIT_region_FlashVar_start__ to __ICFEDIT_region_FlashVar_end__ ]; place in FlashDefault_region {section .FlashDefault}; place in FlashVar_region {section .FlashVar}; Вот кусок стартапа MODULE ?cstartup ;; Forward declaration of sections. SECTION CSTACK:DATA:NOROOT(3) SECTION .intvec:CODE:NOROOT(2) EXTERN __iar_program_start EXTERN SystemInit EXTERN hard_fault_handler_c PUBLIC __vector_table ;;------------------------------------------------------ PUBLIC __beginCodehead EXTERN __checksum_begin, __checksum_end SECTION .intvec:CONST:ROOT(8) DATA __vector_table DCD sfe(CSTACK) DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler ;;---------------------------------------------------------------------- SECTION .intvecTail:CONST:ROOT(2) DATA ;Продолжение таблицы векторов прерываний __vector_table_tail ;;---------------------------------------------------------------------- ;;DCD 0 ; Зането CRC ;;DCD 0 ; занято __beginCodehead DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler Проблема возникла в том что, таблица прерываний начинает распалагаться, после региона блока настроек FlashDefault_region ******************************************************************************* *** PLACEMENT SUMMARY *** define block IMAGE_HEAD with fixed order { ro section .intvec, section .intvecTail }; "P1": place in [from 0x802'0000 to 0x80f'ffff] { ro, first block IMAGE_HEAD }; define block CSTACK with size = 8K, alignment = 8 { }; "P2": place in [from 0x1000'0000 to 0x1000'ffff] { block CSTACK, section .ccram }; define block HEAP with size = 8K, alignment = 8 { }; "P3": place in [from 0x2000'0000 to 0x2001'bfff] | [from 0x2001'c000 to 0x2001'ffff] { rw, block HEAP }; "P5": place in [from 0x80c'0000 to 0x80d'ffff] { section .FlashDefault }; "P6": place in [from 0x80e'0000 to 0x80f'ffff] { section .FlashVar }; initialize by copy { rw }; No sections matched the following patterns: section .backup_sram in "P4" section .ccram in "P2" Section Kind Address Size Object ------- ---- ------- ---- ------ "P5": 0xe0 P5-1 0x80c'0000 0xe0 <Init block> .FlashDefault inited 0x80c'0000 0xe0 VarFlash.o [1] - 0x80c'00e0 0xe0 "P1": 0xc9fc IMAGE_HEAD 0x80c'0100 0x180 <Block> .intvec ro code 0x80c'0100 0x1c startup_stm32f4xx_Boot.o [1] .intvecTail const 0x80c'011c 0x164 startup_stm32f4xx_Boot.o [1] .checksum const 0x80c'0280 0x4 Place holder __checksum .rodata const 0x80c'0284 0x10 HTTP_v2.o [1] .rodata const 0x80c'0294 0x10 HTTP_v2.o [1] .rodata const 0x80c'02a4 0x8 HTTP_v2.o [1] .rodata const 0x80c'02ac 0x14 HTTP_v2.o [1] .rodata const 0x80c'02c0 0x78 HTTP_v2.o [1] .rodata const 0x80c'0338 0x9c HTTP_v2.o [1] .rodata const 0x80c'03d4 0x18 HTTP_v2.o [1] Почему секция "P1": place in [from 0x802'0000 to 0x80f'ffff] { ro, first block IMAGE_HEAD }; начинаеться после P5 ? и с адресом 0x80c0000 ? Хотя должно с 0x8020000
  2. Stm32f405 запись во Flash 16bit

    Благодарю, так и знал что где-то элементарная ошибка которую упускаю.
  3. Не могу не как понять почему запись по 16bit не работает, устанавливает флаг ошибки PGPERR (Programming parallelism error) и записывает все равно 32bit Из Дашашита uint8_t FLASH_Program_16Bit(uint32_t address,uint16_t data) { while(!flash_ready()); //Ожидаем готовности флеша к записи FLASH->CR = FLASH_CR_PG //Разрешаем программирование флеша |1*FLASH_CR_PSIZE_0 //PSIZE[1:0]:Program size |0*FLASH_CR_PSIZE_1; // 01 program x16 *(__IO uint32_t*)address = (uint16_t)data; //Пишем 2 байта while(!flash_ready());//Ждем завершения операции if(!check_EOP())return 0; FLASH->CR &= ~(FLASH_CR_PG); //Запрещаем программирование флеша return check_EOP(); } Запись по 32bit работает uint8_t FLASH_Program_32bit(uint32_t address,uint32_t data) { while(!flash_ready()); //Ожидаем готовности флеша к записи FLASH->CR = FLASH_CR_PG //Разрешаем программирование флеша |0*FLASH_CR_PSIZE_0 //PSIZE[1:0]:Program size |1*FLASH_CR_PSIZE_1; // 10 program x32 *(__IO uint32_t*)address = (uint32_t)data; //Пишем 4 байта while(!flash_ready());//Ждем завершения операции if(!check_EOP())return 0; FLASH->CR &= ~(FLASH_CR_PG); //Запрещаем программирование флеша return check_EOP(); }
  4. Ну это как-то не сильно надежно, но на первый раз сгодиться благодарю!
  5. Заголовок есть, в отправляемом hex файле, но проблема в том что первый пакет по tftp идет запрос с именем файла, и там нет данных из файла ни заголовка ничего. И после ответа на этот запрос уже прийдет пакет с данными, так вот если его пронять в прошивке, а потом перезагрузиться в bootloader, то как процесс передачи инициализировать заного от клиента?
  6. Добрый день, сделал bootloader с загрузкой через tftp, работает хорошо. В кратце boot работает так, если перепрошивка разрешена, то при приеме любого пакета(Write Request (WRQ)) по tftp, происходит перезагрузка в Bootloader через програмный Reset, а дальше по таймауту клиент отправлет этот же запрос ешё раз и тут его уже принимает bootloader и запускаеться процесс перепрошивки. Так вот у меня физически 1 плата с разной модификации, и на ней могут работать 3-4 разных программы. Что бы не плодить кучу версий bootloader сделал его один на все верии ПО. И вот тут возникают возможные грабли, при обновлении через Tftp может зашить ПО от другой прошивки ("чужой"). Вот подумал что при обновлении надо как-то отследить что за ПО и запретить обновлении если оно "чужое". Самым простой способ это под каждую ПО сделать свой bootloader, и в нем проверять уникальный номер, но все же не хочется, плодить кучу версий. Второй вариант, проверять что за прошивка прилетела, и если это ''чужая" прошивка то не переходить в bootloder, но тут возникает проблема, что бы при принять первый пакет с данным tftp, надо клиенту отправить ACK на запрос Write Request (WRQ) и если это сделать то в bootloader, уже не поймает запрос Write Request (WRQ), и не сможет начать процес перепрошивки. Есть ли еще какие нибудь идеи как это можно реализовать ?
  7. Да это я торопился + новая дурацкая клавиатура, мажу по клавишам =(( А по делу что ?
  8. Частично разобрался, в общем та ошибка была на функцию exit, которой не сушествовало (находил где-то тут тему про это ), откуда она вызываеться так и не понял, дальнейшие действия продолжил на другом компьютере. После обравления eclipse пустой проект сразу скомпилировался, от радости накидал мигание светодиодом, скомпилировал hex попытался защить его через st-link полчил ошибку на начальный адрес 8000, смотрю в файле линкера .ld FLASH регеон начинаеться с 0 , поправил его установил 0x08000000 скомплировал hex, не помогло удалил вообще файл .ld проект все равно скомплировался , это как такое происходит ? Файл линкире взял из CMSIS скаченой с сайта ARM Возможно это из за того что плагины ARM не установил (хотя читал что они должны быть в последней версии вшиты) 1) Как проверить все ли есть ? 2) Как устаовить их без подключения к интернету? (нету интернета совсем =( ) 3) Как скомпилировать hex файл принудительно, если сборка прошла успешно, то пока изменений .c файлах не было hex файл не создаеться.
  9. Все равно тож самое =( в Eclipce прописал путь и в винде и ещё парочка вопросов возникла 1) где объявлять примеренные __bss_end__ и тд из стартапа 2) Как переключить кодировку в консоле ? На одной версии Eclipce установленном на другом компе, в консоле отображает непонятно что.
  10. Решил потихоньку переходить на eclipce собрал пустой проект, установил компилятор gcc пытаюсь скомпилировать выдает ошибку: Description Resource Path Location Type make: *** [makefile:43: example.elf] Error 1 example C/C++ Problem на 43 строке arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -g -Xlinker --gc-sections -Wl,-Map,"example.map" -o "example.elf" $(OBJS) $(USER_OBJS) $(LIBS) arm-none-eabi-gcc не находит ? В перименной PATH прописал путь до папки arm-none-eabi-gcc
  11. Подскажите, как бороться с болтанием параметра на индикаторе, т.е было значение 5.00 через секунду 4.99 потом опять 5.00... 4.99,5.01 При этом сам сигнал "почти" постоянный, разве что под действием температуры может уплывать. Интегрирование значений АЦП параметра присутствует(1000 изерений). Пока из решений вижу снять цифровой сигнал(значения АЦП) построить спектр(найти частоту среза) и посчитать цифровой фильтр. Есть ещё какие либо решения?
  12. Исключение секции сделал так: Настройки присутствуют в файле const S_flash_GlobalSettingAllVar Flash_default_Settings@".FlashDefault"=.... Настройки отсутствуют в файле __no_init S_flash_GlobalSettingAllVar Flash_default_Settings@".FlashDefault"; Дальше хотел сделать разные конфигурации проекта, и запускать тот или другой вариант, но это оказывается не очень удобно, так как при измени одной конфигурации приходиться изменять и другую. Как это можно сделть по другому ? Вообще мне надо 2 hex файла один который содержит настройки, и второй без секции настроек. (хотел последовательно запускать iarbuild.exe с разной конфигурацией,но до этого пока не дошел)
  13. Из за чего меньше стираний секторов? Из за того что они изначально могут быть стертыми (при увеличени прошивки)? А по поводу склейки строки hex из разных блоков, что можете посоветовать?
  14. О проверить на 0xFF, да можно, я просто всегда очищал при переходе от одного сектора к другому. Благодарю, я чуть не наворотил массив содержащий номера стертых секторов =). Это реализовано в протоколе TFTP, там к блоку данных крепиться шапка в которой указанно номер пакета с данными, а в ответ отправляешь номер следующего пакета данных, который надо принять. Но вопрос, на соединение строки hex из разных блоков все ещё остался =(.