STM32 #2. UART IT - теоретическая и практическая реализация прерываний

Поділитися
Вставка
  • Опубліковано 2 лис 2024

КОМЕНТАРІ • 61

  • @АндрейПолетимов

    Хорошее кино делаете, спасибо.

  • @canisminor6128
    @canisminor6128 9 місяців тому

    Я на прошлой работе использовал терминал RealTerm, мне нравилось в нем что можно смотреть прием-передачу в HEX-формате с пробелами между байтами и цветовой разметкой по RX-TX. К сожалению, проект не развивается, но в отладке он мне помогает до сих пор.

    • @NRelectronics
      @NRelectronics  9 місяців тому

      Рекомендую терминалку MobaXterm

  • @AndySm1973
    @AndySm1973 3 роки тому +1

    Огромное спасибо!

    • @AndySm1973
      @AndySm1973 3 роки тому

      Скорее бы книга Ваша вышла!
      Может быть организовать сбор средств на нее?

    • @NRelectronics
      @NRelectronics  3 роки тому

      Да я даже не знаю. С одной стороны это ускорило бы её печать в хорошей типографии, а это не дёшево, а с другой написание руками не заменит. Если хотя бы люди спонсировали канал по закладке "Полный доступ", а это не дорого вовсе, это со временем значительно улучшило ситуацию с выпуском книги.

  • @Жизньспаяльником
    @Жизньспаяльником 5 місяців тому

    у меня вопросик, работаю с двумя ЮАРТ в прерывании с подсчетом кол-ва данных по приему (IDLE). так вот, все работает нормально. но если включаешь обмен по 2м юартам то все. происходят сбои и потери данных. может что то посоветуйте. как реализовать корректный обмен по 2м каналам без сбоев., да скорости разные. 19200 и 115. связано с особенностями устройства.

    • @NRelectronics
      @NRelectronics  5 місяців тому

      Посмотрите сначала еррату на ваш мк, нет ли там особенностей работы одновременно юартов с вашими номерами и раскидайте их по DMA. Не вижу проблем с одновременной работой, да ещё и с низкими такими скоростями.

  • @JONY-t8e
    @JONY-t8e Рік тому

    добрый день, а с ардуины на стм32 по uart можно передать информациюб, и эту информацию вывести на дисплей ?

    • @NRelectronics
      @NRelectronics  Рік тому

      Да, можно конечно. В соответствии с вашим протоколом.

  • @archilvarsimashvili9433
    @archilvarsimashvili9433 2 роки тому +1

    Большое спасибо за уроки. Один вопрос, суть функций callback, их назначение и правила применения. В общих чертах примерно можно понять, но все таки есть вопросы. Ну хотя бы форма записи в функции main - void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);. Насколько я понимаю, в си так записывают объявление функций, но это не делается в main. Это только один вопрос, а их много. Возможно у Вас есть урок по теме, так как к примеру то, что написано в википедии, меня только еще больше запутало.

    • @NRelectronics
      @NRelectronics  2 роки тому

      Спасибо за похвалу. В скобках разыменовывание конкретного использованного номера юарта. Читайте нормального автора по Си лучше, Дейтелов или Прата.

  • @microsoft8792
    @microsoft8792 2 роки тому

    Попробовал на черной таблетке - при попытке перейти к определению HAL_UART_ErrorCallback или HAL_UART_Receive_IT "No browther information available in 'UART1\UART1'/ Check - [Target-Options] [Output] [Browther Information] then Rebuild the target!" Галочка Browther Information стоит. Подскажите куда копать?

    • @NRelectronics
      @NRelectronics  2 роки тому +1

      После того как поставили галочку сделали Rebuild проекта?

    • @microsoft8792
      @microsoft8792 2 роки тому

      @@NRelectronics Не делал. С ребилдом стало открывать. Реально туплю - было же написано - Rebuild... Спасибо!

    • @NRelectronics
      @NRelectronics  2 роки тому

      Пожалуйста!)

  • @тимофейкаштанов-е4м

    ЕСли это кто то прочитает) Почему на 22 минуте при переполнении буфера приема не выкидывается соответствующая ошибка? Ведь обработчик ошибок в самом начале видео показан)

    • @NRelectronics
      @NRelectronics  Рік тому

      Прочитали, но обработчик не вылетает. Надо это попробовать в режиме отладки проделать...

    • @Mishukan404
      @Mishukan404 10 місяців тому

      @@NRelectronics у меня то же самое, обработчик при переполнении не срабатывает. Ставлю breackpoint на HAL_UART_ErrorCallback и глухо(

    • @Mishukan404
      @Mishukan404 10 місяців тому

      добавил 2 строки __HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
      HAL_UART_RegisterCallback(&huart2, HAL_UART_ERROR_CB_ID, HAL_UART_ErrorCallback); и включил USE_HAL_UART_REGISTER_CALLBACKS в ..hal_config.h. Обработчик заработал, но почему-то только если шагать в отладочном режиме. При номальной работе все-равно не срабатывает(

  • @germandevchich6089
    @germandevchich6089 3 роки тому

    Добрый день, Я программирую по вашем урокам. Подскажите как можно в cubeMX включить авто дополнение слов, например как вижуал студио. ЧТо бы при написании выпадало меню с вариантами выбора что дописать?

    • @NRelectronics
      @NRelectronics  3 роки тому +1

      Добрый день. Спасибо что занимаетесь по мои видео. В кейле это комбинация клавишь при наборе ctrl+space.

    • @АлекКаз
      @АлекКаз 6 місяців тому

      @@NRelectronics visual st тоже ctrl+space

  • @VitalyYanchenko
    @VitalyYanchenko 2 роки тому

    Спасибо за уроки! Сейчас не могу решить одну проблемку, может подскажете? После отправки данных линия TX остается в активном состоянии (1), а как сделать низкое состояние между пакетами, не могу сообразить. Пытаюсь реализовать протокол DMX-512, в котором между пакетами должен образоваться на линии низкий уровень (break). В даташите на МК серии F есть бит SBK, а моём МК серии G030 его нет, вот и застопорился...

    • @NRelectronics
      @NRelectronics  2 роки тому +1

      Пожалуйста. Юарт таким образом работает, оставляя линию поднятой, в графиках видео это показано. Я бы вам советовал сделать юарт софтверный, на выводах GPIO, там вы смогли бы задать использование линии тх при не использовании в нуле...

    • @VitalyYanchenko
      @VitalyYanchenko 2 роки тому

      Да, видимо придется пробовать делать софтверный юарт. Делал как-то софтверный spi, получилось, правда там по поводу скорости передачи данных не заморачивался, а тут с юартом надо 250кб/с, буду разбираться. Спасибо за совет. Кстати, нашёл документ от ST, UM0792, там тоже интересный вариант получать низкий уровень на линии, может кому пригодиться.

    • @NRelectronics
      @NRelectronics  2 роки тому +1

      Пожалуйста за совет.
      Я просто с DMX-512 communication protocol
      не работал, поэтому не знаю как его формировать, в классическом юарте такого нельзя делать, с понижением линии.

  • @VasyaPupkinus
    @VasyaPupkinus 3 роки тому

    Добрый день. В КубЭМиксе -> ProjectManager-> Advanced Settings , справа есть колонка с кучей КоллБеков, (у вас они не видны потому что окно растянуто ), вы ими не пользуетесь ? я пытался разобраться , но чёто никак ))) Как я понял, они только для HALLa , активируют коллбеки в файле stm32f0xx_hal_conf.h . Где они включаются с библиотекой LL не нашёл . Интересно было бы узнать как ими правильно пользоваться.

    • @NRelectronics
      @NRelectronics  3 роки тому +1

      Они там есть. Учитесь больше руками писать и понимать. По включению тех колбэков полезного я ничего не нашёл. RM и HAL Description как я уже говорил наше всё.

    • @VasyaPupkinus
      @VasyaPupkinus 3 роки тому

      @@NRelectronics Учусь помаленьку. Спасибо вам за труды

    • @NRelectronics
      @NRelectronics  3 роки тому +1

      Правильно делаете и на правильном канале 👍

    • @VasyaPupkinus
      @VasyaPupkinus 3 роки тому

      @@NRelectronics Снова здрасти ))) Я совсем запутался с этими коллбеками. Сижу мучаю уже несколько часов АЦП на STM32F0 . Пошагав по брекпоинтам в программе открыл для себя америку ))) попав в обработчик прерываний нас кидает в функцию коллбека , по завершению коллбека очищаются флаги и мы снова попадаем в обработчик прерываний (но уже в конец). Какой смысл от этого колбека ? ))) написано в Даташите что это неблокирующая функция . Или тут весь смысл в том что пока выполняется коллбек ,контроллер может принимать и ставить в очередь другие прерывания ??? А если бы мы работали в самом обработчике то другие прерывания прошли бы мимо ???

    • @NRelectronics
      @NRelectronics  3 роки тому +1

      Молодцы что в отладке смотрите, не ленитесь, так и нужно. Просто когда мы попадаем в обработчик мы то не знаем по каким свойствам попали, колбэки нам помогают понять по заполнению всего буфера или половины, по передачи или по приему, если флаги ошибок то какие и т.д. в соответствии с RM. Мы сами понимаем что происходит, так устроен хал. Можно и в обработчике, в первом видео я так делал на примере в конце видео, но так обычно не делают все же.

  • @namename2031
    @namename2031 Рік тому

    19:25
    Рекурсия+свойство функции ReceiveToIdle.
    Главное не вводить в терминале количество символов, превышающее число символов из функии HAL_UARTEx_ReceiveToIdle_IT.

    • @NRelectronics
      @NRelectronics  Рік тому

      А можно не вводить, а если всё же вводить?)

    • @namename2031
      @namename2031 Рік тому

      @@NRelectronics
      Я вообще запутался.
      При добавлении задержки в Event Каллбек вообще всё перестаёт работать.
      Хотел проверить взаимодействие терминала и Event Каллбек.
      Задержка не важно какая. Или на ХАЛ или на систик.

  • @ivanrusev2270
    @ivanrusev2270 3 роки тому

    А почему я посылаю на териенал 1.9 а у меня козябрики в терменале выводят?

    • @NRelectronics
      @NRelectronics  3 роки тому

      Телепаты в отпуске. Посмотреть что со скоростями.

  • @Minas__Morgul
    @Minas__Morgul 3 роки тому

    HAL_UARTEx_RxEventCallback() собственно как и саму HAL_UARTEx_ReceiveToIdle_IT где найти ? Ее нет Hal у меня почему-то(отладочная плата Discovery STM32F407

    • @NRelectronics
      @NRelectronics  3 роки тому +1

      В Description HAL pdf.

    • @Minas__Morgul
      @Minas__Morgul 3 роки тому

      @@NRelectronics спасибо уже нашел. Оказывается HAL_UARTEx_ReceiveToIdle_IT появился в новых версиях HAL в старых версиях не было

    • @NRelectronics
      @NRelectronics  3 роки тому

      Так бывает, ст добавляет новый функционал.

  • @АбуЗаррФарадей
    @АбуЗаррФарадей 3 роки тому

    👍🏼

  • @Korbomen
    @Korbomen 3 роки тому

    если есть DMA, зачем вообще нужны прерывания? Хотя даже при использовании dma у stm нужно сбрасывать флаги, бред

    • @Korbomen
      @Korbomen 3 роки тому

      void Usart2::send(uint8_t *data, uint8_t len)
      {
      uint8_t i;
      while(DMA1_Stream6->CR & DMA_SxCR_EN); //wait transmit all data
      DMA1->HIFCR |= DMA_HIFCR_CTCIF6; //clear flag transmit
      for(i = 0; i < len; i++)
      {
      txData[i] = *data++; //copy data to buff
      }
      DMA1_Stream6->NDTR = len; //Set len
      DMA1_Stream6->CR |= DMA_SxCR_EN; //enable DMA
      }

    • @NRelectronics
      @NRelectronics  3 роки тому

      Прерывания ведь есть, нужно знать их и уметь пользоваться. Спасибо за пример кода.

    • @Korbomen
      @Korbomen 3 роки тому +1

      @@NRelectronics void Usart2::init(uint32_t baud)
      {
      //Enable clock
      RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; //Port A clock
      RCC->APB1ENR |= RCC_APB1ENR_USART2EN; //Usart clock
      RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN; //DMA1 clock
      //Port config PA2 - TX PA3 - RX
      GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2 | GPIO_OSPEEDER_OSPEEDR3; //OSPEED 11 - very high speed
      GPIOA->MODER |= GPIO_MODER_MODER3_1 | GPIO_MODER_MODER2_1; //MODER 10
      GPIOA->AFR[0] |= GPIO_AFRL_AFRL3_2 | GPIO_AFRL_AFRL3_1 | GPIO_AFRL_AFRL3_0; //AF7 PA3
      GPIOA->AFR[0] |= GPIO_AFRL_AFRL2_2 | GPIO_AFRL_AFRL2_1 | GPIO_AFRL_AFRL2_0; //AF7 PA2
      //Uart config
      USART2->BRR = (42000000UL + (baud >> 1))/baud; //Set baud
      USART2->CR3 |= USART_CR3_DMAT | USART_CR3_DMAR; //Enable DMA Transmitter, Resiver
      USART2->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; //Enable Transmitter, Resiver USART2
      //DMA TX Config
      DMA1_Stream6->CR |= DMA_SxCR_CHSEL_2 | DMA_SxCR_PL_0 | DMA_SxCR_MINC | DMA_SxCR_DIR_0; // Chanel 4, increment mode, mem to periphery
      DMA1_Stream6->PAR = (uint32_t)&(USART2->DR);
      DMA1_Stream6->M0AR = (uint32_t)txData;
      //DMA RX Config
      DMA1_Stream5->CR |= DMA_SxCR_CHSEL_2 | DMA_SxCR_PL_0 | DMA_SxCR_MINC; // Chanel 4, increment mode, periphery to men
      DMA1_Stream5->PAR = (uint32_t)&(USART2->DR);
      DMA1_Stream5->M0AR = (uint32_t)rxData;
      DMA1_Stream5->NDTR = BUF_SIZE; //Set len
      DMA1_Stream5->CR |= DMA_SxCR_EN; //enable DMA
      }
      void Usart2::send(uint8_t *data, uint8_t len)
      {
      uint8_t i;
      while(DMA1_Stream6->CR & DMA_SxCR_EN); //wait transmit all data
      DMA1->HIFCR |= DMA_HIFCR_CTCIF6; //clear flag transmit
      for(i = 0; i < len; i++)
      {
      txData[i] = *data++; //copy data to buff
      }
      DMA1_Stream6->NDTR = len; //Set len
      DMA1_Stream6->CR |= DMA_SxCR_EN; //enable DMA
      }
      uint8_t Usart2::read(uint8_t *data)
      {
      uint8_t i, len = 0;
      if(!(USART2->SR & USART_SR_IDLE)) return len; //return if read not finished
      DMA1_Stream5->CR &= ~DMA_SxCR_EN; //disable DMA
      len = BUF_SIZE - (DMA1_Stream5->NDTR); //Read len
      for(i = 0; i < len; i++)
      {
      *data++ = rxData[i]; //copy data to buff
      }
      DMA1_Stream5->NDTR = BUF_SIZE;
      DMA1->HIFCR |= DMA_HIFCR_CTCIF5; //clear flag recive
      DMA1_Stream5->CR |= DMA_SxCR_EN; //enable DMA
      return len;
      }

    • @Korbomen
      @Korbomen 3 роки тому

      @@NRelectronics вот полностью

    • @NRelectronics
      @NRelectronics  3 роки тому

      Это на f407?