jenya7 0 October 2, 2023 Posted October 2, 2023 · Report post Может есть у кого действующая тех. поддержка в IAR? Нужно задать ребятам вопрос а моя просрочена. Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 85 October 2, 2023 Posted October 2, 2023 · Report post 1 minute ago, jenya7 said: Нужно задать ребятам вопрос А Вы пока начните с местных ребят Тут есть серьёзные люди, которые указывали ИАРу, как надо компиляторы делать Quote Share this post Link to post Share on other sites More sharing options...
jenya7 0 October 2, 2023 Posted October 2, 2023 (edited) · Report post On 10/2/2023 at 10:45 AM, haker_fox said: А Вы пока начните с местных ребят Тут есть серьёзные люди, которые указывали ИАРу, как надо компиляторы делать Весьма специфический вопрос. Ну чем чёрт не шутит... У меня две платы с процессором MIMXRT1176. На одной плате процессор подключён к nor flash через FlexSpi_1 (адрес 0x30000000), на второй через FlexSpi_2 (адрес 0x60000000). Первой плате подсовываю линкер для FlexSpi_1 (показываю только поля относящиеся к FlexSpi) Quote define symbol m_interrupts_start = 0x30002000; define symbol m_interrupts_end = 0x300023FF; define symbol m_text_start = 0x30002400; define symbol m_text_end = 0x30FBFFFF; define exported symbol m_boot_hdr_conf_start = 0x30000400; define symbol m_boot_hdr_ivt_start = 0x30001000; define symbol m_boot_hdr_boot_data_start = 0x30001020; define symbol m_boot_hdr_dcd_data_start = 0x30001030; define exported symbol core1_image_start = 0x30FC0000; define exported symbol core1_image_end = 0x30FFFFFF И отладка бежит без проблем. Для второй платы изменяю линкер Quote define symbol m_interrupts_start = 0x60002000; define symbol m_interrupts_end = 0x600023FF; define symbol m_text_start = 0x60002400; define symbol m_text_end = 0x60FBFFFF; define exported symbol m_boot_hdr_conf_start = 0x60000400; define symbol m_boot_hdr_ivt_start = 0x60001000; define symbol m_boot_hdr_boot_data_start = 0x60001020; define symbol m_boot_hdr_dcd_data_start = 0x60001030; define exported symbol core1_image_start = 0x60FC0000; define exported symbol core1_image_end = 0x60FFFFFF; И получаю ошибку - The flash loader program reported an error. Очевидно что кроме линкера нужно ещё менять какие то настройки. Вопрос какие. Edited October 2, 2023 by jenya7 Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 October 2, 2023 Posted October 2, 2023 · Report post Алгоритм прошивки флэшки Quote Share this post Link to post Share on other sites More sharing options...
jenya7 0 October 2, 2023 Posted October 2, 2023 · Report post On 10/2/2023 at 11:10 AM, VladislavS said: Алгоритм прошивки флэшки файл указанный там не подходит ни под FlexSpi_1 ни под FlexSpi_2 Spoiler /* * Copyright 2019-2021 NXP * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ __var rev; initSysPll2() { __var t; // ANADIG_PLL_PLL_528_CTRL t = __readMemory32(0x40C84240, "Memory"); if (t & 0x800000) { // SysPll2 has been initialized t &= ~0x40000000; __writeMemory32(t, 0x40C84240, "Memory"); return; } t = __readMemory32(0x40C84270, "Memory"); t |= 0x80808080; __writeMemory32(t, 0x40C84270, "Memory"); t = __readMemory32(0x40C84240, "Memory"); t &= ~(0x802000); t |= 0x40000000; __writeMemory32(t, 0x40C84240, "Memory"); // ANADIG_PLL_PLL_528_MFN __writeMemory32(0, 0x40C84280, "Memory"); // ANADIG_PLL_PLL_528_MFI __writeMemory32(22, 0x40C84290, "Memory"); // ANADIG_PLL_PLL_528_MFD __writeMemory32(0x0FFFFFFF, 0x40C842A0, "Memory"); // ANADIG_PLL_PLL_528_CTRL __writeMemory32(0x40000008, 0x40C84240, "Memory"); __delay(30); // ANADIG_PLL_PLL_528_CTRL t = __readMemory32(0x40C84240, "Memory"); t |= 0x800000 | 0x800; __writeMemory32(t, 0x40C84240, "Memory"); __delay(250); t = __readMemory32(0x40C84240, "Memory"); t &= ~0x800; __writeMemory32(t, 0x40C84240, "Memory"); do { t = __readMemory32(0x40C84240, "Memory"); } while ((t & 0x20000000) == 0); t |= 0x2000; __writeMemory32(t, 0x40C84240, "Memory"); t &= ~0x40000000; __writeMemory32(t, 0x40C84240, "Memory"); } initSysPll2Pfd1() { __var t, stable; t = __readMemory32(0x40C84270, "Memory"); if (((t & 0x8000) != 0) || (((t & 0x3F00) >> 8) != 16)) { stable = t & 0x4000; t |= 0x8000; __writeMemory32(t, 0x40C84270, "Memory"); t = __readMemory32(0x40C84270, "Memory"); t &= ~0x3F00; t |= 16 << 8; __writeMemory32(t, 0x40C84270, "Memory"); t = __readMemory32(0x40C84250, "Memory"); t ^= 0x4; __writeMemory32(t, 0x40C84250, "Memory"); t = __readMemory32(0x40C84270, "Memory"); t &= ~0x8000; __writeMemory32(t, 0x40C84270, "Memory"); do { t = __readMemory32(0x40C84270, "Memory") & 0x4000; } while (t == stable); } else { t &= ~0x8000; __writeMemory32(t, 0x40C84270, "Memory"); } } SDRAM_WaitIpCmdDone() { __var reg; do { reg = __readMemory32(0x400D403C, "Memory"); __delay(10); }while((reg & 0x3) == 0); __writeMemory32(0x00000003, 0x400D403C, "Memory"); // clear IPCMDERR and IPCMDDONE bits } setSemcClock() { initSysPll2(); initSysPll2Pfd1(); // Set SEMC root clock to use sys pll2 pfd1 divided by 3: 198Mhz __writeMemory32(0x602, 0x40cc0200, "Memory"); } initSDRAM() { // Config IOMUX __writeMemory32(0x00000000, 0x400E8010, "Memory"); __writeMemory32(0x00000000, 0x400E8014, "Memory"); __writeMemory32(0x00000000, 0x400E8018, "Memory"); __writeMemory32(0x00000000, 0x400E801C, "Memory"); __writeMemory32(0x00000000, 0x400E8020, "Memory"); __writeMemory32(0x00000000, 0x400E8024, "Memory"); __writeMemory32(0x00000000, 0x400E8028, "Memory"); __writeMemory32(0x00000000, 0x400E802C, "Memory"); __writeMemory32(0x00000000, 0x400E8030, "Memory"); __writeMemory32(0x00000000, 0x400E8034, "Memory"); __writeMemory32(0x00000000, 0x400E8038, "Memory"); __writeMemory32(0x00000000, 0x400E803C, "Memory"); __writeMemory32(0x00000000, 0x400E8040, "Memory"); __writeMemory32(0x00000000, 0x400E8044, "Memory"); __writeMemory32(0x00000000, 0x400E8048, "Memory"); __writeMemory32(0x00000000, 0x400E804C, "Memory"); __writeMemory32(0x00000000, 0x400E8050, "Memory"); __writeMemory32(0x00000000, 0x400E8054, "Memory"); __writeMemory32(0x00000000, 0x400E8058, "Memory"); __writeMemory32(0x00000000, 0x400E805C, "Memory"); __writeMemory32(0x00000000, 0x400E8060, "Memory"); __writeMemory32(0x00000000, 0x400E8064, "Memory"); __writeMemory32(0x00000000, 0x400E8068, "Memory"); __writeMemory32(0x00000000, 0x400E806C, "Memory"); __writeMemory32(0x00000000, 0x400E8070, "Memory"); __writeMemory32(0x00000000, 0x400E8074, "Memory"); __writeMemory32(0x00000000, 0x400E8078, "Memory"); __writeMemory32(0x00000000, 0x400E807C, "Memory"); __writeMemory32(0x00000000, 0x400E8080, "Memory"); __writeMemory32(0x00000000, 0x400E8084, "Memory"); __writeMemory32(0x00000000, 0x400E8088, "Memory"); __writeMemory32(0x00000000, 0x400E808C, "Memory"); __writeMemory32(0x00000000, 0x400E8090, "Memory"); __writeMemory32(0x00000000, 0x400E8094, "Memory"); __writeMemory32(0x00000000, 0x400E8098, "Memory"); __writeMemory32(0x00000000, 0x400E809C, "Memory"); __writeMemory32(0x00000000, 0x400E80A0, "Memory"); __writeMemory32(0x00000000, 0x400E80A4, "Memory"); __writeMemory32(0x00000000, 0x400E80A8, "Memory"); __writeMemory32(0x00000010, 0x400E80AC, "Memory"); // EMC_39, DQS PIN, enable SION __writeMemory32(0x00000000, 0x400E80B8, "Memory"); __writeMemory32(0x00000000, 0x400E80BC, "Memory"); __writeMemory32(0x00000000, 0x400E80C0, "Memory"); __writeMemory32(0x00000000, 0x400E80C4, "Memory"); __writeMemory32(0x00000000, 0x400E80C8, "Memory"); __writeMemory32(0x00000000, 0x400E80CC, "Memory"); __writeMemory32(0x00000000, 0x400E80D0, "Memory"); __writeMemory32(0x00000000, 0x400E80D4, "Memory"); __writeMemory32(0x00000000, 0x400E80D8, "Memory"); __writeMemory32(0x00000000, 0x400E80DC, "Memory"); __writeMemory32(0x00000000, 0x400E80E0, "Memory"); __writeMemory32(0x00000000, 0x400E80E4, "Memory"); __writeMemory32(0x00000000, 0x400E80E8, "Memory"); __writeMemory32(0x00000000, 0x400E80EC, "Memory"); __writeMemory32(0x00000000, 0x400E80F0, "Memory"); __writeMemory32(0x00000000, 0x400E80F4, "Memory"); __writeMemory32(0x00000000, 0x400E80F8, "Memory"); __writeMemory32(0x00000000, 0x400E80FC, "Memory"); // PAD ctrl // PDRV = 1b (normal); PULL = 10b (PD) __writeMemory32(0x00000008, 0x400E8254, "Memory"); __writeMemory32(0x00000008, 0x400E8258, "Memory"); __writeMemory32(0x00000008, 0x400E825C, "Memory"); __writeMemory32(0x00000008, 0x400E8260, "Memory"); __writeMemory32(0x00000008, 0x400E8264, "Memory"); __writeMemory32(0x00000008, 0x400E8268, "Memory"); __writeMemory32(0x00000008, 0x400E826C, "Memory"); __writeMemory32(0x00000008, 0x400E8270, "Memory"); __writeMemory32(0x00000008, 0x400E8274, "Memory"); __writeMemory32(0x00000008, 0x400E8278, "Memory"); __writeMemory32(0x00000008, 0x400E827C, "Memory"); __writeMemory32(0x00000008, 0x400E8280, "Memory"); __writeMemory32(0x00000008, 0x400E8284, "Memory"); __writeMemory32(0x00000008, 0x400E8288, "Memory"); __writeMemory32(0x00000008, 0x400E828C, "Memory"); __writeMemory32(0x00000008, 0x400E8290, "Memory"); __writeMemory32(0x00000008, 0x400E8294, "Memory"); __writeMemory32(0x00000008, 0x400E8298, "Memory"); __writeMemory32(0x00000008, 0x400E829C, "Memory"); __writeMemory32(0x00000008, 0x400E82A0, "Memory"); __writeMemory32(0x00000008, 0x400E82A4, "Memory"); __writeMemory32(0x00000008, 0x400E82A8, "Memory"); __writeMemory32(0x00000008, 0x400E82AC, "Memory"); __writeMemory32(0x00000008, 0x400E82B0, "Memory"); __writeMemory32(0x00000008, 0x400E82B4, "Memory"); __writeMemory32(0x00000008, 0x400E82B8, "Memory"); __writeMemory32(0x00000008, 0x400E82BC, "Memory"); __writeMemory32(0x00000008, 0x400E82C0, "Memory"); __writeMemory32(0x00000008, 0x400E82C4, "Memory"); __writeMemory32(0x00000008, 0x400E82C8, "Memory"); __writeMemory32(0x00000008, 0x400E82CC, "Memory"); __writeMemory32(0x00000008, 0x400E82D0, "Memory"); __writeMemory32(0x00000008, 0x400E82D4, "Memory"); __writeMemory32(0x00000008, 0x400E82D8, "Memory"); __writeMemory32(0x00000008, 0x400E82DC, "Memory"); __writeMemory32(0x00000008, 0x400E82E0, "Memory"); __writeMemory32(0x00000008, 0x400E82E4, "Memory"); __writeMemory32(0x00000008, 0x400E82E8, "Memory"); __writeMemory32(0x00000008, 0x400E82EC, "Memory"); __writeMemory32(0x00000008, 0x400E82F0, "Memory"); __writeMemory32(0x00000008, 0x400E82FC, "Memory"); __writeMemory32(0x00000008, 0x400E8300, "Memory"); __writeMemory32(0x00000008, 0x400E8304, "Memory"); __writeMemory32(0x00000008, 0x400E8308, "Memory"); __writeMemory32(0x00000008, 0x400E830C, "Memory"); __writeMemory32(0x00000008, 0x400E8310, "Memory"); __writeMemory32(0x00000008, 0x400E8314, "Memory"); __writeMemory32(0x00000008, 0x400E8318, "Memory"); __writeMemory32(0x00000008, 0x400E831C, "Memory"); __writeMemory32(0x00000008, 0x400E8320, "Memory"); __writeMemory32(0x00000008, 0x400E8324, "Memory"); __writeMemory32(0x00000008, 0x400E8328, "Memory"); __writeMemory32(0x00000008, 0x400E832C, "Memory"); __writeMemory32(0x00000008, 0x400E8330, "Memory"); __writeMemory32(0x00000008, 0x400E8334, "Memory"); __writeMemory32(0x00000008, 0x400E8338, "Memory"); __writeMemory32(0x00000008, 0x400E833C, "Memory"); __writeMemory32(0x00000008, 0x400E8340, "Memory"); // Config SDR Controller Registers/ __writeMemory32(0x10000004, 0x400d4000, "Memory"); // MCR __writeMemory32(0x00000081, 0x400d4008, "Memory"); // BMCR0 __writeMemory32(0x00000081, 0x400d400C, "Memory"); // BMCR1 __writeMemory32(0x8000001D, 0x400d4010, "Memory"); // BR0, 64MB __writeMemory32(0x00000F32, 0x400d4040, "Memory"); // SDRAMCR0, 32bit __writeMemory32(0x00772A22, 0x400d4044, "Memory"); // SDRAMCR1 __writeMemory32(0x00010A0D, 0x400d4048, "Memory"); // SDRAMCR2 __writeMemory32(0x21210408, 0x400d404C, "Memory"); // SDRAMCR3 __writeMemory32(0x80000000, 0x400d4090, "Memory"); // IPCR0 __writeMemory32(0x00000002, 0x400d4094, "Memory"); // IPCR1 __writeMemory32(0x00000000, 0x400d4098, "Memory"); // IPCR2 __writeMemory32(0xA55A000F, 0x400d409C, "Memory"); // IPCMD, SD_CC_IPREA SDRAM_WaitIpCmdDone(); __writeMemory32(0xA55A000C, 0x400d409C, "Memory"); // SD_CC_IAF SDRAM_WaitIpCmdDone(); __writeMemory32(0xA55A000C, 0x400d409C, "Memory"); // SD_CC_IAF SDRAM_WaitIpCmdDone(); __writeMemory32(0x00000033, 0x400d40A0, "Memory"); // IPTXDAT __writeMemory32(0xA55A000A, 0x400d409C, "Memory"); // SD_CC_IMS SDRAM_WaitIpCmdDone(); __writeMemory32(0x00000017, 0x400d4150, "Memory"); // DCCR __writeMemory32(0x21210409, 0x400d404C, "Memory"); // enable sdram self refresh after initialization done. __message "SDRAM init done"; } restoreFlexRAM() { __var base; __var value; base = 0x400E4000; value = __readMemory32(base + 0x44, "Memory"); value &= ~(0xFFFF); value |= 0xFFAA; __writeMemory32(value, base + 0x44, "Memory"); value = __readMemory32(base + 0x48, "Memory"); value &= ~(0xFFFF); value |= 0xFFAA; __writeMemory32(value, base + 0x48, "Memory"); value = __readMemory32(base + 0x40, "Memory"); value &= ~(0xFF << 8); value |= 0x7 | (0xaa << 8); __writeMemory32(value, base + 0x40, "Memory"); __message "FlexRAM configuration is restored"; } execUserPreload() { restoreFlexRAM(); setSemcClock(); initSDRAM(); } Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 October 2, 2023 Posted October 2, 2023 · Report post Ну так берём и правим под себя. За вас этого никто не сделает. В папке с доками у IAR есть файлик FlashLoaderGuide.ENU.pdf - там всё подробно расписано. Quote Share this post Link to post Share on other sites More sharing options...
jenya7 0 October 2, 2023 Posted October 2, 2023 · Report post On 10/2/2023 at 11:20 AM, VladislavS said: Ну так берём и правим под себя. За вас этого никто не сделает. извиняюсь. ошибся. там указан файл - FlashIMXRT1170_FlexSPI.board <?xml version="1.0" encoding="iso-8859-1"?> <flash_board> <pass> <loader>$TOOLKIT_DIR$\config\flashloader\NXP\FlashIMXRT1170_FlexSPI1.flash</loader> <range>CODE 0x30000000 0x3FFFFFFF</range> </pass> <pass> <loader>$TOOLKIT_DIR$\config\flashloader\NXP\FlashIMXRT1170_FlexSPI2.flash</loader> <range>CODE 0x60000000 0x6F7FFFFF</range> </pass> </flash_board> и не понятно какой из двух он выбирает и на основании чего. а тот файл который я указал - это mac файл, скрипт для J-LINK как я понимаю. Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 October 2, 2023 Posted October 2, 2023 · Report post раз у вас флэшка на SPI1 работает, то алгоритм прошивки для неё есть. Вам надо перенастроить в .board адреса и в .mac инциализацию на SPI2. Quote Share this post Link to post Share on other sites More sharing options...
jenya7 0 October 2, 2023 Posted October 2, 2023 · Report post On 10/2/2023 at 11:32 AM, VladislavS said: раз у вас флэшка на SPI1 работает, то алгоритм прошивки для неё есть. Вам надо перенастроить в .board адреса и в .mac инциализацию на SPI2. я не могу понять откуда он тянет mac. ни тот который в папке проекта ни системный не настраивают пины FlexSPI. Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 October 2, 2023 Posted October 2, 2023 · Report post В файл FlashIMXRT1170_FlexSPI2.flash загляните Quote Share this post Link to post Share on other sites More sharing options...
jenya7 0 October 2, 2023 Posted October 2, 2023 · Report post On 10/2/2023 at 11:50 AM, VladislavS said: В файл FlashIMXRT1170_FlexSPI2.flash загляните <?xml version="1.0" encoding="iso-8859-1"?> <flash_device> <exe>$TOOLKIT_DIR$\config\flashloader\NXP\FlashIMXRT1170_FlexSPI.out</exe> <page>256</page> <block>1 0x0F800000</block> <flash_base>0x60000000</flash_base> <macro>$TOOLKIT_DIR$\config\flashloader\NXP\FlashIMXRT1170_FlexSPI.mac</macro> <aggregate>1</aggregate> <args_doc>To specify the connected memory use the flash loader with one of the following args: "--Qspi" - QuadSPI NOR - Quad SDR Read (same if no arg is used) "--QspiDDR" - QuadSPI NOR - Quad DDR Read "--Hyper1V8" - HyperFLASH 1V8 "--Hyper3V0" - HyperFLASH 3V0 "--MxicOpiDDR"- MXIC OPI DDR (OPI DDR enabled by default) "--McrnOct" - Micron Octal DDR "--McrnOpi" - Micron OPI DDR "--McrnOpiDDR"- Micron OPI DDR (DDR read enabled by default): "--AdstOpi" - Adesto OPI DDR "--Opt0 0x..."- set Option0 hex value "--Opt1 0x..."- set Option1 hex value For more info refer to IMXRT1170 ROM API specification</args_doc> </flash_device> не пойму как указать ему чтоб взял FlashIMXRT1170_FlexSPI2.flash. кроме того FlashIMXRT1170_FlexSPI.mac - совсем не про FlexSPI_2 _disableM4Cache() { __writeMemory32(0x00000000,0xE0082000,"Memory"); __writeMemory32(0x00000000,0xE0082800,"Memory"); } _disableM7Cache() { __var tmp; tmp = __readMemory32(0xE000ED14,"Memory") & ~(3<<16); __writeMemory32(tmp,0xE000ED14,"Memory"); } execUserFlashInit() // Called by debugger before loading flash loader in RAM. { __var tmp; __var cpu; cpu = __readMemory32(0xE000ED00,"Memory")>>4; cpu &= 0xFFF; /*Make sure both cores are stopped*/ tmp = __readMemory32(0x40c04000,"Memory"); // if(tmp & 0x2) { _haltM7Core(); } if(tmp & 0x1) { _haltM4Core(); } if(0xC24 == cpu) { _disableM4Cache(); } else { _disableM7Cache(); } } Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 October 2, 2023 Posted October 2, 2023 · Report post Кстати, в "arm\src\flashloader\NXP\FlashIMXRT1170_FlexSPI" лежат исходники FlashLoader-а. Можете посмотреть до последней команды что он делает. 2 минуты назад, jenya7 сказал: не пойму как указать ему чтоб взял FlashIMXRT1170_FlexSPI2.flash У вас же в .board написано, что для адресов 0x60000000+ его использовать. Quote Share this post Link to post Share on other sites More sharing options...