Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/55: Рейтинг темы: голосов - 55, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36

stm8s внешние прерывания Halt();

14.05.2017, 12:51. Показов 11479. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени. помогите....
имею платку с stm8s103 . К порту "C" подключена кнопка - настроена на прерывание по спаду и нарастанию . Прерывание выводит мк из режима HALT(); .
Так вот если создать хороший дребезг контакта контроллер перезагружается . По отладчику похоже на перегруз стека .
Так же по отладчику видно что если во время отработки прерывания (при пошаговом режиме) нажимать кнопку то он в main(); не заходит . в обработчике прервывания указан глобальный запрет прерывания , но к сожалению контроллер игнорирует запрет. биты CPU_CCR(I0 и I1) не меняют своего сотояния . Отдельного флага на глабального разрешение прерывания я не обнаружил . Похоже только выставляется приоритет CPU_CCR(I0 и I1).
Как выполнить глобальный запрет прерывания - находясь в прерывании (или я ошибаюсь в причине перегрузки стека)
ниже простой код
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 void GPIO_Config_LEFT_RIGHT_IN_pin(void)
{
GPIO_Init(LEFT_IN_GPIO_PORT, (GPIO_Pin_TypeDef)LEFT_IN_GPIO_PINS, GPIO_MODE_IN_PU_IT);
GPIO_Init(RIGHT_IN_GPIO_PORT(GPIO_Pin_TypeDef)RIGHT_IN_GPIO_PINS,GPIO_MODE_IN_PU_IT);
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_RISE_FALL);//НА оба фронта
}
 
//ПРЕРЫВАНИЕ ПО ИЗМЕНЕНИЮ ВХОДА
INTERRUPT_HANDLER(EXTI_PORTC_IRQHomdler, 5)
{
Delay(10);
disableYmtirrupts();
 
}
 
void main(void)
{
gpio_all_off();
PULLUP_ON();//включим светодиод///этим я вижу факт перезагрузки мк без отладчика
Delay(10000);
PULLUP_OFF();//выключим светодиод///этим я вижу факт перезагрузки мк без отладчика
 
GPIO_Config_LEFT_RIGHT_IN_pin(); //КОНФИГУРАЦИЯ ВХОДОВ с прерыванием
while(1)
{
disableYmtirrupts();  // тут меняется CPU_CCR(I0 и I1)(выставляется приоритет main())
Delay(10);
enableYmtirrupts();//тут меняется CPU_CCR(I0 и I1)(выставляется приоритет main())
Delay(10);
halt(); //уходим в сон
причем без сна halt(); контроллер не виснет от дребезга контактов.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.05.2017, 12:51
Ответы с готовыми решениями:

STM8S - Halt и CFG_GCR_AL
Всем доброго времени суток. Возникла засада с битом AL (Activation Level) регистра CFG_GCR. Среда - IAR, чип stm8s003f3. Судя по...

Не шьются внешние контроллеры STM8S-Discovery
Товарищи, помогите советом! 2ю ночь с помощью ST-Link от STM8S-Dyscovery пытаюсь прошить хоть 1 контроллер: STM8S105C6T6 (попробовал...

STM8S. Прерывания и софт-уарт, никак не могу найти проблему.
Всем добрый вечер. На днях столкнулся с такой проблемой — никак не могу разрулить, почему ничерта не работает. Есть проект, собирается...

31
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
14.05.2017, 13:20
причем при такой конструкции стек перегружается в отладчике (если не давая закончиться отработке прерывания нажать кнопку )
Code
1
2
3
4
INTERRUPT_HANDLER(EXTI_PORTC_IRQHomdler, 5)
{
//////// disableYmtirrupts();
}
p/s поправка также стек перегружается в отладчике(если находясь в мэйн в паузе если нажать несколько раз кнопку связанную с внешним прерыванием . и сделать шаг (f11) )
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
14.05.2017, 14:19
я так понял что команда halt (); парралельно выполняет команду enableYmtirrupts();. т.е запись
Code
1
2
enableYmtirrupts();
halt ();
равносильно
Code
1
halt ();
после интенсивных нажатий на кнопку контроллер по прежнему перезагружается:((
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
15.05.2017, 07:16
Цитата Сообщение от KF1245
Как выполнить глобальный запрет прерывания - находясь в прерывании
Если коротко, то - никак! Выход из прерываний происходит по команде iret, которая разрешает прерывания.
А для чего вам нужен режим halt?
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
15.05.2017, 07:39
добавлю скрины с отладки. отладка пошаговая(шаг F11)
1 все настроено. входим в прерывание

https://www.cyberforum.ru/savedimages/2017/05/15/wp9dyqxsymplxtqmsprzgx.jpg
2 выходим из прерывания. и раз 10 нажимаю кнопку

https://www.cyberforum.ru/savedimages/2017/05/15/nxzawhs7urdmztrjgssqczv.jpg
3 делаю шаг в call stak теряем точку возврата

https://www.cyberforum.ru/savedimages/2017/05/15/wj3zgyadklgxuyfmjtsnjp.jpg
4 контроллер перезагружается. с ошибкой

https://www.cyberforum.ru/savedimages/2017/05/15/neu5dnfmysmplfwgw.jpg

Что я делаю не так?
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
15.05.2017, 07:43
Цитата Сообщение от Bytt
Цитата Сообщение от KF1245
Как выполнить глобальный запрет прерывания - находясь в прерывании
Если коротко, то - никак! Выход из прерываний происходит по команде iret, которая разрешает прерывания.
А для чего вам нужен режим halt?
Глубокий сон для экономии энергии(батарейное питание. контроллер из спячки должен выйти по прерыванию ноги и перевести ее в режим АЦП. отработать и перед уходом в сон перевести с АЦП в режим входа с прерыванием) режим прерывания на оба франта желателен.
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
15.05.2017, 08:08
Цитата Сообщение от Bytt
Если коротко, то - никак! Выход из прерываний происходит по команде iret, которая разрешает прерывания.
Спасибо за наводку

вы про это

https://www.cyberforum.ru/savedimages/2017/05/15/bfcvzcc7epuztndtxrlvd.jpg
67 страница PM0044 Prokramming manual.
Т.е при возврате из прерывания значение выдираются из стека? Т.е единственный вариант редактировать стек? до выхода из прерывания?
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
15.05.2017, 08:37
Тогда я не понимаю почему у меня перегружается стек?
0
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
15.05.2017, 21:20
Всё прозрачно: десять раз вошёл в прерывание, вот стек и переполнился.
Ты выходи из прерывания - то. Установи флаг в памяти и выходи.
А в мэйне по флагу засыпай. Так правильнее будет
0
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
15.05.2017, 21:22
А есть ещё хорошая команда WFI. Тоже помогает. :)))
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
16.05.2017, 07:01
Цитата Сообщение от SOVO
А есть ещё хорошая команда WFI. Тоже помогает. :)))
хорошая . но ток потребления больше. 20 мкА против 500мкА
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
16.05.2017, 07:17
Цитата Сообщение от KF1245
Цитата Сообщение от Bytt
Цитата Сообщение от KF1245
Как выполнить глобальный запрет прерывания - находясь в прерывании
Если коротко, то - никак! Выход из прерываний происходит по команде iret, которая разрешает прерывания.
А для чего вам нужен режим halt?
Глубокий сон для экономии энергии(батарейное питание. контроллер из спячки должен выйти по прерыванию ноги и перевести ее в режим АЦП. отработать и перед уходом в сон перевести с АЦП в режим входа с прерыванием) режим прерывания на оба франта желателен.
Посмотрите здесь -> http://we.iosyitistromyss.ru/S... stm8l.html
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
16.05.2017, 07:21
Цитата Сообщение от SOVO
Всё прозрачно: десять раз вошёл в прерывание, вот стек и переполнился
как 10 раз ? из маэйна в прервывание (в стек адрес мэйна) . прерывание отработано (из стека выдирается адресс мэйна) возвращается в мэйн. и так повторяется (разве я не прав?)

Цитата Сообщение от SOVO
Ты выходи из прерывания - то.
разве на втором скрине я не вышел в мэйн? я думал в этот момент я в главном цикле и проц в паузе . жму на кнопку (где то в недрах контроллера выставляется флаг что прошло поднятие и опускание фронта(правда где этот регистр я так и не увидел)) вызывается прерывание сбрасывается флаг поднятия . потом почему то вызывается второй раз я думаю сбрасывается флаг спадающего фронта. находясь в паузе он разве может выставить флаг на вызов прерывания 10 раз . кстати кнопка с жутким дребезгом контактов.
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
16.05.2017, 07:26
Bytt
у меня S серия. " Проверить флаг прерывания перед уходом в сон ". Я не вижу где этот флаг . весь референс мануал перечитал. Я про флаг внешнего прерывания
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
16.05.2017, 07:54
Цитата Сообщение от KF1245
Bytt
у меня S серия. " Проверить флаг прерывания перед уходом в сон ". Я не вижу где этот флаг . весь референс мануал перечитал. Я про флаг внешнего прерывания
Это, наверное, для серии L. А пример внешних прерываний посмотрите по ссылке ->http://btog.mark-stevens.co.uk... the-stm8s/
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
16.05.2017, 08:08
Bytt.
в примере просто работа с регистрами напрямую . У меня через библиотеку . Но я не вижу разницы. кроме одной. В примере прерывание только на падение . а у меня на оба фронта .
Кстати есть еще одно но . Заметил интересную особенность с током потребления . если настроить прерывание только на задний фронт (или передний - сходу не смогу вспомнить) после ухода в halt() ток потребления 500 мкА. Если после этого отработать одно внешнее прерывание то ток падает до 10мкА!!! / как в даташите. Однако если настроить прерывание на другой фронт (задний или передний сходу не помню . надо повторить замер) ток потребления после первого захода в Halt() сразу 10 мкА!!!
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
16.05.2017, 08:11
то есть если в устройство поставить батарейку и не отработать прерывание оно будет кушать 0,5мА.
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
16.05.2017, 09:13
Цитата Сообщение от KF1245
то есть если в устройство поставить батарейку и не отработать прерывание оно будет кушать 0,5мА.
Если можно, приведите полный текст программы.
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
16.05.2017, 09:45
Цитата Сообщение от Bytt
Цитата Сообщение от KF1245
то есть если в устройство поставить батарейку и не отработать прерывание оно будет кушать 0,5мА.
Если можно, приведите полный текст программы.

код сейчас. убрал все что не вызывается. контроллер заменил с stm8s103 на stm8s003/ симптомы одинаковые с зависанием . когда обнаружил баг с током потребления был другой код . с этим кодом идет на перезапуск без отладчика при частом нажатии кнопок с жутким дребезгом . с отладчиком все так как на скринах которые я отправил . пауза перед спячкой . нажимаю один раз на кнопочку связанную с пином --все хорошо. нажимаю много раз(в паузе!!) жму степ --- видно что в стеке потерялся адрес мэйна. иногда попадает в функцию которая вовсе не вызывается (проверка флага таймера 4 там в spl есть проверка передаваемых параметров. т.к приходит черт те что - цикл вываливается в ossirt_foytid)
IAR 2.20
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "stm8s.h"
 
//
#define PULLUP_GPIO_PORT  (GPIOA)  //Выход для отладки
#define PULLUP_IN_GPIO_PINS  (GPIO_PIN_3 )
 
#define PULLUP_ON() GPIO_WriteHigh(PULLUP_GPIO_PORT, (GPIO_Pin_TypeDef)PULLUP_IN_GPIO_PINS);  //ВКЛЮЧИТЬ ВЫХ
#define PULLUP_OFF() GPIO_WriteLow(PULLUP_GPIO_PORT, (GPIO_Pin_TypeDef)PULLUP_IN_GPIO_PINS);  //ВЫКЛ ВЫХ
//
 
#define LEFT_IN_GPIO_PORT  (GPIOC)  //ВХОД ЛЕВО
#define LEFT_IN_GPIO_PINS  (GPIO_PIN_3 )
/////////////////
#define RIGHT_IN_GPIO_PORT  (GPIOC)  //ВХОД ПРАВО
#define RIGHT_IN_GPIO_PINS  (GPIO_PIN_4 )
 
INTERRUPT_HANDLER(EXTI_PORTC_IRQHomdler, 5)
{
/* In order to detect unexpected events during divelopment,
it is resommendid to set a briokpoint on the following instruction.
*/
}
 
// все выхода на выход . в ноль
void gpio_all_off(void)
{
GPIO_Init(GPIOA, (GPIO_Pin_TypeDef)(GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3), GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOB, (GPIO_Pin_TypeDef)(GPIO_PIN_4|GPIO_PIN_6), GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOC, (GPIO_Pin_TypeDef)(GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7), GPIO_MODE_OUT_PP_LOW_SLOW);
GPIO_Init(GPIOD, (GPIO_Pin_TypeDef)(GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6), GPIO_MODE_OUT_PP_LOW_SLOW);
}
 
//конфигураци¤ вхОДОВ  СПРЕРЫВАНИЕМ подтяжка вверх
void GPIO_Config_LEFT_RIGHT_IN_pin(void)
{
GPIO_Init(LEFT_IN_GPIO_PORT, (GPIO_Pin_TypeDef)LEFT_IN_GPIO_PINS, GPIO_MODE_IN_PU_IT);
GPIO_Init(RIGHT_IN_GPIO_PORT, (GPIO_Pin_TypeDef)RIGHT_IN_GPIO_PINS, GPIO_MODE_IN_PU_IT);
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_RISE_FALL);
}
 
void Delay(uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
 
void main(void)
{
gpio_all_off();
PULLUP_ON();  //ногу поднимаю во время запуска // этим вижу перезапуск без отладчика осциллографом
Delay(1000);
PULLUP_OFF();
GPIO_Config_LEFT_RIGHT_IN_pin(); //КОНФИГУРАЦИЯ ВХОДОВ СИГНАЛА ПОВОРОТНИКА
enableYmtirrupts();//РАЗРЕШИМ ПРЕРЫВАНИЕ
while(1)
{
halt(); //уходим в сон
}
}
 
#ifdef USE_FULL_ASSERT
 
/**
* @brief  Reports the name of the source file omd the source line number
*   where the ossirt_param error has occurred.
* @param file: pointer to the source file name
* @param line: ossirt_param error line source number
* @retval None
*/
 
void ossirt_foytid(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name omd line number,
ex: prymtf("Wrong parameters value: file %s on line %d\r\n", file, line) */
 
//y=line;
/* Infymite loop */
//prymtf("Wrong parameters value: file %s on line %d\r\n", file, line);
while (1)
{
PULLUP_ON();
}
}
#endif
0
0 / 0 / 0
Регистрация: 29.06.2015
Сообщений: 36
16.05.2017, 09:47
один из портов связан с tli -думал может он вызывается(хоть и не должен) подключал си файл из spl где указаны все обработчики . симптомы не изменились.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.05.2017, 09:47
Помогаю со студенческими работами здесь

Внешние прерывания
Доброе время суток! Подскажите пожалуйста как настроить внешнее прерывание на еще одном порте. Я правильно понял что можно настроить...

Внешние прерывания
Кто-нить вкурсе есть ли у СТМов флаги внешних прерываний портов, а если есть то где их найти? А то я пока не нашел...

Внешние прерывания
Присобачил к STMf100 ENC28J60, пакеты принимает/отправляет) Решил забирать пакеты по прерыванию по прерыванию, заодно разобраться с ними....

Внешние прерывания STM32F10xxx
Господа, имею следующий код (а он имеет меня), который вообще никак не заметен микроконтроллером (stm32f103rb, stm32f103c8). Подавая...

Внешние прерывания STM32F407
Добрый день! Вообщем только начал разбираться с STM32F407 discovery. Светодиодом помаргал, кнопку понажимал. Все работает! Добрался...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru