Jump to content

Recommended Posts

Доброго!

Контроллер stm32f103c8t6. Пишу настройку таймера и его прерываний, но программа зависает через несколько тиков после выхода из самой функции настройки.

По коду: в главной функции пишу сразу настройку таймера и далее бесконечный цикл, до которого дело не доходит.

На рисунках скрины отладки в момент зависания.

void TIM_ini(void)
{
	TIM_TimeBaseInitTypeDef UserTimStruct;
	NVIC_InitTypeDef UserNVIC_Structure;
	
	TIM_DeInit(TIM3);
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	UserTimStruct.TIM_ClockDivision = TIM_CKD_DIV4;
	UserTimStruct.TIM_CounterMode = TIM_CounterMode_Up;
	UserTimStruct.TIM_Period = 200; 
	UserTimStruct.TIM_Prescaler = 700-1;
	
	TIM_TimeBaseInit(TIM3, &UserTimStruct); 
	
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
	
	TIM_Cmd(TIM3, ENABLE);
	
	UserNVIC_Structure.NVIC_IRQChannel = TIM3_IRQn;
	UserNVIC_Structure.NVIC_IRQChannelCmd = ENABLE;
	UserNVIC_Structure.NVIC_IRQChannelPreemptionPriority = 1;
	UserNVIC_Structure.NVIC_IRQChannelSubPriority = 1;
	
	NVIC_Init(&UserNVIC_Structure);
}

Безымянный.png,

Безымянный2.png

Share this post


Link to post
Share on other sites

А обработчик прерывания есть? Если нет - надо в программу добавить.

Иначе имеем ситуацию: прерывание от таймера разрешено, оно через какое-то время наступает, а обработчика - нет! Поэтому в результате прерывания программа попадает в специальное место -  Default обработчик прерываний, которые не были написаны. А это просто бесконечный цикл while(1){}; из которого нет выхода.

Share this post


Link to post
Share on other sites

 Yurkin2015, обработчик есть, точнее я думал что есть. Спасибо за направление))) Оказалось, что в имени функции обработчика не указал номер таймера. (TIM_IRQHandler вместо TIM3_IRQHandler) По факту получил отсутствие обработчика, что вылилось в, описанный вами, случай.;)

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

вот чтобы не тратить время на вылавливание подобных досадных багов, надо пользоваться автоматическими конфигураторами

Share this post


Link to post
Share on other sites

Откуда такая забота о потраченном времени?

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

В таких случаях помогает лишь понимание процессов, а конфигуратор этому МЕШАЕТ.

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

:)

По теме для автора топика.

Контроллеры не умеют "зависать". Фатальные ошибки приводят к сбросам. Причем в большинстве архитектур имеются отладочные трапы (прерывания) по этим ошибкам. Если стандартно вставлять обработчики по ошибкам и ставить в них брекпойнты, то ошибки элементарно отлавливаются и по их типу и по месту возникновения.

Отсутствие самого обработчика как ошибка детектируется самим сбросом.

 

 

Edited by my504

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

Выбор подходящего элемента питания, способного обеспечивать требуемый уровень напряжения и выдавать необходимый ток на протяжении всего периода эксплуатации беспроводной пожарно-охранной системы является одной из первостепенных задач. Наиболее подходящим для этих целей элементом являются литий-тионилхлоридные элементы питания, а одним из наиболее конкурентоспособных производителей – компания Fanso, предлагающая своим клиентам продукты как универсальные, так и разработанные специально для решения конкретных задач.

Подробнее...

Будда как то сидел на берегу реки, к нему подходит йог и говорит

- слушай, ты чего сидишь, пошли по воде. Я вот могу по воде

На что Будда ему ответил - я дождусь парома. Ну йог взял и пошлепал по воде. Дошел значит, сидит улыбается, а тут и паром как раз Будду привез.

Йог улыбнулся и говорит - вот видишь, по воде пешком быстрее и удобнее. На что Будда его и спрашивает

- Слушай, йог, а сколько тебе потребовалось времени, чтобы научиться ходить по воде?

- вся жизнь!

- а мне понадобилось всего 5 минут чтобы переплыть на пароме

Share this post


Link to post
Share on other sites

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...

  • Similar Content

    • By n_angelo
      Привет. Хочу узнать ваше мнение. Я новичок в embedded. Можно сказать, что пришел с веба. Малость Python, JS, C. Меня, конечно, предупреждали начать с AVR, но я уверенный в себе решил сразу залезть на STM32. Вынашивая идею для проекта, параллельно курив Reference Manual и Data Sheet по STM32, я понял что его будет слишком жирно для проекта. Я перескочил на STM8L. И тут меня начал огорчать мир embedded. При переходе между stm8 и stm32 нужно менять IDE (TrueStudio на STVD). Во избежание таких курьёзов я пересаживаюсь на IAR. В процессе подключения родной библиотеки от ST, понимаю что библиотека от IAR для того же самого STM8L152C6T6 дико отличается (макросы, структуры). Привет веб-разработка. Как такое могло произойти, что под один и тот же контроллер ST даёт одну библиотеку, а IAR другую. И нигде в уроках тебя не предупредят об этом. Ну, ребят, у меня всего одна жизнь. Вы уже договоритесь там между собой? Придите к единому стандарту. Или они так решили новичков завендерлочить? Моё мнение (не претендует на правильное): пробираясь сквозь тернии популярной архитектуры ARM, инфраструктуры, инструментария, забываешь про бизнес-логику устройств. А еще просто пропасть между "я ничего не понимаю" и "господи, я зажег светодиод". Речь не о копипастерах с уроков, а действительно понимая что ты делаешь, в каком регистре, что меняешь. Это путь в 2000 (а то и больше) страниц на английском перечитанных по несколько раз, чтобы отоложилось. И в конце тебя ждут разные версии одной и той же библиотки в разных IDE. И сидишь вдупляешь... ну почему... я же в правильный регистр кладу правильную маску... ох, наболело. Такое ощущение что не для людей это всё делали, не для людей.
      Ваше мнение?
    • By katet
      Добрый день. Может быть,кто-нибудь уже сталкивался с таким. 
      Занимаюсь доработкой чужого проекта в среде 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.


    • By Sancta
      Привет!
      Есть набор с али - 4 канала c релюхами  на 315мгц с пультами управления.
      Работает вроде норм. Для увеличения дальности сделал выносную антенну. Но сейчас примерно раз в сутки получаю случайные срабатывания. Понять откуда они не могу - возможно помехи наводятся или еще что. 
      Вопрос такой - может подобрать более надежный радиорелейный модуль в Китае с лучшим шифрованием радиообмена или как то доработать этот модуль (сместив допустим частоту, чтобы поменьше она пересекалась с другими пультами)
    • By IgnatiusF
      Не могу настроить таймер 0 на работу, и даже не получается понять в чем проблема. Делаю в Proteus, так как это быстрее и нагляднее.
      Пробовал и просто по переполнению делать прерывание (WGM[1..0]  00) и по совпадению (WGM[1..0]  10; OCR0A = 0 - 255), однако прерываний нет. Перед циклом ставлю TCNT0 = 0;
      Тактирование выставляю TCCR0B (CS[2..0] 001, 100, 101).
      Прерывания TIMSK0 (OCIE0A, TOIE0) выставляю, не вызываются. Даже принудительным заносом значения в регистр TIFR0 (OCF0A, TOV0).
      Прерывание пытаюсь выполнить таким образом:
      #include <avr/interrupt.h> volatile unsigned int A = 0; ISR(TIMER0_OVF_vect) { A = 1; } ... while(1) { if (A == 1) PORTB |= (1<<0); } Proteus показывает, что вывод настроен как выход, но всегда 0;
      Конкретный код привести не могу, так как у меня не заработало совсем ничего.
      Внизу я сделал вырезку из даташита на ATMEGA328 по 0 таймеру 8-бит, и занес в один PDF файл.
      ATmega328-106-112.pdf
      Прошу помочь разобраться с таймером и прерываниями для него.
  • Сообщения

    • Попробовал залить прошивку версии 2 для платы с ж/к дисплеем - при включении Wait, а затем Low Bat. Учитывая что перед этим пришлось перепаять 4066, операционник и заменить убитый индикатор - прогресс налицо - буду смотреть делитель, отвечающий за контроль питания на ноге контроллера и копать дальше.
    • пока так- чет заманался )- так как 12 вольт практически здесь дежурный режим - постарался уделить этому узлу максимальное внимание - добавил запас по току - 2 конденсатора по 1 мкф - поставил супрессор 24 вольта - для зашиты - в случае пробоя кондея - выбьет предохранитель - и для стабильной работы таймера - добавил кренку - с запуском всей схемы возможно чет и заменю - возможно мост - все в практике.
    • Всё чёрным- это как? Металлизация есть в параметрах пятачков
    • @Гость Александр Аккумуляторы можно заряжать как меньшим током, так и большим. Есть и форсированные устройства зарядки. Но за скорость надо платить более быстрым износом аккумуляторов. Самое рациональное решение - током 10% от ёмкости аккумулятора. Это справедливо для Ni-Cd и Ni-Mh аккумуляторов. Если зарядное устройство не автомат, чтобы до конца прошли восстановительные процессы необходимо определённое время.Существует формула по которой это время можно вычислить. Время зарядки аккумулятора:  Тчас.= Ёмкость аккумулятора (mAh)/Зарядный ток (mAh) * К Где К = 1.4 - средний коэффициент.  К = 1.2 -1.6 (средний 1.4) Зарядный ток и ёмкость аккумулятора Вам известны. А время зарядки можно посчитать за несколько минут. 
    • здрасьте всем. в спринт лайот 6 нет опции "все черным" и металлизация. как включить или это более новая версия?
×
×
  • Create New...