Перейти к содержанию
    

STM32F103 не пишет в TIM4->DIER

1 час назад, haker_fox сказал:

Я имел в виду лучше китайского

Чем лучше? А то как в анекдоте получается:

- Знаешь, чем грузины лучше, чем армяне?
- Чем лучше?
- Чем армяне!

По моим понятиям, для начинающего все они абсолютно одинаковые и лучше именно тот, который по цене сравним с бутылкой пива, ибо добыть проще.

3 минуты назад, esaulenka сказал:

Во-первых, скорость работы у сеггеровских отладчиков повыше. Секунда-другая разницы, но всё равно приятно

Приятно, не не критично. Чаще всего мне приходится или пройти по шагам небольшой кусок кода, где мне тоже нужно время на "обдумать", или посмотреть, куда его унесло - а там ядро в останове и торопиться совсем некуда.

5 минут назад, esaulenka сказал:

А во-вторых, RTT - прямо таки гениальная штука.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, k155la3 said:

Я конечно сильно извиняюсь, именно "T8C6" ?

прошу прощения, C8T6

7 hours ago, haker_fox said:

На али стоит копейки. Закажите, хотя бы на будущее. Очень нужная штука

На работе есть STLink. Но на работе я теперь смогу быть только в среду - по графику. самоизоляция, блин... Правда он в плате Дискавери4, но это не особо напрягает.

А с отладчиком то какой алгоритм проверки? Я по по AVR, да по ПЛИСАм больше))) С AVR таких проблем, чтоб отладчиком лазить никогда и не было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Сергей Борщ said:

Приятно, не не критично

Я о времени первоначальной загрузки прошивки. У сеггера она практически равна скорости загрузки во флеш.

 

1 hour ago, Сергей Борщ said:

Но начинающим лучше схватить синицу вот прямо сейчас

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

В общем, да, всячески рекомендую отладчик добыть. Сделать хотя б из blue pill - дёшево и сердито. Все отличия от "настоящего STLink" - отсутствие корпуса и отсутствие защит.

47 minutes ago, MPetrovich said:

А с отладчиком то какой алгоритм проверки?

Сделать то же самое, после "зависания" посмотреть, где крутится программа. Много думать (или спрашивать сюда).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, Сергей Борщ said:

Чем лучше?

Китайцы экономят на всём в дешёвых поделках. Это ни хорошо, и не плохо. Например, может отсутствовать защита линий от статики и перегрузки. Я не против китайских поделок, сам использую анализатор за 450 рублей (известный многим) и доволен. Это по схемотехнике. На чём они ещё могли сэкономить я не знаю. Но разница в 150 рублей и 8 т.р. наверно не только из-за бренда.

11 hours ago, Сергей Борщ said:

Но начинающим

Кстати, а где информация, что автор темы - начинающий?

11 hours ago, Сергей Борщ said:

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

Откуда знать, что начинающему лучше? И ведь я ему предложил оба варианта. Пусть сейчас заказывает с али, потом купит нормальный отладчик. Если захочет.

9 hours ago, MPetrovich said:

Но на работе я теперь смогу быть только в среду

Ну вот, а тут говорят, что вы - начинающий)

9 hours ago, MPetrovich said:

в среду - по графику. самоизоляция, блин

ОФФ: а нам справки выдали (не всем, но мне дали), что я работаю на предприятии, деятельность которого не подпадает под указ нашего президента)))) Но у меня нет особого желания кататься в транспорте всё равно)))

9 hours ago, MPetrovich said:

С AVR таких проблем, чтоб отладчиком лазить никогда и не было.

Ну, тем не менее, отладчик полезен был и с AVR, это я вам по опыту говорю. Работал, в том числе, и с ATMega32HVB, у которой нет аппаратного USART для организации консоли. Поэтому AVR Dragon был постоянно в работе.

9 hours ago, MPetrovich said:

А с отладчиком то какой алгоритм проверки?

Какой хотите. Но, в целом, вы можете:

1. Выполнять программу пошагово.

2. Запустить программу и остановить по условию (точка останова, записиь в определённый адрес и т.п.).

3. Смотреть значение по любому адресу памяти, включая РОН и регистры периферии.

4. Что-то ещё есть, но я не всё помню, т.к. не пользуюсь. Ну, например, ETM.

У каждого пункта есть свои нюансы. Тут лучше почитать литературку, того же Дж. Ю.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, haker_fox said:

Тут лучше почитать литературку, того же Дж. Ю.

А кто это и о чем?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 minutes ago, MPetrovich said:

А кто это и о чем?

Автор №1. После официальных мануалов, конечно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ситуация слегка поменялась. 

Для начала я захотел убедиться, что виснет не в прерываниях, для чего переписал обработчики TIM2 и TIM4:

void TIM2_IRQHandler(void)
{
 if(TIM2->DIER != 0)//If all TIM2 interrupts are not DISABLE
 {
	 TIM_ClearFlag(TIM2, TIM_FLAG_Update);
   /*if(TIM_GetFlagStatus(TIM2, TIM_FLAG_CC1|TIM_FLAG_CC2))//Check flags of CCx interrupts(counter overflow)
	   {PWM_OFF_Period();}
   else 0;*/n++;
 }

Обработчик TIM4 идентичен TIM2.

Но это не решило проблемы останова(зацикливания) при появлении в TIMx->DIER хотя бы одного бита разрешения прерывания  ССхIE. В случае полного отключения всех прерываний (TIMx->DIER =0), контроллер нормально крутится дальше по программе.

В итоге: затыка похоже именно в TIM2_IRQHandler(void) и TIM4_IRQHandler(void). Только вот в чем конкретно - не пойму... :dash2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

43 минуты назад, MPetrovich сказал:

 

В итоге: затыка похоже именно в TIM2_IRQHandler(void) и TIM4_IRQHandler(void). Только вот в чем конкретно - не пойму... :dash2:

Возможно у вас неправильно настроены вектора прерываний, надо смотреть для того ли процессора прописан файл startup????.s

В отладчике надо просто поставить breakpoint на первой команде в обработчике прерывания и попытаться пройти его по шагам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

46 minutes ago, MPetrovich said:

 


void TIM2_IRQHandler(void)
{
 if(TIM2->DIER != 0)//If all TIM2 interrupts are not DISABLE
 {
	 TIM_ClearFlag(TIM2, TIM_FLAG_Update);
   /*if(TIM_GetFlagStatus(TIM2, TIM_FLAG_CC1|TIM_FLAG_CC2))//Check flags of CCx interrupts(counter overflow)
	   {PWM_OFF_Period();}
   else 0;*/n++;
 }

Но это не решило проблемы останова(зацикливания) при появлении в TIMx->DIER хотя бы одного бита разрешения прерывания  ССхIE.

Вы разрешаете прерывания  ССхIE, а в обработчике сбрасываете TIM_FLAG_Update :dash1:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, dimka76 said:

Вы разрешаете прерывания  ССхIE, а в обработчике сбрасываете TIM_FLAG_Update

Да, спасибо. Это я протупил. Однако, изменение обработчиков:

void TIM2_IRQHandler(void)
{
 if(TIM2->DIER != 0)//If all TIM2 interrupts are not DISABLE
 {
	 TIM2->SR = 0;
   /*if(TIM_GetFlagStatus(TIM2, TIM_FLAG_CC1|TIM_FLAG_CC2))//Check flags of CCx interrupts(counter overflow)
	   {PWM_OFF_Period();}
   else 0;*/
	 Usart1_Send_String("TIM2_IRQHandler\r\n ");
	 n++;
 }

Не исправили ситуацию. По-прежнему зависает на месте прерывания и в UART сыпется надпись "TIM4_IRQHandler\r\n "

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

19 minutes ago, MPetrovich said:

 

Не исправили ситуацию. По-прежнему зависает на месте прерывания и в UART сыпется надпись "TIM4_IRQHandler\r\n "

Пока у вас идет отправка по UART могут новые события таймера произойти, которые вызывают прерывание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 минуты назад, MPetrovich сказал:

Не исправили ситуацию. По-прежнему зависает на месте прерывания и в UART сыпется надпись "TIM4_IRQHandler\r\n "

А зачем у вас такая длинная фраза в UART отправляется?

Достаточно сделать без всяких ожиданий готовности

UART1->DR = 0x30; // для TIM2

UART1->DR = 0x31; // для TIM4

И тогда если всё нормально работает,то у вас в терминалы должны появляться символы "0" и/или "1". А если что-то нечитаемое, значит UART не успевает выводить символы  - стоит, например, поднять скорость UART.

 

зы. И кстати, если вы видите, что прерывание TIM4 работает, так стоит убрать из прерывания вывод индикатора срабатывания и оставить только в прерывании TIM2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, HardEgor said:

А если что-то нечитаемое, значит UART не успевает выводить символы

Не может там быть "нечитаемого". Буферизация там всё-таки есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, MPetrovich сказал:

Не исправили ситуацию. По-прежнему зависает на месте прерывания и в UART сыпется надпись "TIM4_IRQHandler\r\n "

Вы жалуетесь на TIM4, но всё время показываете обработчик TIM2. Покажите уже обработчик TIM4 :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 minutes ago, dimka76 said:

Пока у вас идет отправка по UART могут новые события таймера произойти, которые вызывают прерывание.

Да, похоже Вы правы. Вот в таком виде:

void TIM2_IRQHandler(void)
{
 if(TIM2->DIER != 0)//If all TIM2 interrupts are not DISABLE
 {
   if(TIM_GetFlagStatus(TIM2, TIM_FLAG_CC1|TIM_FLAG_CC2))//Check flags of CCx interrupts(counter overflow)
   {
	   TIM2->SR = 0;//Clear all flags of TIM2
	   n++;
	   //PWM_OFF_Period();
   }
   //else 0;
 }
}

прерывание работает и счетчик n считает сколько раз оно произошло. Вот только при подключении вызова функции PWM_OFF_Period(); сама функция не срабатывает. Убедился в этом вставив счетчик внутрь этой функции.

1 minute ago, AHTOXA said:

Вы жалуетесь на TIM4, но всё время показываете обработчик TIM2. Покажите уже обработчик TIM4 :)

void TIM4_IRQHandler(void)
{
 if(TIM4->DIER != 0)//If all TIM4 interrupts are not DISABLE
 {
	 if(TIM_GetFlagStatus(TIM4, TIM_FLAG_CC1|TIM_FLAG_CC2|TIM_FLAG_CC3|TIM_FLAG_CC4))
	 {
		 TIM4->SR = 0;//Clear all flags of TIM2
		 n++;
	    //PWM_OFF_Period();
	 }
    // else 0;
 }
}

Они идентичны. Просто каналы ШИМ TIM4 задействуются раньше и его я и обнаружил в первую очередь)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...