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

drcepera

Новичок
  • Постов

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

  • Посещение

Репутация

0 Обычный

Старые поля

  • skype
    Array

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. stm32 i2c

    OMG.. Извиняюсь, товарищи. Нашел таки косяк ) Датчик читался по таймеру А, а таймауты отслеживались по таймеру В. Хоть приоритет у В был и выше, чем А, они были в одной группе. Установил NVIC_PriorityGroup_2 - все, кажется, Ок. Не учел, что прерывания из одной группы не обрывают друг друга. Спасибо всем за ответы! )
  2. stm32 i2c

    Товарищи, таймер-то включен и NVIC именно так и проинициализирован, и прерывания происходят. КРОМЕ случая зависания в указанном месте CPAL. Более того, если при этом я разорву линию I2C - программа выйдет из этого цикла, т.к. __CPAL_I2C_HAL_GET_BUSY(pDevInitStruct->CPAL_Dev) возвращает 0 - и дальше программа будет продолжать работать хорошо, в смысле, прерывания таймеров возобновятся. Вот я и спрашиваю, если в регистрах таймера все в порядке и не запрещены прерывания - то дело может быть в запрете прерывания в NVIC, либо же еще в чем-нибудь?
  3. stm32 i2c

    Тээк.. Если прерывание разрешено в таймере (бит Update interrupt flag), плюс не запрещены прерывания в целом (PRIMASK = 0), следовательно дело может быть в запрете в NVIC? Или я еще что-то упускаю?
  4. stm32 i2c

    Доброго времени суток. Юзаю i2c на STM32F4DISCOVERY для опроса датчика. Использую библиотеку CPAL. Появилась проблема, которая вот уже много времени гложет мозг. Суть в следующем. CPAL проверяет таймауты, для чего на CPAL у меня выделен TIM3, по прерыванию раз в мс вызывается библиотечная функция CPAL_I2C_TIMEOUT_Manager(). И все вроде хорошо. НО! Возникают моменты, когда программа затыкается на __CPAL_I2C_TIMEOUT(). Это дефайн, который представляет из себя цикл, выход из которого возможен по одному из двух условий: 1) наступило ожидаемое событие (например, скинулся бит BUSY статусного регистра); 2) превышен лимит ожидания. То есть, если щелкает таймер, то рано или поздно цикл будет покинут. НО! При зависании в __CPAL_I2C_TIMEOUT() таймер хоть и работает, и выставлены нужные флаги, но прерывание, и соответственно, подсчет таймингов, не вызываются. Привожу рисунок, на нем - собственно место затыка во время отладки, а также регистры 3-го таймера. Ниже по коду в комментах - определение самой __CPAL_I2C_TIMEOUT()
×
×
  • Создать...