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
Точно уже не помню что там у меня были за проблемы, но ради того чтобы не откладывались системные прерывания лучше не использовать.
