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

grv

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

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Частый гость
    Частый гость
  1. Подскажите, нужно на борту прибора иметь УЗО типа АС. Планируется поставить кольцо через которое пройдет фаза и нейтраль , дальше сигнал усилить. Какой материал использовать в качестве сердечника и как такой трансформатор рассчитать ?
  2. Чтоб не плодить тему, аналогичная задача Вход 24В +-10% Выход 48В 15-20Вт Не изолированный , общий плюс, т.е. вход -24, выход -48 Что посоветуете ? Критерий - простота , надежность, повторяемость. Цена вторична.
  3. Вроде разобрался. Ситуация конечно плачевная, суть в следующем: Грабли таятся в 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 все-таки работает
  4. Есть довольно увесистый проект 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 ?
  5. :) 96 бит многовоато. И хочется чтоб подряд шло. Такая уж традиция спасибо, гляну. Да у меня где то даже такое есть писаное еще на TP6 под AVR. Правда с нуля нверное проще написать чем вспоминать Паскаль
  6. STM32. Сериализация изделия.

    Коллеги, подскажите кто что использует для сериализации ? Есть самописный бутлоадер для STM32f. Его нужно прошивать в партии изделий методом "нажать 1 кнопку" В каждый прошитый проц нужно класть уникальный uint16_t по фиксированному адресу. Пока рассматриваю вариант набросать что то на С# которое при запуске будет читать ID с файла, запускать ST-LINK_CLI.exe, прошивать загрузчик, затем модифицировать два байта через -w8, защищать от чтения. Если завершилось успешно, модифицируем ID в файле и отваливаемся. Если нет просто отваливаемся сказав оператору об ошибке. Или может уже что-то уже изобретено ? Может кто то писал утилитку "изменить два байта в HEX-е" :)
  7. STM32 flash

    Пардон, вопрос снят, попутал 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 */
  8. 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 раз ?
  9. +100500 У меня сейчас в некоторых проектах стоит mega162 которая пришла на смену 161-ой + танцы с бубном на рехтование "pin-to-pin". Аналогичная ситуация с atmega128->atmega128a, до сих пор кстати так и не разобрался, не запускается бутлоадер на 128а, но пока есть запас 128 как то руки не дошли.... +Весь остальной негатив который скопился за время общения с атмелом благодатно повлияло на решение "куда крестянину податься" в xmega или arm. Cейчас сижу на stm32 чему очень рад. Не знаю что такое пикоповер, но в стм-ах можно отрубать практически всю перефирию если хочется снизить потребление. На каждую единицу аппартной части есть свой рубильник.
  10. Коллеги, поскажите. Есть вполне увесистый проект на stm32f207 + FREERTOS + Keil к которому нужно прикрутить SD-карту для чтения файлов конфигураций/ записи логов, т.е. особых требований к производительности нет. Единственное логи должны писаться с нескольких задач. Вопросы: 1.какую FS выбрать ? -FatFS (есть опыт работы в суперлупе) - Keil RL-FlashFS - Super Lean FAT File System (есть на сайте FREERTOS) - другое 2.соит ли заморачиваться с подключением по SDIO, либо оставить все на SPI ?
  11. Подскажите , кто занимался, тут коллеги спрашивают, можно ли поменять в готовом устройстве ADM6993 на ADM6993F можно или могут быть "подробности" ? При беглом просмотре даташитов "F" обнаружен только канал OAM engine.
  12. falc56

    Тут такое дело, старая железяка выпускалась очень долго на falc56 v1.2 , наконец то они закончились нужно переехать на falc56 v2.2 Подскажите следующее: Имеется Version 2.2 Data Sheet, Rev. 1.1, June 2005 Это последний DS ? Поделитесь пожалуйста эрратами и калькулятором для расчета частоты на [email protected]. Спасибо.
  13. Похоже так и прийдется поступить, спс.
  14. Ого, как то сильно радикально. Тут наверное трудно возразить, но как говориться на переправе коней не меняют.
  15. Сyclone2 PCM это ИКМ только не в привычных 2,048МГц а 16,384МГц По поводу синхронизации Один интерфейс Source-Synchronus Output Остальные N интерфейсов являются System-Synchronus Output Отдельной системной частоты нет. Используется либо с интерфейса Source-Synchronus Output либо с него же уможенная на 4. 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.
×
×
  • Создать...