30.07.2013, 10:23
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Ну так и проверьте/обработайте сначала оба события, а потом уже гасите пендинги перед выходом из прерывания.
И гасите их как
EXTI-›PR = 1‹‹PinSet2;
|
|
|
|
30.07.2013, 14:59
|
|
Временная регистрация
Регистрация: 18.07.2012
Сообщений: 73
Сказал спасибо: 4
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от nahimovv
|
Ну так и проверьте/обработайте сначала оба события, а потом уже гасите пендинги перед выходом из прерывания.
И гасите их как
EXTI-›PR = 1‹‹PinSet2;
|
Как вывернуться, я смогу придумать. Но выворачиваться стоит, когда что-то работает неправильно. Вопрос - а работает точно неправильно? И что именно: мой код или ошибка контроллера? Я сомневаюсь, что это ошибка контроллера, но и мой код настолько маленький, где тут можно ошибку допустить. Все же вопрос остается открытым - там же битовое управление флагами источников прерываний, как может очистка одного флага очищать и другой.
|
|
|
|
30.07.2013, 16:40
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от TAutomatic
|
Добрый день, коллеги.
Есть опасность потерять необработанное прерывание. В еррате ничего про это не сказано, ни с чем подобным ранее не сталкивался. Прошу подсказки.
|
Еррата тут не причём. Строкой
Код:
|
EXTI-›PR |= 1‹‹PinSet1; |
вы сбрасываете флаги остальных сработавших входов, как и написано в мануале.
Лучше так:
Код:
|
void EXTI9_5_IRQHandler(void)
{
uint32_t int_flags=EXTI-›PR;
EXTI-›PR=int_flags;
if (int_flags & (1‹‹PinSet1))
{
.................
ChangeModeStatus = 1;
}
if (int_flags & (1‹‹PinSet2))
{
..................
ChangeModeStatus = 1;
}
} |
P.S.Ещё и работать будет быстрее.
|
|
|
|
30.07.2013, 20:53
|
|
Временная регистрация
Регистрация: 18.07.2012
Сообщений: 73
Сказал спасибо: 4
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от _Артём_
|
Код:
|
void EXTI9_5_IRQHandler(void)
{
uint32_t int_flags=EXTI-›PR;
EXTI-›PR=int_flags;
if (int_flags & (1‹‹PinSet1))
{
.................
ChangeModeStatus = 1;
}
if (int_flags & (1‹‹PinSet2))
{
..................
ChangeModeStatus = 1;
}
} |
P.S.Ещё и работать будет быстрее.
|
Код нормальный, возражение нет - спасибо.
Но я все равно не нашел, как Вы пишите, в мануале, что сброс бита конкретной линии сбрасывает флаги остальных линий.
Я пользуюсь документом Doc ID 16188 Rev 4
Написано на стр 138:
[HTML]
PRx: Pending bit
0: No trigger request occurred
1: selected trigger request occurred
This bit is set when the selected edge event arrives on the external interrupt line. This bit is
cleared by writing a 1 into the bit or by changing the sensitivity of the edge detector.
[/HTML]
Речь идет об установке или сбросе конкретного бита. Всю жизнь думал, что я могу правильно читать тексты на английском....
Тем не менее, за подсказку еще раз спасибо.
|
|
|
|
30.07.2013, 21:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от TAutomatic
|
не нашел, как Вы пишите, в мануале, что сброс бита конкретной линии сбрасывает флаги остальных линий
|
Не сброс, а установка, и не всех остальных, а одной единственной, о чем и написали выше.
Возьмите блокнот и карандаш и проверьте по шагам, что происходит при выполнении оператора типа:
Код:
|
EXTI-›PR |= 1‹‹PinSet1; |
Сразу всё и всплывёт.
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 30.07.2013 в 21:10.
|
|
|
|
30.07.2013, 21:42
|
|
Временная регистрация
Регистрация: 18.07.2012
Сообщений: 73
Сказал спасибо: 4
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от tempora
|
Не сброс, а установка, и не всех остальных, а одной единственной, о чем и написали выше.
Возьмите блокнот и карандаш и проверьте по шагам, что происходит при выполнении оператора типа:
Код:
|
EXTI-›PR |= 1‹‹PinSet1; |
Сразу всё и всплывёт.
|
Я не совсем понимаю, что Вы мне посоветовали? Мне нужен сброс бита, коллега _Артём_ тоже пишет о сбросе флагов, в мануале написано -
This bit is cleared, Вы пишите об установке. Чего? Что вы имели ввиду?
|
|
|
|
30.07.2013, 21:50
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Открываем референс, находим Pending register (EXTI_PR).
В полях битов написано rc_w1. Запускаем поиск по даташиту и находим:
1.1 List of abbreviations for registers
read/clear (rc_w1) Software can read as well as clear this bit by writing 1. Writing ‘0’ has
no effect on the bit value.
Вуаля!
|
|
|
|
30.07.2013, 22:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от nahimovv
|
Вуаля!
|
Ещё нет, у него есть и другая проблема.
__________________
There's always more than one way to skin a cat.
|
|
|
|
31.07.2013, 03:21
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от TAutomatic
|
Мне нужен сброс бита, коллега _Артём_ тоже пишет о сбросе флагов, в мануале написано -
|
Дело в том, что
Цитата:
|
PRx: Pending bit
....
This bit is cleared by writing a 1 into the bit
|
Такой код
Код:
|
EXTI-›PR |= 1‹‹PinSet1; |
считывает содержимое EXTI-›PR, делает операцию OR с числом (1‹‹PinSet1) и пишет результат в EXTI-›PR (чтение-модификация-запись). В результате сбрасываются не только бит с номером PinSet1, но и остальные биты не равные 0 (так как они - is cleared by writing a 1 - сбрасываются записью 1 ).
Такой код:
Код:
|
EXTI-›PR = 1‹‹PinSet1; |
сбрасывает только бит с номером PinSet1, так как запись 0 не может сбросить бит в регистре EXTI-›PR, если он равен 1.
|
|
|
Сказали "Спасибо" _Артём_
|
|
|
31.07.2013, 08:43
|
|
Временная регистрация
Регистрация: 18.07.2012
Сообщений: 73
Сказал спасибо: 4
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от _Артём_
|
Такой код:
Код:
|
EXTI-›PR = 1‹‹PinSet1; |
сбрасывает только бит с номером PinSet1, так как запись 0 не может сбросить бит в регистре EXTI-›PR, если он равен 1.
|
Да, действительно, бегло прочитал и не увидел эту разницу. Это правильно. Спасибо.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:21.
|
|