stm32f103c8t6-> EXTI сброс pending
Сообщений 1 страница 6 из 6
Поделиться22019-01-05 03:48:17
Помогло + http://easyelectronics.ru/arm-uchebnyj- … vanij.html
NVIC_ClearPendingIRQ (EXTI0_IRQn);
Отложенные прерывания в NVIC.
Поделиться32019-01-05 11:08:05
В exti->pr правильнее сбрасывать через =. Поскольку используеться РТОС скорее всего нельзя использовать 0 приоритет (у меня еще и 15 тк PendSV должен иметь минимальный приоритет)
Поделиться42019-01-05 15:15:11
В exti->pr правильнее сбрасывать через =.
Правильнее ваще не вешать кнопки на exti... Но для кого-то скоростная езда по граблям... на велосипеде... с квадратными колёсами... что бег на ходулях по минному полю... является своеобразным видом спорта...
Поделиться52019-01-05 15:53:50
В exti->pr правильнее сбрасывать через =. Поскольку используеться РТОС скорее всего нельзя использовать 0 приоритет (у меня еще и 15 тк PendSV должен иметь минимальный приоритет)
А почему нельзя ? вложенные же прерывания. И по поводу приоритета прерываний,если не ошибаюсь то для ртос дает малый уровень прерываний,чтоб не блокировать прерывания пользователей? или не прав ?
exti->pr не сбрасывал,в том то и дело... У меня кнопка с энкодера подвязана для входа в меню и уже там обрабатываем установки переменных,работая только в одной задаче. По выходе из задачи установок востанавливаю работу других задач. Буду дописывать для записи во флэш и передачи в основную задачу очередью установок.
void vTask_setup(void *pvParameters ) { //uint8_t pin_a0; char txt_setup[10]; char ystav,giz,on_off=0; for(;;) { if(xSemafor_setup != NULL ) { if(xSemaphoreTake(xSemafor_setup, LONG_TIME) == pdTRUE) { HAL_NVIC_DisableIRQ(EXTI0_IRQn); vTaskSuspend( xTask_main_Handle ); // off task min //pin_a0=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0); while(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)) __NOP; HAL_Delay(5); TIM3->ARR=30; // enkoder TIM3->CNT=0; sprintf(txt_setup," Setup "); ssd1306_Puts(txt_setup,1); // text and stroka ssd1306_update(1); while(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)) { ystav=TIM3->CNT; taskENTER_CRITICAL(); sprintf(txt_setup," T=%d C ",ystav); ssd1306_Puts(txt_setup,2); // text and stroka ssd1306_update(2); taskEXIT_CRITICAL(); } while(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)) __NOP; HAL_Delay(5); TIM3->ARR=10; // enkoder TIM3->CNT=0; while(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)) { giz=TIM3->CNT; taskENTER_CRITICAL(); sprintf(txt_setup,"Tgis=%d C",giz); ssd1306_Puts(txt_setup,2); // text and stroka ssd1306_update(2); taskEXIT_CRITICAL(); } while(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)) __NOP; HAL_Delay(5); TIM3->ARR=1; // enkoder TIM3->CNT=0; while(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)) { on_off=TIM3->CNT; if(on_off) { sprintf(txt_setup,"Вкл?=Да "); taskENTER_CRITICAL(); ssd1306_Puts(txt_setup,2); // text and stroka ssd1306_update(2); taskEXIT_CRITICAL(); } else { sprintf(txt_setup,"Вкл?=Нет "); taskENTER_CRITICAL(); ssd1306_Puts(txt_setup,2); // text and stroka ssd1306_update(2); taskEXIT_CRITICAL(); } } while(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)) __NOP; HAL_Delay(200); } //while(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)) __NOP; } else { __NOP; } //EXTI->IMR &= ~EXTI_IMR_IM0; EXTI->PR |= EXTI_PR_PIF0; NVIC_ClearPendingIRQ (EXTI0_IRQn); HAL_NVIC_EnableIRQ(EXTI0_IRQn); //__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); vTaskResume( xTask_main_Handle ); } }
Поделиться62019-01-06 01:36:35
Точно уже не помню что там у меня были за проблемы, но ради того чтобы не откладывались системные прерывания лучше не использовать.