Jump to content
katet

Остановка прерываний Systick в HAL

Recommended Posts

Добрый день. Может быть,кто-нибудь уже сталкивался с таким. 

Занимаюсь доработкой чужого проекта в среде STM32CubeMX, первый раз работаю с библиотекой HAL.

В этом проекте осуществлялся прием байт по USART1 из ComMon. Проект был открыт в STM32CubeMX, где мной дополнительно были активированы новые модули - RTC, SD, USART2. Настройки USART1 не менялись. 

Часы реального времени RTC: питание от батарейки, тактирование – от LSE. 

При приеме байт по USART1 в новом проекте (активны  USART1, RTC, SD, USART2) было выявлено, что после приема 2 байт по USART1 перестает инкрементироваться значение переменной uwTick, отвечающей за прерывания Systick, в результате чего дальнейшая отладка невозможна. Не удается выяснить, в каком месте и почему перестает увеличиваться значение uwTick. При работе со старым проектом (где активен только USART1) uwTick инкрементируется после приема 2 байт.

Смены приоритета прерываний не происходит, в  функцию HAL_Delay() отладчик не попадает. При вызове функции HAL_ResumeTick(), возобновляющей прерывания Systick, ничего не меняется, значение uwTick остается неизменным.

Остановка прерываний была обнаружена при попадании в функцию:

static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
{
  /* Wait until flag is set */
  while((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) 
  {
    /* Check for the Timeout */
    if(Timeout != HAL_MAX_DELAY)
    {            
      if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
      {
        /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
        CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
        CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
        
        huart->gState  = HAL_UART_STATE_READY;
        huart->RxState = HAL_UART_STATE_READY;
        
        /* Process Unlocked */
        __HAL_UNLOCK(huart);
        
        return HAL_TIMEOUT;
      }
    }
  }
  
  return HAL_OK;
}

В новом проекте текущее значение uwTick, возвращаемое функцией HAL_GetTick(), всегда равно значению Tickstart. В старом проекте сначала также, но затем uwTick начинает увеличиваться. Выяснить, в каком именно месте кода значение uwTick должно начать увеличиваться, не удается.

Может быть, у кого-нибудь есть хоть какие-то идеи, с чем может быть связана остановка увеличения значений uwTick, помогите пожалуйста)

Распиновка и конфигурация обоих проектов: верхняя часть рисунков - первоначальный, работающий вариант,  нижняя - сбой прерываний Systick.

Распиновка.jpg

Конфигурация.jpg

Share this post


Link to post
Share on other sites

Остановить Systick: 

SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;

Ладно пусть будет, дочитал таки...

Давай проект... идей ноль)

Или открой в нотпаде++ проект и ищи места "SysTick->CTRL" потом ищи где остановка в какой функции, потом ищи по всему проекту ту функцию и т.д.

Edited by MasterElectric

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

25 минут назад, MasterElectric сказал:

Остановить Systick: 


SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;

Ладно пусть будет, дочитал таки...

Давай проект... идей ноль)

Или открой в нотпаде++ проект и ищи места "SysTick->CTRL" потом ищи где остановка в какой функции, потом ищи по всему проекту ту функцию и т.д.

Проект здесь: https://download.ru/files/cXsDO4wK

Share this post


Link to post
Share on other sites

Высокая надежность SiC! Как они этого добились?

За несколько лет кропотливых исследований и совершенствования технологии компания Infineon смогла довести показатели надежности и стабильности параметров высоковольтных и быстродействующих карбид-кремниевых транзисторов линейки CoolSiC практически до уровня их кремниевых собратьев.

Подробнее

Делай приоритеты периферии меньше чем у систика. Очень плохая практика в прерывании делать прием да еще и блокирующий, зачем править говнокод. Я могу ошибаться чтобы прервать прерывание приоритет должен быть выше, с таким же откладывается, вот и не считает.

P.S. И мне интересно каким макаром ты одновременно с таким подходом будешь принимать данные по двум UART. И для подтверждения при зависании останови и посмотри состояние регистров систика (разрешено ли прерывание) и NVIC по отложенным прерываниям (есть ли отложенные)

Edited by MasterElectric

Share this post


Link to post
Share on other sites

Вебинар «Практическое использование TrustZone в STM32L5»(10.12.2020)

Приглашаем на вебинар, посвященный экосистеме безопасности и возможностях, которые появились у разработчиков благодаря новой технологии TrustZone в микроконтроллерах STM32L5. Программа рассчитана на технических специалистов и тех, кто уже знаком с основами защиты ПО в STM32.

Подробнее

13 часа назад, MasterElectric сказал:

NVIC

Оказалось, что перед генерацией проекта в STM32CubeMX в настройках USART NVIC Settings была убрана галочка с USART global interrupt enabled:wall: 

Огромное спасибо за помощь)

Share this post


Link to post
Share on other sites

Снижена цена на AC/DC и DC/DC преобразователи Mornsun в Компэл!

Компэл и компания Mornsun снизили цены на преобразователи AC/DC-преобразователи семейств LS и LDE. По привлекательной цене также предлагаются DC/DC-преобразователи изолированных семейств поколений R2 и R3 различного конструктивного исполнения.

Подробнее

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • А зачем опознавать то?
    • Это не догма ни разу для усилителей с ОООС. Можно ставить разброс в 50%, работать будет нормально.
    • @finn32 , честно, я побоялся поднять ТП выше 38мА после которого идет рост и возбуд, поэтому наверняка сказать не могу. правда на очень большой частоте в 12МГц КМК. но все же склоняюсь, что еще рано останавливаться на достигнутом. хоть вроде и картинки не плохие получились, и музыка играет, и ничего не греется... тогда завтра попробую покрутить выше... а дальше посмотрю и сообщу как-что. возможно конденсаторы в базы драйверов на землю поставлю или сами драйвера заменю, но как я писал выше у меня больше нет пар транзисторов средней мощности с близкими коэффициентом усиления.
    • А400Б 66г в корпусе КТ312  КТ208Г 79г в корпусе КТ104  
    • Радиаторы 205*100*25 мм, основание 10 мм. Платы 177*56,5. Токовую защиту Вадим при трассировке исключил, да.
    • А это мой лабораторный блок питания, с наворотами из переключателей, множеством выходных напряжений и мультиштекером.  MY-168
    • Здравствуйте. Люди добрые, помогите опознать схему. Достался по случаю автомобильный усилитель Lanzar, вот только ланзаром здесь не пахнет. Заранее спасибо.

  • Модуль приемопередатчика LoRa SX1280, 2.4GHz, 27dBm, дальность до 8км

  • Similar Content

    • By xrou
      Здравствуйте, пытаюсь подключить USB флешку к STM32F767ZI
       
      Включаю USB_OTG_FS - host only, (V bus и SOF  не включаю), USB HOST Class for fs ip - Mass Storage host class, FATFS (USE_LFN - в стеке) - USB_Disk
      В настройках USB_HOST требует, как я понял, пин отвечающий за питание устройства - PC1
      Код простейший, должен работать 100% а может нет. Внутренние файлы библиотек не менял
      Думаю что нет питания на USB устройство т.к. пробовал вставить туда ttl конвертер на котором есть светодиод питания и он не горит
       
      Ваши идеи и предположения? 
       
    • By xrou
      Здравствуйте, хочу подключить джойстик к stmке, но проблема в том что он пятивольтовый, а АЦП все, что больше 3.3 выдаёт как 4095. На ардуино есть контакт aref введённый на плату, но на stm, как я понял, он соединён с контактом питания и все что выше 3.3 вольта просто спалит кристал. 
      Подскажите как подключить пятивольтовое устройство к stmке. 
       
      P.s подключить джойстик к 3.3 не получится из-за появления огромных мёртвых зон.
    • By Black Jack
      Здравствуйте, программатор st-link не видит микроконтроллер STM32F103VET6. Присоединение кварца и внешнее тактирование не помогли. Что не так делаю, подскажите.


      схема.dch плата.dip
    • By strifonoff
      это снова я...
      Максимального быстродействия АЦП можно достичь при частоте АЦП 14 МГц, а этого можно добиться только при системной частоте 56 МГц (если внешний кварц на 8 МГц).
      Но возникает проблема со скоростями UART: значение регистра BRR не получится выставить так, что бы скорость была из стандартного ряда.
      Назрели несколько вопросов:
      1) возможно ли менять системную частоту на лету? (чую, что можно, но пока не знаю как) 
      2) критична ли ошибка в скорости UART по сравнению со стандартной? (что будет на другой стороне заранее не известно, т.к. любой может воткнуть свой девайс работающий на какой-то заранее согласованной стандартной скорости)
      3) как поведёт себя железо (состояние ОЗУ, регистров перефирии, состояние ног и т.д.) на изменение частоты? Две части программы () практически независимы, их объединяет только один массив, который наполняется в первой половине, а обрабатывается в другой.
       
    • By xrou
      Здравствуйте, пытаюсь обрабатывать пакеты приходящие от ESP8266 (01), но проблема в том, что пакеты всегда разной длины ведь мы не знаем, что напишет пользователь (хотя даже ответы на AT команды всегда разной длины). Знаю, что в плате F0 есть прерывание по символу, но у меня F103C8T6. Как быть? Создать массив большого размера нельзя, т.к. HAL_Recieve_IT ждет пока не наберется нужное кол-во символов.
      Приму любую идею и советы
×
×
  • Create New...