реклама на сайте
подробности

 
 
> stm32 вопрос по приоритетам прерываний
Nikitoc
сообщение May 17 2011, 19:42
Сообщение #1


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Всем доброго времени суток. Я тут зацепился с прерываниями на stm32l152. Пишу на Си в Keil'е, использую либы производителя.
В общем ситуёвина такая: имеем прерывание по USART1 (по приходу символа в приемник) с приоритетом "1" и прерывание от SysTick таймера с приоритетом "3". Приоритеты выставляю вручную. По всем докам на CORTEX-M3 ясно, что прерывание с более высоким приоритетом должно моментально приостанавливать выполнение прерывания с более низким приоритетом (в данном случае USART1 должно прерывать SysTick). На практике же почему-то выходит наоборот - теряется часть посылки по USART1 если SysTick прерывания разрешены (в обработчике SysTick выполняется довольно много работы). Кто-нибудь сталкивался с подобным?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Nikitoc
сообщение May 25 2011, 22:34
Сообщение #2


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



В продолжение темы о прерываниях. USART2 почему-то упорно не хочет генерировать повторное прерывание. Один раз все случилось, благополучно обработалось, а второй и последующие разы - полный игнор. Ниже привожу процедуры инициализации USART2:
Код
/*******************************************************************************
* Function Name  : UsartInit
* Description    : Configures the USART2.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART_Init() {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    USART_DeInit(USART2);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);        /* Enable GPIO clock */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);        /* Enable UART clock */
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2,  GPIO_AF_USART2);        /* Connect alternate function pins to USART */
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3,  GPIO_AF_USART2);         /* Connect alternate function pins to USART */
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_USART2);        /* Connect alternate function pins to USART */
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_USART2);         /* Connect alternate function pins to USART */
                                                                    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_1;        /* Configure USART Tx as alternate function push-pull */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_0;         /* Configure USART Rx as input floating */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;
    USART_InitStructure.USART_BaudRate = 921600;
    USART_Init(USART2, &USART_InitStructure);                             /* USART configuration */
    
    NVIC_SetPriority(USART2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 4, 0));
    NVIC_EnableIRQ(USART2_IRQn);
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);          
          
    USART_Cmd(USART2, ENABLE);                      /* Enable USART */
}
/*******************************************************************************/


и процедуру обработки прерывания:
Код
/*------------------------------------------------------------------------------
            This function handles USART2 global interrupt request.
    
*-----------------------------------------------------------------------------*/
void USART2_IRQHandler(void) {

    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  {

        HostProt_Parser();                                            // обработка принятого символа
                                          
    } else {

         ClearUSART_IT_Bits(USART2);

    }
    
    USART_ClearITPendingBit(USART2, USART_IT_RXNE);

}
/*------------------------------------------------------------------------------


В том что символ приходит на вход RX - уверен на 100%.
P.S. Я где-то натыкался на подобную тему, но не смог найти. Буду благодарен за любые подсказки.

Сообщение отредактировал Nikitoc - May 25 2011, 23:04
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 26 2011, 02:22
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



USART_IT_RXNE чистится автоматом при вычитывании USARTx->DR, поэтому вручную его чистить не надо.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение May 26 2011, 06:56
Сообщение #4


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(AHTOXA @ May 26 2011, 05:22) *
USART_IT_RXNE чистится автоматом при вычитывании USARTx->DR, поэтому вручную его чистить не надо.

Да. Спасибо. Но повторного прерывания все равно не происходит :-(
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 26 2011, 09:30
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Nikitoc @ May 26 2011, 12:56) *
Но повторного прерывания все равно не происходит :-(

Да вроде нормально всё...
Убедитесь, что в HostProt_Parser(); USARTx->DR вычитывается один и только один раз.
Попробуйте убрать это:
Код
ClearUSART_IT_Bits(USART2);

(Я не знаю что это такое, но по названию догадываюсь, что чистит какие-то флаги)
Попробуйте также сконфигурировать USART пока без контроля потока.

Цитата(SergSit @ May 26 2011, 14:33) *
Т.е. после сброса мы имеем 16 выгружаемых групп приоритетов. Где ошибка у Вас или у меня?

Похоже, что вы правы. При включении PRIGROUP=0, и все биты приоритета (кроме самого младшего, отсутствующего), являются pre-emption priority.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение May 26 2011, 09:35
Сообщение #6


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(AHTOXA @ May 26 2011, 12:30) *
Убедитесь, что в HostProt_Parser(); USARTx->DR вычитывается один и только один раз.

Ээээ... Вообще-то вычитывается точно не один раз, в этой процедуре я принимаю несколько байт. А в чем собственно засада?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Nikitoc   stm32 вопрос по приоритетам прерываний   May 17 2011, 19:42
- - AHTOXA   Дык! Так и есть, чем меньше циферка, тем больш...   May 17 2011, 20:17
|- - Nikitoc   Цитата(AHTOXA @ May 17 2011, 23:17) Дык...   May 17 2011, 21:19
|- - AHTOXA   А, понятно. Дело в том, что есть ещё такое понятие...   May 18 2011, 03:29
||- - Nikitoc   Цитата(AHTOXA @ May 18 2011, 06:29) Дело ...   May 18 2011, 10:40
||- - ek74   Цитата(Nikitoc @ May 18 2011, 14:40) Т.е....   May 18 2011, 12:14
||- - Nikitoc   Спасибо. Предельно ясно.   May 18 2011, 15:06
|- - ek74   Цитата(Nikitoc @ May 18 2011, 01:19) Ну а...   May 18 2011, 05:34
|- - AHTOXA   Цитата(Nikitoc @ May 26 2011, 15:35) Вооб...   May 26 2011, 10:24
|- - Nikitoc   Цитата(AHTOXA @ May 26 2011, 13:24) Это к...   May 26 2011, 10:39
|- - AHTOXA   Цитата(Nikitoc @ May 26 2011, 16:39) Да, ...   May 26 2011, 12:29
|- - Nikitoc   Цитата(AHTOXA @ May 26 2011, 15:29) Хм. К...   May 26 2011, 14:01
|- - AHTOXA   Цитата(Nikitoc @ May 26 2011, 20:01) Но в...   May 26 2011, 14:35
|- - Nikitoc   Цитата(AHTOXA @ May 26 2011, 17:35) Давай...   May 28 2011, 14:11
- - SergSit   Цитата(AHTOXA @ May 18 2011, 06:29) А, по...   May 26 2011, 08:33
- - mdmitry   Не применительно к данному контроллеру, а по идеол...   May 26 2011, 14:20
- - RusikOk   помогите понять в чем дело. выставляю приоритеты т...   Dec 24 2016, 19:35
|- - AHTOXA   А вы не забыли вызвать NVIC_SetPriorityGrouping() ...   Dec 24 2016, 19:58
- - RusikOk   КодHAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYG...   Dec 24 2016, 20:00
- - esaulenka   Я банальную вещь скажу, но либо это место в библио...   Dec 26 2016, 12:58


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01467 секунд с 7
ELECTRONIX ©2004-2016