Программирование STM8

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

У меня вроде не было пролем со вложенностью прерываний. Контент на стек МК сам скидывает.
axillent писал(а):а какой это флаг? TIF?
Нет, UIF. Он называется не по переполнению, а по обновлению. Точку же обновления сам назначаешь. Ну можно считать что переполнение, если регистр TIMx_ARR=0xFF.

Добавлено after 3 minutes 47 seconds:
Коли STM8 мучаете. Если не в лом, можете проверить вот это http://radiokot.ru/forum/viewtopic.php? ... 1#p3090161 . А то я так время и не нашел (под этой фразой прячется слово лень).
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

сейчас как раз отлаживаю устройство в котором активно конкурентно работают прерывания по двум таймерам и прерывания по одному пину
теоретически они должны друг на друна попадать, но как это сделать абсолютно точно - не знаю
у меня прерывания по пинам не теряются
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Чтобы это проверить, я хотел запретить прерывания, дать один два импульса на порт, и разрешить прерывания когда уже внешних импульсов нет.

Собственно запрета прерывания глобального как такого нет в контроллере, есть повышение текущего уровня основной программы который прерывания не перебивают.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

вопрос

как избавиться от таких варнингов кроме как описывать промежуточную переменную?
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
речь о коде где вместе используется более одной volatile переменной и где для меня порядок обращения к ним не важен
видел решение использовать #pragma для скрытия варнингов, но мне нужен стандартный код, не только для IAR
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Разбейте одно математическое выражение на несколько, в каждом котором только одна переменная volatile. Тогда точно будет знать про порядок.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

в том то и дело что часто порядок не важен
и получается, что ради избавления от предупреждения надо создавать лишние переменные
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Не переживайте за лишние переменные, объявляйте их как локальные и в узкой области видимости, они долго жить не будут, может даже только в регистрах ядра (маловато конечно регистров в stm, зато система команд неплохая). Оптимизацию только не выключайте.

Добавлено after 8 minutes 24 seconds:
Например.

Код: Выделить всё

func (x+y);
и

Код: Выделить всё

type buf=x;
buf+=y;
func(buf);
Скорее всего компиллятор сделает одинаковый код, все равно же куда то класть надо результат суммы для передачи его в функцию.

З.Ы. По моему скромному мнению конечно.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

а если так?

Код: Выделить всё

return a + *(int*)&b;
где а и b volatile и такой код дает warning:

Код: Выделить всё

return a + b;;
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

буду признателен за строчку кода для повышения приориетат прерывания по update TIM4
так, чтобы прерывание срабатывало внутри external interrupt
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Вот приоритеты прерываний
Изображение
Обратите внимание что приоритеты левела 0 и левала 3 для основного цикла программы устанавливаются командами RIM и SIM. Т.е. установив левел3 для основного цикла, ни одно прерывание не сможет его перебить (таким хитрым образом запрещаются прерывания глобально).

Приоритеты же для соответствующего вектора прерывания настраиваются в регистре ITC_SPRx. По умолчанию уровень 0b11 или левел 3. Т.е. чтобы повысить уровень одного вектора, надо опустить другие включенные, что по-моему неудобно, а что делать...


-----
UPD: Зато можно часть прерываний отключать пачкой, изменяя биты I1 I0 в регистре CCR (типа регистр статуса), ну то есть пывысить уровень основного цикла до левел 1 например и только прерывания левела 2 и 3 будут актиывны, все с левелом 1 будут как бы отключены, только я так не пробовал.
Вложения
стм8 приор.png
(11.94 КБ) 1394 скачивания
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

я правильно понял, что чтобы из EXTIx срабатывал TIMx_OVR_UIF надо у EXTIx приоритет понизить до 2-го?
а это какие биты в каком конкретно регистре? по RM0016 я не понял как векторы связаны с этими регистрами, там почему то нотация другая, иными словами не вижу там EXTIx
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

axillent писал(а):что чтобы из EXTIx срабатывал TIMx_OVR_UIF надо у EXTIx приоритет понизить до 2-го?
Ну или до первого понизить.
axillent писал(а):а это какие биты в каком конкретно регистре? по RM0016 я не понял как векторы связаны с этими регистрами,
Смотрите на каком векторе сидит EXTIx и находите его в регистре ITC_SPRx и в каких битах этого регистра.

Добавлено after 2 minutes 22 seconds:
А таблицу векторов в ДШ смотрите.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

[uquote="axillent",url="/forum/viewtopic.php?p=3191511#p3191511"]а это какие биты в каком конкретно регистре? по RM0016 я не понял как векторы связаны с этими регистрами, там почему то нотация другая, иными словами не вижу там EXTIx[/uquote]
Для примера... настраиваю TIM2 с пониженным приоритетом следующим образом:

Код: Выделить всё

	//настройка таймера TIM2 для организации регулярных прерываний 400Гц
	TIM2_PSCR = 7;                      //предделитель таймера 0-7 (7 = 128)
	TIM2_ARRH = (uint8_t)(154>>8);		//считаем до 150, (для генерации частоты 400Гц при 8МГц)
	TIM2_ARRL = (uint8_t)(154);			
	TIM2_IER_bit.UIE = 1;              	//прерывание по обновлению включено 
	TIM2_CR1_bit.CEN = 1;				//разрешение работы таймера 
	ITC_SPR4 &= ~(0x0C);				//понизить c 3 до 2 программный приоритет у TIM2 update/overflow


В RM0016 на стр.68 есть табличка с 8-мю регистрами ITC_SPR1 - ITC_SPR8, в которых каждые парные 2 бита отвечают за приоритет соответствующего прерывания.
Но в этой таблице (на стр.68), первые два железных прерывания пропущены (RESET и TRAmP или как там его...)))), поэтому VECT0SPR[1:0] это биты не 0-го прерывания а 2-го... соответственно VECT1SPR[1:0] это биты 3-го и т.д.
Так что от фактического номера железного прерывания нужно отнимать 2 чтобы получить номер в таблице на стр.68

Изображение



Номера железных прерываний можно подсмотреть в IAR-е в конце файла iostm8s103f3.
Например, нужный мне вектор TIM2_OVR_UIF_vector находится под номером 0x0F, отнимаем от 15-ти двоечку и получаем номер 13 в таблице на стр.68 т.е. VECT13SPR[1:0] а это конкретно регистр ITC_SPR4 и биты [3:2], отсюда и команда ITC_SPR4 &= ~(0x0C);

Изображение



на стр.67 есть табличка уровней (состояния 2-х битов), от низкого к высокому, по ней и выставляй соответствующую пару...

Изображение



Возможно это решается как то по другому и покрасивее, но мне когда это было нужно, я ничего другого не сообразил, как только таким способом ... так что другого пока не могу предложить)
Вложения
1.png
(77.46 КБ) 1268 скачиваний
3.png
(52.42 КБ) 1264 скачивания
2.png
(11.79 КБ) 1290 скачиваний
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

shads писал(а):, поэтому VECT0SPR[1:0] это биты не 0-го прерывания
Не усложняйте и не путайте. Как раз нулевого и все соответствует, ничего не надо вычитать. Как я уже и говорил, таблицу векторов нужно смотреть в ДШ. Немаскируемые прерывания RESET и TRAP номером не обзавелись, лежат выше нулевого вектора и имеют приоритет выше левела 3 по умолчанию и изменить это нельзя.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Ну да, если по ДШ то соответствует... а я чет ориентировался по IAR файлу, а там ресет это нулевой, поэтому так закрутил )))
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

значит для TIM2 должно быть не так:

Код: Выделить всё

ITC_SPR4 &= ~(0x0C); 
а так:

Код: Выделить всё

ITC_SPR4 &= 0xBF; 
да?
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Вечером погляжу, сейчас на телефоне. Контроллер то какой?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

контроллер STM8S и если я верно понимаю все железо во всей линейке настраивается одинаково, это описано в RM0016
другое дело, что где то какое то железо есть, а где то нет
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Вектор прерывания TIM2_UPD/OVF - №13d. Согласно RM16 , приоритет для данного вектора лежит в ITC_SPR4 3:2. Чтобы установить уровень приоритета 2 ( т.е. I1I0=0b00) нужно сделать так.

Код: Выделить всё

ITC_SPR4 &=0b11110011;
ITC_SPR4 &=0xF3;
ITC_SPR4 &= ~0x0C; 
Все три записи абсолютно идентичны, пользуйтесь той которая Вам удобнее. Можно еще и задефайничть что-нибудь.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

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

скажите как понять номер вектора, откуда следует, что это 13-й вектор?
в каком месте RM0016 это описано?
Ответить

Вернуться в «Разные вопросы по МК»