26.01.2015, 11:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,360
Сказал спасибо: 85
Сказали Спасибо 619 раз(а) в 374 сообщении(ях)
|
STM32F4 - таймер
Делаю устройство на STM32F407.
Использую таймер и прерывание.
Не могу понять, почему прерывание вызывается дважды при автоперезагрузке таймера, причем второй раз сразу же после первого (через 400 нс). При этом один раз в TIM7-›SR установлен флаг TIM_SR_UIF, а второй раз TIM7-›SR равен нулю.
Вот код:
PHP код:
|
__irq void TIM7_IRQHandler(void) { TIM7-›SR &= ~TIM_SR_UIF; // clear UIF flag }
void InitTimer7(void){ TIM_TypeDef *T; //Enable clock TIM7 RCC-›APB1ENR |= RCC_APB1ENR_TIM7EN;
T=TIM7; T-›PSC = 42*2-1; T-›ARR = 128-1; T-›DIER = TIM_DIER_UIE; // Enable update interrupt (timer level) T-›CR1 |= TIM_CR1_CEN; // Enable timer NVIC_EnableIRQ(TIM7_IRQn); }
|
Пробовал с другими таймерами - все аналогично.
Чего я не так делаю, или так и должно быть, может где-то недочитал чего?
|
|
|
|
26.01.2015, 11:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,360
Сказал спасибо: 85
Сказали Спасибо 619 раз(а) в 374 сообщении(ях)
|
Re: STM32F4 - таймер
Похоже, не успевает сброситься флаг прерывания. Видимо, не сразу сбрасывается.
Вот так прерывание вызывается дважды:
PHP код:
|
#define TST1 GPIOB-›BSRRL=(1‹‹2) #define TST0 GPIOB-›BSRRH=(1‹‹2)
volatile dword mmm;
__irq void TIM7_IRQHandler(void) { mmm++; if (mmm & 0x01) TST1; else TST0; TIM7-›SR &= ~TIM_SR_UIF; }
|
А так все в порядке:
PHP код:
|
__irq void TIM7_IRQHandler(void) { TIM7-›SR &= ~TIM_SR_UIF; mmm++; if (mmm & 0x01) TST1; else TST0; }
|
Т.е., за некоторое время, пока дрыгаю ногой, флаг прерывания во втором случае успевает сброситься.
Но вообще как-то странновато. Подобный момент в какой-то документации описан?
|
|
|
|
26.01.2015, 11:25
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: STM32F4 - таймер
Потому что обработчик прерывания пустой! Из-за фишек ядра, сброс флага, по сути, происходит после выхода из прерывания. Добавьте барьер, НОПы или ещё что нибудь, тогда и попустит.
Да и вообще. Обработчик прерывания в таком виде выглядит глупо и невостребованым, согласитесь.
|
|
|
|
26.01.2015, 11:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,360
Сказал спасибо: 85
Сказали Спасибо 619 раз(а) в 374 сообщении(ях)
|
Re: STM32F4 - таймер
Понятно, что глупо, когда пусто
Я убрал оттуда все лишнее, чтобы не перегружать мозг
В общем, если сбрасывать флаг в конце обработчика, прерывание успевает вызваться еще раз.
Если в начале - то флаг успевает сброситься к моменту выхода.
|
|
|
|
26.01.2015, 11:45
|
|
Прописка
Регистрация: 29.06.2010
Сообщений: 104
Сказал спасибо: 14
Сказали Спасибо 9 раз(а) в 7 сообщении(ях)
|
Re: STM32F4 - таймер
Сообщение от pambaru
|
Понятно, что глупо, когда пусто
В общем, если сбрасывать флаг в конце обработчика, прерывание успевает вызваться еще раз.
|
Скорее флаг не успевает сбросится! поэтому после выхода сразу возвращается в прерывание.
|
|
|
|
26.01.2015, 12:14
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: STM32F4 - таймер
Угу! В F0 успевает, а в F4 не успевает, патамушта F4 тормозной на флагах?
Дело в ядре, в его фишках, в его организации, в приоритетах шин. Не с бодуна же барьеры АРМ нарисовал?
|
|
|
|
26.01.2015, 13:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,360
Сказал спасибо: 85
Сказали Спасибо 619 раз(а) в 374 сообщении(ях)
|
Re: STM32F4 - таймер
Сообщение от STM32F0
|
Не с бодуна же барьеры АРМ нарисовал?
|
Если не секрет, что за барьеры? Где посмотреть-почитать?
|
|
|
|
26.01.2015, 13:55
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: STM32F4 - таймер
Сообщение от pambaru
|
Если не секрет, что за барьеры?
|
Специальные команды такие - DSB, DMB, ISB.
Сообщение от pambaru
|
Где посмотреть-почитать?
|
В документации, где же ещё... - http://infocenter.arm.com/help/topic..._m_profile.pdf
|
|
|
Сказали "Спасибо" _Артём_
|
|
|
26.01.2015, 14:13
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: STM32F4 - таймер
В данном случае барьер такая же затычка как и любой кусок кода. В других случаях, при арбитраже шин, барьеры уже нужнее. Просто нужно помнить про это, чтобы не впадать в психоделический ступор в самый неподходящий момент.
|
|
|
|
26.01.2015, 14:22
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: STM32F4 - таймер
Сообщение от STM32F0
|
В данном случае барьер такая же затычка как и любой кусок кода.
|
Почему затычка? Они, в частности, и для этого предназначены - чтобы не было повторного входа в обработчик прерывания.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:57.
|
|