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

Boriska

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

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник
    Участник
  1. FreeRTOS 9.0 Static

    Что-то я в этих стеках не очень понимаю. Может подскажите, где можно прочитать? Что и кто туда пишет? Локальные переменные данной задачи? Значения регистров, при вызове прерываний, во время активности задачи?
  2. FreeRTOS 9.0 Static

    В новой версии FreeRTOS 9.0 появилась возможность выделять память (под задачи/очереди и т.д.) статически. Подскажите, как определить оптимальный размер памяти под стек задачи? Ну, кроме как ловить vApplicationStackOverflowHook? Может есть какая-то методика?
  3. Это скорее зависит от программатора. ST-LINK Discovery и китайский J-link работают без 3.3V. А вот китайский ST-LINK - отказывается.
  4. Спасибо за подсказки. В очередной раз перепаял конденсаторы на 6.2 пф, но уже с канифолью и 10 раз протер место пайки ацетоном. Помогло. Похоже, в первый раз ФТС плохо промылся. Надо какой-то другой флюс попробовать.
  5. LSE на STM32F407

    Есть две одинаковые платы на STM32F407. На одной часы работают. На второй - категорически отказываются. Кварц KX-38 32.768 kHz, 6pf Пробовал конденсаторы 3.9, 5.6, 6.2, 22pf. Пробовал другие noname кварцы. Ничего не помогает. LSERDY не устанавливается. Подскажите, на что еще стоит обратить внимание?
  6. В том и проблема, что ссылка идет на адрес 0x24...... (это за пределами встроенной оперативки). При том, что код выполняется с flash. В руководстве написано, что при IBUSERR, адрес возникновения ошибки определить не получится. Я подумал, что может с помощью memory protection unit можно защитить этот сегмент памяти, так, чтобы при обращении к нему происходила остановка? Вот только нигде не нашел как с этим MPU работать.
  7. Отладка STM32 в Keil

    При выполнении программы постоянно возникает ошибка IBUSERR. Во время HardFault в стеке содержится один и тот же адрес PC = 0x24.... А вот откуда программа попадает на этот адрес - не понятно. Проект большой, на FreeRTOS. Используется STM32F407. Подскажите, какие способы отладки можно применить в данном случае? Можно ли воспользоваться MPU, а если можно, то как?
  8. STM32F103 + CAN

    Вопрос снимается. Причина глюков: непропай или остатки флюса. Помогла перепайка трансивера.
  9. STM32F103 + CAN

    Есть 3 устройства с разными прошивками на одной шине CAN. Они нормально работали. Теперь одно не работает (1), а два других продолжают функционировать в штатном режиме. Пытаюсь разобраться, что я такое мог изменить в коде, что оно перестало работать? Если на шине 3 устройства, то первое (которое глючит) получает пакеты. Если оставить первое и второе, то пакеты перестают получаться. Отправка с первого устройства не работает в обоих случаях (анализатор показывает, что на шину ничего не передается). CAN_MSR->INAK == 1 (Висит в режиме инициализации) CAN_MCR->INRQ == 0 CAN_MCR->ABOM == 1 CAN_MCR->NART == 0 CAN_MCR->DBF == 1 В Loop mode отправка/получение работают. Может трансивер умирает? Что и как можно продиагностировать? Приду домой, запаяю копию платы, чтобы проверить железо. Но есть подозрение, что где-то в коде накосячил. Хотя код инициализации шины и все низкоуровневые процедуры не трогал.
  10. Возник вопрос в тему. Подскажите, как паять термал пад cc1101 в домашних условиях? В референс дизайне у них termal vias закрыты паяльной маской. Не уплывет ли микросхема, если излишкам припоя некуда будет уходить? Или паяльную пасту нужно очень аккуратно дозировать?
  11. Hardfault STM32F4 Keil

    Это я читал. Не помогает. Спасибо за подсказку. Сейчас смотрю на PSP и MSP, но указатели на стек ссылаются на фрагменты памяти, где PC = 0 или PC=0x76432320, что не похоже на область, откуда может выполняться код. Не понятно, какая инструкция вызвала ошибку.
  12. Hardfault STM32F4 Keil

    Подскажите, как идентифицировать ошибку и найти место ее возникновения. Обработчик: void HardFault_Handler(unsigned long *hardfault_args){ volatile unsigned long stacked_r0; volatile unsigned long stacked_r1; volatile unsigned long stacked_r2; volatile unsigned long stacked_r3; volatile unsigned long stacked_r12; volatile unsigned long stacked_lr; volatile unsigned long stacked_pc; volatile unsigned long stacked_psr; volatile unsigned long _CFSR; volatile unsigned long _HFSR; volatile unsigned long _DFSR; volatile unsigned long _AFSR; volatile unsigned long _BFAR; volatile unsigned long _MMAR; stacked_r0 = ((unsigned long)hardfault_args[0]); stacked_r1 = ((unsigned long)hardfault_args[1]); stacked_r2 = ((unsigned long)hardfault_args[2]); stacked_r3 = ((unsigned long)hardfault_args[3]); stacked_r12 = ((unsigned long)hardfault_args[4]); stacked_lr = ((unsigned long)hardfault_args[5]); stacked_pc = ((unsigned long)hardfault_args[6]); stacked_psr = ((unsigned long)hardfault_args[7]); // Configurable Fault Status Register // Consists of MMSR, BFSR and UFSR _CFSR = (*((volatile unsigned long *)(0xE000ED28))); // Hard Fault Status Register _HFSR = (*((volatile unsigned long *)(0xE000ED2C))); // Debug Fault Status Register _DFSR = (*((volatile unsigned long *)(0xE000ED30))); // Auxiliary Fault Status Register _AFSR = (*((volatile unsigned long *)(0xE000ED3C))); // Read the Fault Address Registers. These may not contain valid values. // Check BFARVALID/MMARVALID to see if they are valid values // MemManage Fault Address Register _MMAR = (*((volatile unsigned long *)(0xE000ED34))); // Bus Fault Address Register _BFAR = (*((volatile unsigned long *)(0xE000ED38))); __asm("BKPT #0\n"); // Break into the debugger } Но стек пустой - Подскажите, в чем может быть проблема?
  13. Задача решилась. Пока отлаживал, случайно удалил строчку TIM_DMACmd(TIM2, TIM_DMA_CC2, ENABLE); ;)
  14. STM32F103 PWM input + DMA

    Пытаюсь прочитать данные с датчика влажности AM2302, но чтобы не нагружать процессор, хочу задействовать DMA. Но вот что-то данные не читаются. Через прерывания все нормально, а через DMA - не получается. Массив данных остается пустым. Подскажите, в чем может быть дело? RCC_APB2PeriphClockCmd(AM2302_RCC, ENABLE); GPIO_InitStructure.GPIO_Pin = AM2302_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(AM2302_GPIO_PORT, &GPIO_InitStructure); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA1_Channel7); DMA_StructInit(&DMA_InitStructure); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&TIM2->CCR1); DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DeltaBuffer[0]; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = DELTA_SAMPLES; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 16-bit DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel7, &DMA_InitStructure); /* TIM2 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); TIM_Cmd(TIM2, DISABLE); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_SetCounter(TIM2,0); /* Channel configuration */ TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x04; TIM_PWMIConfig(TIM2, &TIM_ICInitStructure); TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2); TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); memset((void *)&DeltaBuffer, 0, DELTA_SAMPLES); //Data request from AM2302 GPIO_InitStructure.GPIO_Pin = AM2302_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(AM2302_GPIO_PORT, &GPIO_InitStructure); GPIO_ResetBits(AM2302_GPIO_PORT, AM2302_PIN); delay10us(100); TIM_Cmd(TIM2, ENABLE); DMA_Cmd(DMA1_Channel7, ENABLE); //Waiting for data GPIO_InitStructure.GPIO_Pin = AM2302_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(AM2302_GPIO_PORT, &GPIO_InitStructure); delay10us(50000);
  15. В принципе, нормально. Только может значения CONF_MODE переименовать, чтобы было понятнее? А то IN_ANAL как-то режет глаз ;) Да и AO_PP02 менее понятно, чем GPIO_Speed_50MHz. Иногда, в проекте под каждый датчик/исполнительное устройство есть отдельный файл, а то и несколько. Как в этом случае задавать настройки: какие порты и другие ресурсы контроллера будут использоваться этим датчиком? Если это делать в заголовочном (*.h) файле самого датчика, то иногда возникают ситуации, когда одни и те же ресурсы используются одновременно несколькими устройствами. Меня подмывает перенести все дефайны распределения ресурсов в один заголовочный файл. Стоит так делать? Может есть что-нибудь вроде "Best practices in embedded systems programming" для начинающих? Посоветуйте.
×
×
  • Создать...