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

Вебинар «МЭМС-датчики ST для работы со звуком – новые возможности» (28.10.2020)

28 октября все желающие приглашаются для участия в вебинаре, посвященном семейству МЭМС-датчиков STMicroelectronics для акустических приложений. Предметом детального рассмотрения на вебинаре станут микрофоны, их топологии применения и возможности. Вы услышите о новых мультирежимных широкодиапазонных микрофонах с нижним портом и PDM-интерфейсом для систем с батарейным питанием.

Подробнее

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


Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Share this post


Link to post
Share on other sites

STM32L562E-DK – первая отладочная платформа ST на ядре ARM Cortex-M33

STMicroelectronics представляет демонстрационно-отладочную платформу на базе ядра Cortex-M33 – STM32L562E-DK. Данная платформа основана на микроконтроллере нового семейства – STM32L5. STM32L562E-DK позволяет разработчику в полной мере раскрыть и опробовать новые возможности микроконтроллеров STM32L5 с тщательно проработанным функционалом для обеспечения высокого уровня безопасности и защиты.

Подробнее

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

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

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

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

:)

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

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

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

 

 

Edited by my504

Share this post


Link to post
Share on other sites

Тест уровня кондуктивной помехи электронного устройства

Электромагнитная совместимость (ЭМС) является важным параметром электронных устройств, особенно это актуально в современном мире, насыщенном разнообразными гаджетами. Специалисты компании Mornsun подготовили видеоролик по тестированию одной из составляющих ЭМС – кондуктивной помехи.

Подробнее

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

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

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

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

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

- вся жизнь!

- а мне понадобилось всего 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...

  • Сообщения


  • Комплект металлопленочных резисторов 1/4 Вт, 1%, 10 Ом...1 МОм, 30 значений по 20 шт. Всего 600 шт

  • Similar Content

    • By Nosi Usi
      Добрый день. Подскажите пожалуйста, как бы мне реализовать схему автоотключения (забытого включенного света). 
      Что есть: 12v аккумулятор, LED-лента, выключатель. Хочу собрать схему, при которой питание на LED-ленту будет подаваться не более чем N-минут. 
      Всё что находил - это схемы через мосфет и конденсатор но с тач-кнопкой, это не совсем то, т.к. необходимо срабатывание "таймера" при замыкании цепи и отключение таймера и света при размыкании цепи. Желательно, что бы потребление схемы было минимальным, а в идеале - размыкание всей цепи по таймеру.
       
    • Guest User1324
      By Guest User1324
      Здравствуйте, помогите подключить USB-флешку к STM32F103RCT6, нужна дополнить принципиальную схему. Если есть возможность нарисовать.
    • By Сергей Фомин
      Изучаю прерывания на attiny13. Пока остановился на прерываниях по переполнению. Сделал тестовый код в Atmel Studio и сразу через программатор заливаю на тиньку со светодиодом. Проблема в том что гореть он должен 10 секунд и выключаться, а горит примерно 20-23 секунды. Прошу помощи в правильном расчёте. Код ниже (пока учусь сильно не ругайтесь) :
      #define F_CPU 1000000 #define LED PB2 #include <avr/io.h> //#include <util/delay.h> #include <avr/interrupt.h> unsigned char work_time =384;    //  1000000/1024/256=3.8  (0.026 сек)    10/0.026=384 volatile unsigned char temp =0; ISR (TIM0_OVF_vect) {      TCNT0=0x00;     temp ++;     if (temp>=work_time)     {         PORTB &=~(1<<LED);  //Инвертируем состояние         TCCR0B=0x00    // остановка таймера         cli (); //общее запрещение прерываний     } } int main (void) {     init();               while (1)     {              } } void init () {          DDRB |= (1<<LED); // выход     PORTB =(1<<LED); //включен     TCCR0B =0x05; // установка делителя на 1024     TIMSK0 |= _BV(TOIE0);     sei();   // Либо SREG |= (1<<SREG_I); //Разрешаем прерывания глобально     TCNT0 = 0X00;        //Обнулить счётный регистр }  
    • By n_angelo
      Привет, знатоки. Написал свою первую программу для контроллера STM8L152C6T6 (STM8L-Discovery). Это, собственно, моя первая программа для контроллеров вообще. Я многого не знаю и не понимаю. Возможно ваш ответ на мой вопрос будет банален.
      Используемая периферия: DAC, DMA, TIM4, CLK, GPIO
      Задача у программы такая:
      В EEPROM зашит один период синусоиды с дискретизацией 44100Гц. Период занимает ровно 101 байт, что по сути должно быть равно 2,29мс (1/44100*101). В коде программы только конфигурация периферии, одно прерывание на кнопке и пустой бесконечный цикл, который ничего не делает. Всю работу выполняет таймер, который настроен выдавать запрос к DMA на каждые 1/44100 (ядро тактируется 2мГц, таймер считает до 45). В свою очередь DMA забирает из EEPROM по одному байту на каждый запрос от таймера и передаёт его в DAC. Далее DAC выводит бесконечную синусоиду на ногу PF0. Прерывание на кнопке запускает весь этот механизм и зажигает светодиод.
      Проблема:
      Измеряя ногу PF0 осциллографом было замечено, что период синусоиды занимает около ≈4мс. Фото под катом.
      Меня это расстроило. Экспериментально выяснилось, что стоит только вписать в бесконечный цикл какую-нибудь проверку, например, [если значение текущего байта синусоиды = 0xFF, то зажечь светодиод, если 0x00, то потушить], то осциллограф показывает правильный тайминг в 2(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается.
      Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг.
      Спасибо.
       
       
       
       
×
×
  • Create New...