Jump to content

    

grv

Участник
  • Content Count

    100
  • Joined

  • Last visited

Community Reputation

0 Обычный

About grv

  • Rank
    Частый гость
  1. Чтоб не плодить тему, аналогичная задача Вход 24В +-10% Выход 48В 15-20Вт Не изолированный , общий плюс, т.е. вход -24, выход -48 Что посоветуете ? Критерий - простота , надежность, повторяемость. Цена вторична.
  2. Цитата(SMaster @ Jan 15 2016, 05:38) Я думаю, что с этим у вас все правильно, но все же на всякий случай: все обработчики прерываний, вызывающие API-шные функции операционки, используют специализированные функции с окончанием FromISR()? Все такие функции имеют приоритет 11 и выше (численно)? Вроде разобрался. Ситуация конечно плачевная, суть в следующем: Грабли таятся в Trace. При определении в настойках USE_PRIMASK_CS 0 в прерываниях в теле функций типа xSemaphoreGiveFromISR() используются макросы portENTER_CRITICAL/ portEXIT_CRITICAL чего делать категорически нельзя. Этими макросами трейс защищает свою критическую секцию. Но при выходе из portEXIT_CRITICAL мы гарантированно имеем BASEPRI=0, и в далее идущую часть критического кода xSemaphoreGiveFromISR врезается высокоприоритетное прерывание что у меня приводило к повреждениям списков задач и далее вылетало в BUSFAULT. Когда не было вложенных прерываний естественно все классно работало. Код#if ((SELECTED_PORT == PORT_ARM_CortexM) && (USE_PRIMASK_CS == 1)) #define TRACE_SR_ALLOC_CRITICAL_SECTION() int __irq_status; #define TRACE_ENTER_CRITICAL_SECTION() { __irq_status = prvTraceGetIRQMask(); prvTraceDisableIRQ(); } #define TRACE_EXIT_CRITICAL_SECTION() { prvTraceSetIRQMask(__irq_status); } #define trcCRITICAL_SECTION_BEGIN_ON_CORTEX_M_ONLY trcCRITICAL_SECTION_BEGIN #define trcCRITICAL_SECTION_END_ON_CORTEX_M_ONLY trcCRITICAL_SECTION_END #else #define TRACE_ENTER_CRITICAL_SECTION() portENTER_CRITICAL() #define TRACE_EXIT_CRITICAL_SECTION() portEXIT_CRITICAL() #define trcCRITICAL_SECTION_BEGIN_ON_CORTEX_M_ONLY() recorder_busy++; #define trcCRITICAL_SECTION_END_ON_CORTEX_M_ONLY() recorder_busy--; #endif Ставить USE_PRIMASK_CS 1 это с пушки по воробьям, теряется тогда идея "всегда разрешенных прерываний" приоритетом выше MAXSYSCALL Пока поставил так (изменил вариант для USE_PRIMASK_CS 1), грабли ушли: Код#if ((SELECTED_PORT == PORT_ARM_CortexM) && (USE_PRIMASK_CS == 1)) #define TRACE_SR_ALLOC_CRITICAL_SECTION() int __irq_status; //#define TRACE_ENTER_CRITICAL_SECTION() { __irq_status = prvTraceGetIRQMask(); prvTraceDisableIRQ(); } #define TRACE_ENTER_CRITICAL_SECTION() { __irq_status = portSET_INTERRUPT_MASK_FROM_ISR(); } //#define TRACE_EXIT_CRITICAL_SECTION() { prvTraceSetIRQMask(__irq_status); } #define TRACE_EXIT_CRITICAL_SECTION() { portCLEAR_INTERRUPT_MASK_FROM_ISR(__irq_status); } #define trcCRITICAL_SECTION_BEGIN_ON_CORTEX_M_ONLY trcCRITICAL_SECTION_BEGIN #define trcCRITICAL_SECTION_END_ON_CORTEX_M_ONLY trcCRITICAL_SECTION_END #else #define TRACE_ENTER_CRITICAL_SECTION() portENTER_CRITICAL() #define TRACE_EXIT_CRITICAL_SECTION() portEXIT_CRITICAL() #define trcCRITICAL_SECTION_BEGIN_ON_CORTEX_M_ONLY() recorder_busy++; #define trcCRITICAL_SECTION_END_ON_CORTEX_M_ONLY() recorder_busy--; #endif Одно хорошо, за неделю ковыряний нашел у себя небольшую тележку багов по-меньше и перешел на advanced level в части понимания как FREERTOS все-таки работает
  3. Есть довольно увесистый проект stm32f207+freertos 8.0.1+Keil 4.6 Вылетает в bus fault. Причем только после того как начинаю включать вложенные прерывания. Пока все прерывания сидят в приоритете 15(Тик ртоса и мои таймера/уарты) работает нормально. Как только любому из моих прерываний даю приоритет 14(вывел на джампер GPIOE->IDR & Key_K1) либо всем, сразу валится в эксепшин, причем не сразу а через 5-10 мин как "звезды станут в ряд" Дошел до следующего, в процедуре xPortPendSVHandler в pxCurrentTCB после переключения контекста попадает NULL, далее подтягивается с нулевого адреса начальное значение стека MSP вместо стека задачи, и при попытке восстановить стек задачи с адреса 0x20020000 валится в BUS FAULT (это я спецом под стек выделил все оставшееся ОЗУ, до этого валилось в USAGE FAULT когда восстанавливало стек из неиспользуемого места ОЗУ) Код__asm void xPortPendSVHandler( void ) {     extern uxCriticalNesting;     extern pxCurrentTCB;     extern vTaskSwitchContext;     PRESERVE8     mrs r0, psp     isb     ldr    r3, =pxCurrentTCB        /* Get the location of the current TCB. */     ldr    r2, [r3]     stmdb r0!, {r4-r11}            /* Save the remaining registers. */     str r0, [r2]                /* Save the new top of stack into the first member of the TCB. */     stmdb sp!, {r3, r14}     mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY     msr basepri, r0     bl vTaskSwitchContext     mov r0, #0     msr basepri, r0     ldmia sp!, {r3, r14}     ldr r1, [r3] ; ***************my start     cmp R1,#0     bne l22     nop;-------------------------------------------------------- Здесь поставил бреакпоинт     nop l22     ; ***************my finish          ldr r0, [r1]                /* The first item in pxCurrentTCB is the task top of stack. */ ;----------------Вылетает при  следующей команде ; R0=0x20020000  - следующий адрес за  внутренним ОЗУ     ldmia r0!, {r4-r11}            /* Pop the registers and the critical nesting count. */     msr psp, r0     isb     bx r14     nop } Настройка прерываний При старте до старта ртоса Код   RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); // 4 preeptive  4 subpriority Код#define configKERNEL_INTERRUPT_PRIORITY         255 #define configMAX_SYSCALL_INTERRUPT_PRIORITY     191 /* equivalent to 0xb0, or priority 11. */ #define configLIBRARY_KERNEL_INTERRUPT_PRIORITY    15 Конфигурация таймера(ов) Используются как внешние прерывания по уровню. Кодvoid Tim9_IT_init (void) {          TIM_TimeBaseInitTypeDef timStruct;     TIM_ICInitTypeDef timicStruct;     NVIC_InitTypeDef nvicStructure;          // Alternative function     GPIOE->AFR[0] &= ~(GPIO_AFRL_AFRL6  );     GPIOE->AFR[0] |= ((GPIO_AFRL_AFRL6 & 0x33333333) ); // PE6 - AF3          GPIOE->MODER&=~GPIO_MODER_MODER6;     GPIOE->MODER|=GPIO_MODER_MODER6_1;               RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE);     timStruct.TIM_Prescaler=0;     timStruct.TIM_CounterMode=TIM_CounterMode_Up;     timStruct.TIM_Period=10;     timStruct.TIM_ClockDivision=TIM_CKD_DIV1;     timStruct.TIM_RepetitionCounter=0; // doesn't matter     TIM_TimeBaseInit(TIM9, &timStruct);                   // Gated mode     //timicStruct.TIM_Channel=TIM_Channel_1;     timicStruct.TIM_Channel=TIM_Channel_2;     timicStruct.TIM_ICPolarity=TIM_ICPolarity_Falling;     timicStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;     timicStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;     timicStruct.TIM_ICFilter=0;     TIM_ICInit(TIM9,&timicStruct);               //TIM_SelectInputTrigger(TIM9,TIM_TS_TI1FP1);     TIM_SelectInputTrigger(TIM9,TIM_TS_TI2FP2);     TIM_SelectSlaveMode(TIM9,TIM_SlaveMode_Gated);             //5. Enable the corresponding interrupt using the function TIM_ITConfig(TIMx, TIM_IT_Update)      //    TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //    TIM_ITConfig(TIM4, TIM_IT_Update,ENABLE);          // interrupt             //4. Enable the NVIC if you need to generate the update interrupt.                  nvicStructure.NVIC_IRQChannel = TIM1_BRK_TIM9_IRQn;         if (GPIOE->IDR & Key_K1)             {             nvicStructure.NVIC_IRQChannelPreemptionPriority = 15;         }         else         {             nvicStructure.NVIC_IRQChannelPreemptionPriority = 14;         }     nvicStructure.NVIC_IRQChannelSubPriority = 0;     nvicStructure.NVIC_IRQChannelCmd = ENABLE;     NVIC_Init(&nvicStructure);                     //6. Call the TIM_Cmd(ENABLE) function to enable the TIM counter.                TIM_Cmd(TIM9,ENABLE);      } Стеки задач с запасом где то минимум на 50 байт (видно по статистике когда нет вложенных прерываний, проект живет сутками) Стек MSP вообще сейчас вся оставшаяся память - 7кб Куча стартапа - 1кб, но я так понимаю она используется только при либовских Malloc которую я не использую. Вместо них я использую ртосовскую, там где то свободных 10кб. Собственно вопрос , что теперь с этим делать и куда рыть ? Каким образом в pxCurrentTCB может попасть 0 ? В моем понимании если даже все мои задачи в ожидании , должна крутиться Idle ?
  4. Цитата(mantech @ Oct 27 2015, 23:32) А "встроенный" в проц серийный номер не помогает? 96 бит многовоато. И хочется чтоб подряд шло. Такая уж традиция Цитата(scifi @ Oct 27 2015, 23:36) Есть такая утилитка. Называется srec_cat. Но это не для изнеженной виндой публики, хоть и бинарник для винды имеется. спасибо, гляну. Цитата(kolobok0 @ Oct 28 2015, 01:25) там писать от силы пол-часа с вашими локальными извратами. формат открыт, самое сложное - перевод в шестнадцатиричное значение байта. Да у меня где то даже такое есть писаное еще на TP6 под AVR. Правда с нуля нверное проще написать чем вспоминать Паскаль
  5. Коллеги, подскажите кто что использует для сериализации ? Есть самописный бутлоадер для STM32f. Его нужно прошивать в партии изделий методом "нажать 1 кнопку" В каждый прошитый проц нужно класть уникальный uint16_t по фиксированному адресу. Пока рассматриваю вариант набросать что то на С# которое при запуске будет читать ID с файла, запускать ST-LINK_CLI.exe, прошивать загрузчик, затем модифицировать два байта через -w8, защищать от чтения. Если завершилось успешно, модифицируем ID в файле и отваливаемся. Если нет просто отваливаемся сказав оператору об ошибке. Или может уже что-то уже изобретено ? Может кто то писал утилитку "изменить два байта в HEX-е"
  6. STM32 flash

    Цитата(scifi @ Oct 20 2015, 10:06) Вы, похоже, не читали код и комментарии в нём. Там сказано, что эта функция стирает все секторы. То есть цикл перебирает эти секторы. Если посмотрите, что такое FLASH_Sector_0, FLASH_Sector_1 и т.д., то увидите, что это арифметическая прогрессия с разностью 8. Так что всё сходится. Пардон, вопрос снят, попутал FLASH_Sector_1 с #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbyte */ #define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbyte */ #define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbyte */
  7. STM32 flash

    Что-то пример от ST мня загоняет в ступор это процедура стирания флеша из исходника к AN3374 STM32F2xx in-application programming using the USART Код/**   * @brief  This function does an erase of all user flash area   * @param  StartSector: start of user flash area   * @retval 0: user flash area successfully erased   *         1: error occurred   */ uint32_t FLASH_If_Erase(uint32_t StartSector) {   uint32_t UserStartSector = FLASH_Sector_1, i = 0;   /* Get the sector where start the user flash area */   UserStartSector = GetSector(APPLICATION_ADDRESS);   for(i = UserStartSector; i <= FLASH_Sector_11; i += 8)   {     /* Device voltage range supposed to be [2.7V to 3.6V], the operation will        be done by word */     if (FLASH_EraseSector(i, VoltageRange_3) != FLASH_COMPLETE)     {       /* Error occurred while page erase */       return (1);     }   }      return (0); } Зачем там i+=8 ? Ну i+=4 я бы еще как то понял, т.к. запись далее идет по 32 бита. Но сектор же стирается целиком ? Зачем вызывать процедуру стирания sectorlen/8 раз ?
  8. Ну , что прощаемся с Atmel ?

    Цитата(aaarrr @ Oct 2 2015, 16:57) Ага, многие помнят как оно "заменялось". +100500 У меня сейчас в некоторых проектах стоит mega162 которая пришла на смену 161-ой + танцы с бубном на рехтование "pin-to-pin". Аналогичная ситуация с atmega128->atmega128a, до сих пор кстати так и не разобрался, не запускается бутлоадер на 128а, но пока есть запас 128 как то руки не дошли.... +Весь остальной негатив который скопился за время общения с атмелом благодатно повлияло на решение "куда крестянину податься" в xmega или arm. Cейчас сижу на stm32 чему очень рад. Цитата(zombi @ Oct 2 2015, 19:47) Вы вопрос читали? Малое потребление ядра нужно только во время сна с работающим RTC при питании от батарейки. Причём тут периферия? Не знаю что такое пикоповер, но в стм-ах можно отрубать практически всю перефирию если хочется снизить потребление. На каждую единицу аппартной части есть свой рубильник.
  9. Коллеги, поскажите. Есть вполне увесистый проект на stm32f207 + FREERTOS + Keil к которому нужно прикрутить SD-карту для чтения файлов конфигураций/ записи логов, т.е. особых требований к производительности нет. Единственное логи должны писаться с нескольких задач. Вопросы: 1.какую FS выбрать ? -FatFS (есть опыт работы в суперлупе) - Keil RL-FlashFS - Super Lean FAT File System (есть на сайте FREERTOS) - другое 2.соит ли заморачиваться с подключением по SDIO, либо оставить все на SPI ?
  10. Подскажите , кто занимался, тут коллеги спрашивают, можно ли поменять в готовом устройстве ADM6993 на ADM6993F можно или могут быть "подробности" ? При беглом просмотре даташитов "F" обнаружен только канал OAM engine.
  11. falc56

    Тут такое дело, старая железяка выпускалась очень долго на falc56 v1.2 , наконец то они закончились нужно переехать на falc56 v2.2 Подскажите следующее: Имеется Version 2.2 Data Sheet, Rev. 1.1, June 2005 Это последний DS ? Поделитесь пожалуйста эрратами и калькулятором для расчета частоты на anteynet@ukr.net. Спасибо.
  12. Цитата(Timmy @ Sep 27 2013, 18:03) А предложение делать всё на высокой внутренней частоте полностью поддерживаю. Можно захватывать клоки на 200 МГц DDR с ошибкой всего +-1.25 нс. Похоже так и прийдется поступить, спс.
  13. Цитата(alexadmin @ Sep 26 2013, 17:26) Клок на 16 МГц это не клок, а недоразумение. Сделайте свой собственный внутренний клок на 100-150 МГц, сэмплируйте ваши клоки, выделяйте фронт (на логике) и в нужный момент (с задержкой 2-3 такта) сэмплируйте данные. Каждый выявленный фронт используйте как clock-enable для остальной части алгоритма. Ого, как то сильно радикально. Цитата(alexadmin @ Sep 26 2013, 17:26) ahdl хорош тем, что вскоре можно стать уникальным специалистом, одним из немногих, которые его знают Типа как с коболом. Но у кобола, говорят, есть и другие плюсы, а тут нет. Тут наверное трудно возразить, но как говориться на переправе коней не меняют.
  14. Цитата(Sergey_Bekrenyov @ Sep 25 2013, 21:20) cyclone3 или 2? системные такты у Вас какие? upd PCM это ИКМ? Сyclone2 PCM это ИКМ только не в привычных 2,048МГц а 16,384МГц По поводу синхронизации Один интерфейс Source-Synchronus Output Остальные N интерфейсов являются System-Synchronus Output Отдельной системной частоты нет. Используется либо с интерфейса Source-Synchronus Output либо с него же уможенная на 4. Цитата(Torpeda @ Sep 26 2013, 10:19) 1) Если клок мультиплексоры не переключаются на лету - то да - всё ОК. Чтобы клоки на лету переключать без гличей нужны специальные схемы... но тоже можно.... 2) тулза сама должна выполнить все временные требован ... всякие ручные плейсменты - это скорее способ пофиксить пару последних ошибок..... У вас как клоки обконстрейнены (лутше в SDC формате)? 1. Там даже если переключить на лету что обычно делается при отладке ничего страшного не произойдет, на следующем фрейме все устаканиться. 2) Вот теперь о наболевшем - констрейнах. У меня режимы циклона задаются STM32 по FSMC(контролер внешней памяти) в режиме SRAM, Intel8/Mux т.е. A[], D[], ALE(NADV), RD, WR, CS. На сколько я разобрался сия шина является асинхронной и обконстрейнить его можно замахаться. Пока сделал "на шару" ибо с констрейнами первый раз дружусь. create_clock -name {_FSMC_NADV} -period 66.666 [get_ports {FSMC_NADV}] create_clock -name {_FSMC_WR} -period 66.666 [get_ports {FSMC_WR}] set_false_path -from [get_clocks {_FSMC_WR}] -to [all_registers] set_false_path -from [get_clocks {_FSMC_NADV}] -to [all_registers] Теперь по клокам. На входе стоит мультиплексор , без него врядле получиться т.к. всего в девайсе 9 PCM шин каждая из которых может быть мастером и слейвом. Соответственно все PCMx.CLK двунаправленные, один всегда является входом остальные - выходами, т.е. клок проходит через циклон. Входные частоты описал так create_clock -name {_DSL_CX[0]} -period 61.035 [get_ports {DSL_CX[0]}] create_clock -name {_DSL_CX[1]} -period 61.035 [get_ports {DSL_CX[1]}] create_clock -name {_DSL_CX[2]} -period 61.035 [get_ports {DSL_CX[2]}] create_clock -name {_DSL_CX[3]} -period 61.035 [get_ports {DSL_CX[3]}] create_clock -name {_SLOT_PIN21[0]} -period 61.035 [get_ports {SLOT_PIN21[0]}] create_clock -name {_SLOT_PIN21[1]} -period 61.035 [get_ports {SLOT_PIN21[1]}] create_clock -name {_SLOT_PIN21[2]} -period 61.035 [get_ports {SLOT_PIN21[2]}] create_clock -name {_SLOT_PIN21[3]} -period 61.035 [get_ports {SLOT_PIN21[3]}] create_clock -name {_SLOT_PIN21[4]} -period 61.035 [get_ports {SLOT_PIN21[4]}] Теперь вопрос, как описать выходные ? Для каждого из 9-ти PCMx.CLK описывать 8 клоков от остальных PCM тип такого: create_generated_clock -name _slot0_dsl0 -source [get_nets {pcm0_mxclk|lpm_mux_component|auto_generated|result_node[0]~6clkctrl}] -master_clock _SLOT_PIN21[0] [get_ports {DSL_CX[0]}] -add Это ж пардон 9*8=72 клока. И еще, Синтезатор про pcm0_mxclk|lpm_mux_component|auto_generated|result_node[0]~6clkctrl ничего не знает и выдает варнинг что клок проигнорирован. Ну оно и понятно почему. С другой стороны в Таймквесте выход мультиплексора по другому не вытянешь, т.к. триггеров в нем нет, только get_nets. Как поступить чтоб всех удовлетворить ? Какие то особенности есть при описании клоков с bidir пинами ? Проект на ahdl.
  15. Цитата(Sergey_Bekrenyov @ Sep 25 2013, 17:17) У меня ClockControl переключает между удвоенной и обычной частотой (54 и 108 МГц). Все нормально работает У Вас какие частоты? Не проще завести системную частоту заведомо выше всех остальных, из приходящих частот формировать узкий импульс шириной в 1 такт системной частоты и от него работать? Немного не понял, но скорее всего не получиться. Есть 4 PCM шины 16Мгц. В самом худшем режиме их нужно объединить в одну 64Мгц и отдать дальше, все вроде не сложно, На PLL сделал умножитель на 4, но вот как глянул на временые диаграмы тихо содрагнулся, задержки более чем на такт 64М , те T=15,6нс, а у меня клок гуляет от входа до выхода порядка 12нс, данные еще больше. Не говоря о том что данные защелкиваются по другому фронту, т.е. на 0,5Т (это мультициклом помоему здесь обзывают ).