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

VladislavS

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные VladislavS


  1. Не поленился посмотреть как это в HAL сделано. Пробрался сквозь дебри калокуба.

     

    #if defined(STM32F373xC) || defined(STM32F378xx)
    
    /**
     * @brief  Perform an ADC automatic self-calibration
     *         Calibration prerequisite: ADC must be disabled (execute this
     *         function before HAL_ADC_Start() or after HAL_ADC_Stop() ).
     *         During calibration process, ADC is enabled. ADC is let enabled at
     *         the completion of this function.
     * @param  hadc ADC handle
     * @retval HAL status
     */
    HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc)
    {
     HAL_StatusTypeDef tmp_hal_status = HAL_OK;
     uint32_t tickstart;
     __IO uint32_t wait_loop_index = 0U;
    
     /* Check the parameters */
     assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
    
     /* Process locked */
     __HAL_LOCK(hadc);
    
     /* 1. Calibration prerequisite:                                             */
     /*    - ADC must be disabled for at least two ADC clock cycles in disable   */
     /*      mode before ADC enable                                              */
     /* Stop potential conversion on going, on regular and injected groups       */
     /* Disable ADC peripheral */
     tmp_hal_status = ADC_ConversionStop_Disable(hadc);
    
     /* Check if ADC is effectively disabled */
     if (tmp_hal_status == HAL_OK)
     {
       /* Set ADC state */
       ADC_STATE_CLR_SET(hadc->State,
                         HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
                         HAL_ADC_STATE_BUSY_INTERNAL);
    
       /* Wait two ADC clock cycles */
       while(wait_loop_index < ADC_CYCLE_WORST_CASE_CPU_CYCLES *2U)
       {
         wait_loop_index++;
       }
    
       /* 2. Enable the ADC peripheral */
       ADC_Enable(hadc);
    
    
       /* 3. Resets ADC calibration registers */  
       SET_BIT(hadc->Instance->CR2, ADC_CR2_RSTCAL);
    
       tickstart = HAL_GetTick();  
    
       /* Wait for calibration reset completion */
       while(HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_RSTCAL))
       {
         if((HAL_GetTick() - tickstart) > ADC_CALIBRATION_TIMEOUT)
         {
           /* Update ADC state machine to error */
           ADC_STATE_CLR_SET(hadc->State,
                             HAL_ADC_STATE_BUSY_INTERNAL,
                             HAL_ADC_STATE_ERROR_INTERNAL);
    
           /* Process unlocked */
           __HAL_UNLOCK(hadc);
    
           return HAL_ERROR;
         }
       }
    
    
       /* 4. Start ADC calibration */
       SET_BIT(hadc->Instance->CR2, ADC_CR2_CAL);
    
       tickstart = HAL_GetTick();  
    
       /* Wait for calibration completion */
       while(HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_CAL))
       {
         if((HAL_GetTick() - tickstart) > ADC_CALIBRATION_TIMEOUT)
         {
           /* Update ADC state machine to error */
           ADC_STATE_CLR_SET(hadc->State,
                             HAL_ADC_STATE_BUSY_INTERNAL,
                             HAL_ADC_STATE_ERROR_INTERNAL);
    
           /* Process unlocked */
           __HAL_UNLOCK(hadc);
    
           return HAL_ERROR;
         }
       }
    
       /* Set ADC state */
       ADC_STATE_CLR_SET(hadc->State,
                         HAL_ADC_STATE_BUSY_INTERNAL,
                         HAL_ADC_STATE_READY);
     }
    
     /* Process unlocked */
     __HAL_UNLOCK(hadc);
    
     /* Return function status */
     return tmp_hal_status;
    }
    
    /**
     * @brief  Enable the selected ADC.
     * @note   Prerequisite condition to use this function: ADC must be disabled
     *         and voltage regulator must be enabled (done into HAL_ADC_Init()).
     * @param  hadc ADC handle
     * @retval HAL status.
     */
    static HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef* hadc)
    {
     uint32_t tickstart = 0U;
     __IO uint32_t wait_loop_index = 0U;
    
     /* ADC enable and wait for ADC ready (in case of ADC is disabled or         */
     /* enabling phase not yet completed: flag ADC ready not yet set).           */
     /* Timeout implemented to not be stuck if ADC cannot be enabled (possible   */
     /* causes: ADC clock not running, ...).                                     */
     if (ADC_IS_ENABLE(hadc) == RESET)
     {
       /* Enable the Peripheral */
       __HAL_ADC_ENABLE(hadc);
    
       /* Delay for ADC stabilization time */
       /* Compute number of CPU cycles to wait for */
       wait_loop_index = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000U));
       while(wait_loop_index != 0U)
       {
         wait_loop_index--;
       }
    
       /* Get tick count */
       tickstart = HAL_GetTick();
    
       /* Wait for ADC effectively enabled */
       while(ADC_IS_ENABLE(hadc) == RESET)
       {
         if((HAL_GetTick() - tickstart) > ADC_ENABLE_TIMEOUT)
         {
           /* Update ADC state machine to error */
           SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
    
           /* Set ADC error code to ADC IP internal error */
           SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
    
           /* Process unlocked */
           __HAL_UNLOCK(hadc);
    
           return HAL_ERROR;
         }
       }
     }
    
     /* Return HAL status */
     return HAL_OK;
    }
    
    /**
     * @brief Enable the ADC peripheral
     * @note ADC enable requires a delay for ADC stabilization time
     *       (refer to device datasheet, parameter tSTAB)
     * @note On STM32F37x devices, if ADC is already enabled this macro trigs
     *       a conversion SW start on regular group.
     * @param __HANDLE__ ADC handle
     * @retval None
     */
    #define __HAL_ADC_ENABLE(__HANDLE__)                                           \
     (SET_BIT((__HANDLE__)->Instance->CR2, (ADC_CR2_ADON)))
    
    #endif /* STM32F373xC || STM32F378xx */
    

     

    Включают они его, естественно, перед калибровкой.

  2. 1. Правильно ли я понимаю, что для установленных компонентов ромбики в колонке Action должны быть зелёного цвета? А что значит жёлтый цвет?

    На них же написано что они значат. Install, Up to date, Deprecated. Зачем, кстати, вы их все устанавливать кинулись? Чтобы было? Вам там, по большому счёту, один пакет всего нужен дополнительно к установленным по умолчанию.

     

    2. Какие причины, что не могу скачать компоненты с официального сайта. Может, нужно там зарегистрироваться. А может, этот вопрос совсем другой темы - антивирус мешает или брандмаузер или ещё чего, так поверните в нужную сторону.

    Или тупо сайт в дауне. Или роскомнадзор в погоне за телеграмм блокирнул.

    Считайте, что я злорадствую, если вам от этого легче.

     

    ЗЫ: Склоняюсь к версии с телеграммом, так как под VPN всё скачивается.

  3. Так вот же они, "свистоперделки" :lol:

     

    Излагайте свои мысли чётко и понятно без Эзопового языка.

    Понимаете, Keil - отличная штука! Если я буду называть вещи своими именами, то вызову злобный холивар. Я этого не хочу. А вот через что вам придётся пройти я хорошо представляю и подтверждения не заставляют себя ждать.

     

    А, вот, реалии жизни. В этой игре "Установи и настрой Keil" не могу выйти на следующий уровень - установить компоненты.

    Таков путь джедая, вы его выбрали, вам по нему идти.

     

     

  4. Там было две папки Keil и IAR. Забрал обе.

     

    ...

     

    А так же о какой другой стороне силы Вы говорите.

    Ох, тяжело же вам программировать с такими аналитическими способностями будет. Две папки, две стороны силы... Ну никак не сопоставить :crying:

     

  5. У меня для вас несколько новостей. Хороших или плохих - решайте сами.

     

    1. Keil 5.18a на XP работает. Смотри скриншот.

    post-4140-1525402521_thumb.png

    2. Производная из пункта 1 - ваша "непорочная" XP за 11 лет таки подзасралась и сносить её пора.

    3. Загляните в личку, там немного достал из закромов для вас.

  6. Вы меня очень великодушно извините, но я, видимо, ещё не раз буду Вас раздражать глупыми вопросами и не соответствием нынешнему времени.

    Вот прямо в точку. Вместо того чтобы программировать в своё удовольствие боретесь с ветряными мельницами.

    Если кто скажет точно какая версия keil работает на xp, могу помочь достать её из закромов.

     

    Представляете, что будет, когда дело дойдёт до программирования?

    Тут всё проще. Сразу пойдёте Reference Manual и Страуструпа читать :)

     

    PS: Шутки шутками, а читать уже можно начинать.

  7. Я думаю, когда вы получите статус "свой", найдете нужную вам версию.

    Пользователю с 11-летней регистрацией можно и без статуса помочь скачать что требуется.

     

     

    Windows 10 только что обновилась до сборки 1803. Красота!

    Не разделяю вашего восторга. Пусть они там горят в аду с такими обновами. Чуть нестандартное железо и всё, беги за бубном... 1803 было последней каплей для перевода одного из ноутов на Linux.

     

  8. Кстати, вопрос топикстартеру. Зачем вы код в RAM тянете? Не знаю на каком чипе вы работаете, но почти уверен что у него отдельная шина к flash. Вешая код и данные на одну шину можно потерять в скорости, осоюенно если туда DMA запустить. Да и просто, RAM лишняя не бывает.

×
×
  • Создать...