02.12.2020, 09:18
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
COMP1 STM32F303 обработка прерывания
Не решается проблемка, а лезть в NVIC опасаюсь.
Суть: Прерывание от компаратора не вызывается. Сделал простенький проект для выяснения проблемы. Все в коде. Пожалуйста ткните меня в ошибку.
/* STM32F303VCT6
1. Мигаю по прерыванию EXTI0_IRQHandler
2. Мигаю по прерыванию COMP1_2_3_IRQnHandler
*/
#include "stm32f303xc.h"
extern uint32_t InitRCC(void);
extern void delay_us(int us);
//============== Настройка портов=========================
void InitPort(void)
{
RCC-›AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOEEN;
//Кнопка управления на PA0
GPIOA-›MODER &= ~(GPIO_MODER_MODER0);//PA0 Вход
GPIOA-›OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0); //PA0 Низкая скорость
GPIOA-›PUPDR &= ~(GPIO_PUPDR_PUPDR0); // PA0 не Pull up
GPIOA-›MODER |= GPIO_MODER_MODER1 | GPIO_MODER_MODER3;//Порт A1, A3 - аналоговые;
// GPIOA-›MODER |= GPIO_MODER_MODER4; //Порт PA4 Аналоговый
GPIOE-›MODER |= GPIO_MODER_MODER9_0; //пин Красный 12часов
GPIOE-›MODER |= GPIO_MODER_MODER11_0; //пин Зеленый 3часа
GPIOE-›MODER |= GPIO_MODER_MODER13_0; //пин Красный 6часов
GPIOE-›MODER |= GPIO_MODER_MODER15_0; //пин Зеленый 9часов
}
//================Настройка EXTI
void InitEXTI(void)
{
EXTI-›RTSR |= EXTI_RTSR_TR0; //Прерывание по нарастанию фронта импульса
// EXTI-›FTSR |= EXTI_FTSR_TR0; //Прерывание по спаду импульса
EXTI-›PR = EXTI_PR_PR0; //Сбрасываем флаг прерывания
EXTI-›IMR |= EXTI_IMR_MR0; //Включаю прерывание
NVIC_SetPriority(EXTI0_IRQn,0); //Приоритет высший
NVIC_EnableIRQ(EXTI0_IRQn); //Разрешаю прерывание
}
//================Обработка прерывания EXTI
void EXTI0_IRQHandler(void)
{// ВСЕ РАБОТАЕТ!!!
GPIOE-›ODR ^= GPIO_ODR_15; //Зеленый 9ч
delay_us (50000);
EXTI-›PR = EXTI_PR_PR0; //Сбрасываем флаг прерывания
//В конце обработчика!!! Есть другие мнения, но именно так работает корректно
}
//================= Настройка компараторов пока без ЦАП ===============
void InitComp (void)
{
RCC-›APB2ENR |= RCC_APB2ENR_SYSCFGEN;
COMP1-›CSR = 0;COMP2-›CSR = 0;
COMP1-›CSR |= COMP1_CSR_COMP1INSEL_0 | COMP1_CSR_COMP1INSEL_1 | COMP1_CSR_COMP1EN;
EXTI-›RTSR |= EXTI_RTSR_TR21; //Risig - нарастающий фронт
EXTI-›IMR |= EXTI_IMR_MR21; //Включаю прерывание
EXTI-›PR |= EXTI_PR_PR21; //Сброс флагов EXTI???
NVIC_SetPriority(COMP1_2_3_IRQn,1); //Приоритет компаратора
NVIC_EnableIRQ(COMP1_2_3_IRQn); // МОЖНО И COMP1_2 И COMP
}
//===========Обработка прерывания от компаратора===============================
void COMP1_2_3_IRQnHandler(void)// НИ ХРЕНАСЬКИ ни когда не вызывается
{
EXTI-›PR |= EXTI_PR_PR21; //Сброс флага компаратора
GPIOE-›ODR ^= GPIO_ODR_11; //Зеленый 3ч
delay_us (50000);
// NVIC_ClearPendingIRQ(COMP1_2_3_IRQn); //Игрался этими строками
EXTI-›PR |= EXTI_PR_PR21; //Сброс флага компаратора
}
//==============================================
int main (void)
{ volatile int i;
RCC-›CR |= RCC_CR_CSSON; // Защита HSE от сбоев
InitRCC(); InitPort(); InitEXTI(); InitComp();
while (1)
{
/* При включении
Когда 1 на COMP1 - if работает первым, потом GPIO_ODR_9,
однако по компаратору прерывание не вызывается.
переключаю COMP1 на 0 - прога зависает неизвестно где,
даже GPIO_ODR_9 не переключается.
При этом EXTI0_IRQHandler продолжает работать корректно.
Когда 0 на COMP1 - все нормально, т.е.
GPIO_ODR_9 (Красный 12ч) молотит с Т=1,7 мкс, EXTI0_IRQHandler работатет.
переключаю COMP1 на 1 - прога зависает неизвестно где,
по компаратору прерывание не вызывается,
даже GPIO_ODR_9 не переключается.
При этом EXTI0_IRQHandler продолжает работать корректно
= Похоже "завис" внутри NVIC, но COMP1_2_3_IRQnHandler не вызывается никогда
и это выше моих сил...
*/
if (COMP1-›CSR & COMP1_CSR_COMP1OUT)
{
GPIOE-›ODR ^= GPIO_ODR_13; //Красный 6ч
delay_us (50000);
}
GPIOE-›ODR ^= GPIO_ODR_9; //Красный 12ч
}
}
__________________
Будь проще, дойдет и до синтеза.
|
|
|
|
02.12.2020, 09:28
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,314
Сказал спасибо: 173
Сказали Спасибо 3,113 раз(а) в 2,007 сообщении(ях)
|
Re: COMP1 STM32F303 обработка прерывания
Да кто ж блин в прерывании задержку ставит по полчаса?)))))
__________________
ОГМ/ПОГМ
|
|
|
|
02.12.2020, 10:24
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Re: COMP1 STM32F303 обработка прерывания
Сообщение от индюк
|
Да кто ж блин в прерывании задержку ставит по полчаса?)))))
|
И что? В чем проблема?
__________________
Будь проще, дойдет и до синтеза.
|
|
|
|
02.12.2020, 10:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,667
Сказал спасибо: 130
Сказали Спасибо 1,071 раз(а) в 516 сообщении(ях)
|
Re: COMP1 STM32F303 обработка прерывания
Проблема в том, что обработка одного прерывания блокирует обработку остальных. Что часто ведет к пропуску прерывания.
А потому при обработке прерывания:
1) Все тяжелые и длительные фрагменты выкидываем из обработки прерывания. Обработка прерывания - делаем максимально быстро.
Если тебе нужно такая длительная выдержка - как вариант просто пни таймер. А таймер по прерыванию выполнит нужное действие.
2) Не ставим разрешение прерывания на последнюю команду обработчика!
Из-за особенности работы кэширования - может не выполнятся. А может выполнятся. Вообще потенциально может вести странно.
И вообще - разрешение прерывания нужно выполнять как можно быстрее. Максимально быстро ( с учетом логики обработчика прерывания ес-но.)
|
|
|
|
02.12.2020, 11:31
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Re: COMP1 STM32F303 обработка прерывания
Сообщение от DanilinSA
|
Проблема в том, что обработка одного прерывания блокирует обработку остальных. Что часто ведет к пропуску прерывания.
|
Ради Бога не надо об очевидных вещах! Это вариант для выяснения почему не вызывается прерывание от компаратора и этими вставками я пытался это выяснять и все!!!
__________________
Будь проще, дойдет и до синтеза.
|
|
|
|
02.12.2020, 11:35
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,314
Сказал спасибо: 173
Сказали Спасибо 3,113 раз(а) в 2,007 сообщении(ях)
|
Re: COMP1 STM32F303 обработка прерывания
А оно вообще генерируется у тебя?
Флаг то появляется???
__________________
ОГМ/ПОГМ
|
|
|
|
02.12.2020, 12:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,374
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: COMP1 STM32F303 обработка прерывания
Сообщение от marera
|
почему не вызывается прерывание от компаратора и этими вставками я пытался это выяснять
|
а вместо этого огорода просто флаг проверить, не?
|
|
|
|
02.12.2020, 13:04
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Re: COMP1 STM32F303 обработка прерывания
Сообщение от индюк
|
А оно вообще генерируется у тебя?
Флаг то появляется???
|
Компаратор срабатывает-это видно, флаг EXTI_PR_PR21, естественно не выставляется, это и пытаюсь понять - почему?
__________________
Будь проще, дойдет и до синтеза.
|
|
|
|
02.12.2020, 13:53
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,314
Сказал спасибо: 173
Сказали Спасибо 3,113 раз(а) в 2,007 сообщении(ях)
|
Re: COMP1 STM32F303 обработка прерывания
Так изучай настройки компа и маски векторов
__________________
ОГМ/ПОГМ
|
|
|
|
02.12.2020, 14:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,667
Сказал спасибо: 130
Сказали Спасибо 1,071 раз(а) в 516 сообщении(ях)
|
Re: COMP1 STM32F303 обработка прерывания
А компаратор вообще "дышит"? Вытащи его выход на внешний пин. И посмотри, уровень там изменяется?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:20.
|
|