Jump to content

    

b-volkov

Свой
  • Posts

    195
  • Joined

  • Last visited

Reputation

0 Обычный

About b-volkov

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

Контакты

  • Сайт
    Array

Информация

  • Город
    Array

Recent Profile Visitors

2,442 profile views
  1. Разобрался, вроде. Собственно, я из STM32Cube и взял код инициализации, но не учел, что HAL_RTC_Init() вызывает пользовательскую функцию HAL_RTC_MspInit(), в которой происходила инициализация backup-домена и LSE. У меня в проекте ее не было ,стояла просто "затычка". Всем спасибо!
  2. Сначала попробовал проинициализировать RTC сам, на уровне регистров: PWR->CR1 |= PWR_CR1_DBP; RCC->BDCR |= RCC_BDCR_RTCEN; RCC->BDCR &= ~RCC_BDCR_RTCSEL_1; RCC->BDCR |= RCC_BDCR_RTCSEL_0; //RTC->WPR = 0xCA; //RTC->WPR = 0x53; RTC->ISR |= RTC_ISR_INIT; while((RTC->ISR & RTC_ISR_INITF) == 0) { cnt++; } RTC->ISR &= ~RTC_ISR_INIT; Флаг INITF так и не выставился. Тогда решил не выпендриваться, а воспользоваться HALом. Нашел в инете пример: RCC_OscInitTypeDef RCC_OscInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; HAL_RCCEx_PeriphCLKConfig (&PeriphClkInitStruct); if (HAL_IS_BIT_CLR(RTC->ISR, RTC_FLAG_INITS)) { RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; RCC_OscInitStruct.LSEState = RCC_LSE_ON; RCC_OscInitStruct.LSIState = RCC_LSI_OFF; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; HAL_RCC_OscConfig (&RCC_OscInitStruct); __HAL_RCC_RTC_ENABLE(); hRTC->Instance = RTC; hRTC->Init.HourFormat = RTC_HOURFORMAT_24; hRTC->Init.AsynchPrediv = 128; hRTC->Init.SynchPrediv = 256; hRTC->Init.OutPut = RTC_OUTPUT_DISABLE; hRTC->Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hRTC->Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; result = HAL_RTC_Init (hRTC); if (result != HAL_OK) { ... } } Увы, функция HAL_RTC_Init() возвращает ошибку (INITF , естественно, то же не устанавливается). Правда в этом случае часики все-таки начинают тикать, секунды/минуты идут как и положено. Я , было, обрадовался, бог с ней с ошибкой, часы то работают. Но все оказалось не так просто, функция установки времени HAL_RTC_SetTime работает глючно: значение часов записывается на 1 больше, минуты и секунды записываются правильно только если значение меньше 16, иначе в регистре оказывается другое число. Короче, полный бред. Если у кого-то есть работающий код инициализации RTC, буду признателен. PS. Вряд ли проблема в кварце, часы то идут, но как проверить, что он генерит? Щуп даже через резистор 10МОм останавливает часы. И какой там должен быть постоянный уровень? У меня всего 300мв.
  3. Перепаял, заработало. Всем спасибо!
  4. Странно только он как-то помер, обычно трупы процессоров жрут и греются, а этот - холодный :). Ну раз других идей нет, включаю фен...
  5. Всех с прошедшими! Да, поначалу я включал без AVDD, но потом бросил перемычку . Это могло угробить камень? Питание проверял. На ресете 1, при чем она идет с самого входа. Запаяно все правильно, как и на предыдущей плате. Да и редизайн то был не ахти какой, несколько свободных выводов развел для дополнительного функционала и несколько других переназначил, что бы этот самый функционал освободить.
  6. После очередного редизайна платы под STM32F746 (144pin) столкнулся с тем, что камень не проявляет никаких признаков жизни, а именно: потребление по Vdd порядка 100 мка, напряжение на выходе встроенного регулятора (пины Vcap)отсутствует, не работает кварц и JTAG (не программируется). На плате пока распаян только сам микроконтроллер с обвязкой, т.е. все его выводы кроме питания, кварца и JTAG висят в воздухе. Похоже, он глубоком дауне, если, конечно, живой. В трех предыдущих ревизиях платы с подобным не сталкивался. Я понимаю, что причин может быть миллион: ошибка в схеме, сопли при пайке, которых не видно и т.д. Но не хочется начинать с перепайки или тотальной прозвонки. По этому вопрос: могут ли ошибки включения привести камень в такое состояние? Не знаю, на какую-то хитрую ногу подал не тот уровень... В даташите нашел только про вывод BYPASS_REG, но в моем LQFP144 таковой отсутствует.
  7. То, что область ТСМ не кешируется, я знал, а вот о том, что кэш плохо дружит с DMA не подумал... Теперь понятно, еще раз спасибо.
  8. В обоих случаях задавалось выравнивание 4 байта.
  9. Почитал повнимательнее доки. В самом деле, первые 64к ОЗУ, это Tightly Coupled Memory. После того, как я принудительно расположил стек в ТСМ области, а все остальное выше нее (в SRAM1), то первый глюк с возвратом из подпрограмм пропал. Это я могу понять, потому что раньше стек оказывался на границе двух разных ОЗУ с разными шинами. Следующим шагом я запихнул в первые 64к еще и буфера ethernet и чудо, он то же стал нормально работать. А вот этого я понять не смог. в RM0385 черным по белому написано: 2.1.10 Ethernet DMA bus ... The targets of this bus are data memories: internal SRAM1, SRAM2 and DTCM (through the AHBS bus of Cortex®-M7) internal Flash memory, and external memories through the FMC or Quad SPI. Да, ТСМ быстрее, ну пусть бы отклик был дольше при размещении в SRAM1, но глючить-то зачем? Ну это уже не так важно, теперь, по крайней мере, стало понятно, как мне распределять память. Спасибо за ответы!
  10. Проект под IAR, ОСРВ нет, только HAL. Используется только главный стек и его указатель (в отладчике обозначается как SP_main) инициализируется правильно. Стек процессов всегда нулевой. За границей та же RAM, иначе причина была бы ясна. Программа не то, что бы совсем не работает, она глючит. Пока нашел две ситуации, в которых это приходит: 1.У меня есть функции в которых используется выключение/включение кеширования данных (записываю данные в CPLD через FMC в реальном времени). При входе в эти функции в стек помещается неправильный адрес возврата, соответственно, при выходе программа улетает фиг знает куда. 2. Глючит HAL, в частности работа с ETHERNET: не получает входящие пакеты, передает один кадр два раза подряд. У меня большое подозрение, что в программе есть какой-то баг, проявляющийся только при определенном расположении стека (или вообще, при определенном распределении ОЗУ).
  11. Господа, помогите, столкнулся с очень странной и непонятной мне проблемой. Есть программа под STM32F746, которая уже как минимум пол-года стабильно себе работает. Но, как выяснилось, работает до тех пор, пока ее данные и стек влезают в первые 64К ОЗУ (с 0х2000 0000 до 0х2000 FFFF). Если смещением начального адреса региона RAM или просто увеличением объема используемого ОЗУ сделать так, что бы начало стека вышло за эту границу, то программа начинает глючить. Симптоматику пока описывать не буду, слишком долго, а просто спрошу: есть ли у сего камня какие-то ограничения на расположение стека в памяти? Возможно, где-то что-то еще надо подправить? Просто не так давно я разбирался с расположением кода не с начала FLASH-памяти, а в другом ее секторе и не сразу понял, что изменить ICF-файл недостаточно, надо еще и объяснить контроллеру, где у него будет таблица векторов. Может и со стеком такая же фигня?
  12. Спасибо! В самом деле неправильно считывал ROM.
  13. Подходящую специализированную тему не нашел, по этому спрошу здесь, поскольку делаю на МК :) И так, надо подключить несколько DS18b20 к одной шине, а для этого нужен режим MATCH_ROM. Вроде бы все делаю по даташиту. 64-битный код предварительно считал командой READ_ROM и получил вполне правдоподобное значение. Потом дал команду MATCH_ROM, за ней передал полученные ранее 8 байт из ROM и затем команду чтения. Читаются все единицы, т.е. датчик не опознал код и не передал ни каких данных :(. Все перепроверил, записал посылку на осциллограф и разобрал ее побитно - все правильно. В режиме SKIP_ROM все работает нормально. Вот побайтнная последовательность: RESET 0x55 команда MATCH_ROM 0x28 1 байт 64-битного кода 0x2d 0xab 0x29 0x09 0x00 0x00 0x2e 8 байт 64-битного кода (CRC) 0xbe команда READ_RAM 0xff дальше читаются все единицы 0xff... Если кто работал с датчиком в этом режиме - помогите.
  14. Пробовал, не работает. Помогает, если до и после предполагаемой точки останова вписать соответственно __disable_irq() и __enable_irq(), но это каждый раз надо править код, если хочешь новый брекпоинт... Попробую поиграть с регистрами.