Например TDA7294

Форум РадиоКот • Просмотр темы - Таймер вешает STM32f103
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср апр 17, 2024 02:03:03

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Таймер вешает STM32f103
СообщениеДобавлено: Чт окт 25, 2018 11:30:20 
Встал на лапы

Зарегистрирован: Сб янв 11, 2014 21:25:55
Сообщений: 113
Рейтинг сообщения: 0
Доброго времени суток! Такое дело получается: есть программа, в которой дружно работают SPI через DMA, собачий таймер (для создания задержек) и USART. Как только я инициализирую TIMER3 (он нужен для опроса кнопок и энкодера), какое-то время МК работает (скажем, секунд 4-6, точно не измерял), а потом просто зависает, причём наглухо, до следующей перезагрузки. Как будто не сбрасывает флаг в каком-то прерывании. Но флаги я сбрасываю во всех прерываниях! Какие есть идеи?

На всякий случай, иниты вочдога+функции задержек и таймера:

Код:
#define    DWT_CYCCNT    *(volatile unsigned long *)0xE0001004
#define    DWT_CONTROL   *(volatile unsigned long *)0xE0001000
#define    SCB_DEMCR     *(volatile unsigned long *)0xE000EDFC

void DWT_Init(void){
    //разрешаем использовать счётчик
    SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    //обнуляем значение счётного регистра
   DWT_CYCCNT  = 0;
    //запускаем счётчик
   DWT_CONTROL |= DWT_CTRL_CYCCNTENA_Msk;
}

static __inline uint32_t delta(uint32_t t0, uint32_t t1){
    return (t1 - t0);
}

void delay_us(uint32_t us){
   
      uint32_t t0 =  DWT->CYCCNT;
      uint32_t us_count_tic =  us * (SystemCoreClock/1000000);
      while (delta(t0, DWT->CYCCNT) < us_count_tic) ;

   
}

void delay_ms(uint32_t us){
 
      uint32_t t0 =  DWT->CYCCNT;
      uint32_t us_count_tic =  us * (SystemCoreClock/1000);
      while (delta(t0, DWT->CYCCNT) < us_count_tic) ;

 
}


void Timer3Init(){
   RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;

   TIM3->PSC    = 120-1;
   TIM3->ARR    = 500-1;
   TIM3->DIER |= TIM_DIER_UIE;
        TIM3->EGR |= TIM_EGR_UG;               
        TIM3->SR &= ~(TIM_SR_UIF);             
   TIM3->CR1  |= TIM_CR1_CEN;

   NVIC_EnableIRQ(TIM3_IRQn);
}


Добавлено after 32 minutes 45 seconds:
Можно как-то через кейловский дебаг узнать, а каком прерывании завис МК? Прямо вот ситуативно, как только завис, подключиться и считать регистры нужной периферии?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер вешает STM32f103
СообщениеДобавлено: Чт окт 25, 2018 11:53:16 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 155
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
Поробуйте, если дебуггер не помешает зависаниям. Я в таких случаях использую Ozone и Jlink - подключится к уже запущенному процессу...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Таймер вешает STM32f103
СообщениеДобавлено: Чт окт 25, 2018 12:15:01 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: 0
Alex-Elektron писал(а):
Можно как-то через кейловский дебаг узнать, а каком прерывании завис МК?
Не кейл, но может поймете как нужно настроить отладку. http://purebasic.mybb.ru/viewtopic.php?id=564#p7600


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Таймер вешает STM32f103
СообщениеДобавлено: Чт окт 25, 2018 13:02:36 
Мучитель микросхем
Аватар пользователя

Карма: 6
Рейтинг сообщений: 87
Зарегистрирован: Вс янв 09, 2011 23:05:37
Сообщений: 450
Откуда: СССР
Рейтинг сообщения: 0
Там в отладке есть кнопка Stop. Когда контроллер зависнет нажмите её и увидите в каком месте он завис (если повезёт :))

_________________
Иван Сусанин - первый полупроводник :solder:


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Таймер вешает STM32f103
СообщениеДобавлено: Чт окт 25, 2018 13:16:00 
Встал на лапы

Зарегистрирован: Сб янв 11, 2014 21:25:55
Сообщений: 113
Рейтинг сообщения: 0
Myp3ik, спасибо за совет! Повезло, увидел, на чём висну:

Код:
void DMA1_Channel5_IRQHandler() {
    if (DMA1->ISR & DMA_ISR_TCIF5 ) {
      while(!(SPI2->SR & SPI_SR_RXNE));
      while (SPI2->SR & SPI_SR_BSY);
       
      (void) SPI2->DR;
       
    //  while(!(SPI2->SR & SPI_SR_TXE));
     
      GlobalVar_SPI_Transmitted = 1;       
             
      DMA1_Channel5->CCR &= ~DMA_CCR5_EN; 
      SPI2->CR2 &= ~ SPI_CR2_TXDMAEN;
     
      DMA1->IFCR |= DMA_IFCR_CTCIF5;
    }
 }



вот тут: while(!(SPI2->SR & SPI_SR_RXNE));

до этого использовал поллинг while(!(SPI2->SR & SPI_SR_TXE)); но ушёл от него, видимо, потому, что флаг о законченной передаче данных всплывал раньше времени. Хотя он вообще не должен всплывать раньше while (SPI2->SR & SPI_SR_BSY);

сейчас закомментил while(!(SPI2->SR & SPI_SR_RXNE)); и вернулся к тому, что было - пока полёт нормальный! Во всяком случае, пока я пишу это сообщение, МК ещё ни разу не завис


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Таймер вешает STM32f103
СообщениеДобавлено: Пт окт 26, 2018 18:47:51 
Нашел транзистор. Понюхал.
Аватар пользователя

Карма: 5
Рейтинг сообщений: 21
Зарегистрирован: Пн июл 04, 2016 16:51:22
Сообщений: 196
Откуда: Россия, Омск
Рейтинг сообщения: 0
Как по мне - странный обработчик прерывания.
В прерывании DMA происходит работа с SPI. Мягко говоря, это не очень логичное действие. Плюс, обработка данных SPI интерфейса.
Я бы рекомендовал вынести работу с ним в основной поток и управлять им флагами состояний, а не мучать обработчик прерывания.
Плюс, прерывание рекомендуется делать максимально коротким, а конструкции ожидания - это паузы. А паузы в прерываниях - плохо. Особенно, потенциально бесконечные паузы.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y