Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Старое » stm32f103c8t6-> EXTI сброс pending


stm32f103c8t6-> EXTI сброс pending

Сообщений 1 страница 6 из 6

1

Работаю с внешним прерыванием,на кнопку. Пишу под stm32f103c8t6 , отключая прерывания EXTI0 и пытаясь сбросить Pending bit 0 прерывания. В регистре сбрасывается,а вот в NVIC остается поднят. Разве так должно быть ?
Может попробовать запретить прерывания  в IMR и попробовать сбросить PR0....

http://s9.uploads.ru/t/MyqI0.png

2

Помогло + http://easyelectronics.ru/arm-uchebnyj- … vanij.html

Код:
NVIC_ClearPendingIRQ (EXTI0_IRQn);

Отложенные прерывания в NVIC.

3

В exti->pr правильнее сбрасывать через =. Поскольку используеться РТОС скорее всего нельзя использовать 0 приоритет (у меня еще и 15 тк PendSV должен иметь минимальный приоритет)

4

MasterElectric написал(а):

В exti->pr правильнее сбрасывать через =.

Правильнее ваще не вешать кнопки на exti... Но для кого-то скоростная езда  по граблям... на велосипеде... с квадратными колёсами... что бег на ходулях по минному полю...  является своеобразным видом спорта...

5

MasterElectric написал(а):

В 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 );
	}
	
}

6

Точно уже не помню что там у меня были за проблемы, но ради того чтобы не откладывались системные прерывания лучше не использовать.


Вы здесь » Микроконтроллеры » Старое » stm32f103c8t6-> EXTI сброс pending