|
stm32 вопрос по приоритетам прерываний |
|
|
|
 |
Ответов
|
May 25 2011, 22:34
|

Местный
  
Группа: 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
|
|
|
|
|
May 26 2011, 09:30
|

фанат дивана
     
Группа: Свой
Сообщений: 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.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|