kan35 7 3 августа, 2011 Опубликовано 3 августа, 2011 · Жалоба Пользую USART. Разрешено прерывание ТОЛЬКО по флагу RXNE. Все вроде бы работает, но вот если я пытаюсь стопануть проц в какой нибудь точке (поставив точку пока прога крутится), то прога сразу останавливается, но до точки не доходит, отловил - зависает в прерывании USART. При этом бит ORE выставлен, что в принципе можно считать нормальным в такой ситуации, но именно из за него происходит зацикливание в обработчике прерывания. Добавил холостое считывание USART1_SR и избавился от этой проблемы, но в даташите написано An interrupt is generated on ORE flag in case of Multi Buffer communication if the EIE bit is set. У меня EIE не включен, однако в прерывание все равно вваливается. Что я не учитываю? Помогите понять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 4 августа, 2011 Опубликовано 4 августа, 2011 · Жалоба Так ты делай считывание USART1_DR, пусть и холостое Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 4 августа, 2011 Опубликовано 4 августа, 2011 (изменено) · Жалоба Так ты делай считывание USART1_DR, пусть и холостое не USART1_DR а USART1_SR, но вопрос в том, почему возникает неразрешенное прерывание!? Изменено 4 августа, 2011 пользователем kan35 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 4 августа, 2011 Опубликовано 4 августа, 2011 · Жалоба Как раз DR. Битик ORE устанавливается из-за того что данные не считываешь. А прерывание у тебя по RXNE, который сбрасывается при чтении DR. Bit 5 RXNE: Read data register not empty This bit is set by hardware when the content of the RDR shift register has been transferred to the USART_DR register. An interrupt is generated if RXNEIE=1 in the USART_CR1 register. It is cleared by a read to the USART_DR register. The RXNE flag can also be cleared by writing a zero to it. This clearing sequence is recommended only for multibuffer communication. 0: Data is not received 1: Received data is ready to be read. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 4 августа, 2011 Опубликовано 4 августа, 2011 · Жалоба с RXNE проблем как раз нет, он сбрасывается, проблема то во флаге ORE !!! а он сбрасывается только чтением регистра _SR. и из-за ORE проц. зацикливается в прерывании предназначенном только для RXNE Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 4 августа, 2011 Опубликовано 4 августа, 2011 · Жалоба с RXNE проблем как раз нет, он сбрасывается, проблема то во флаге ORE !!! а он сбрасывается только чтением регистра _SR. и из-за ORE проц. зацикливается в прерывании предназначенном только для RXNE Ты наличие флага RXNE с помощью чего смотришь? С ним у меня свои счеты, его хрен увидишь через JTAG. Вставь всего одну строчку чтения регистра данных и проверь, а потом говори, помогло или нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 4 августа, 2011 Опубликовано 4 августа, 2011 · Жалоба Флаг ORE вызывает прерывание RXNE. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 4 августа, 2011 Опубликовано 4 августа, 2011 · Жалоба А чтобы не устанавливался ORE, нужно до прихода следующих данных прочитать DR. Или так и будем дальше спорить, что появилось раньше, курица или яйцо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 4 августа, 2011 Опубликовано 4 августа, 2011 · Жалоба Последнее предложение не осилил, вы к чему это вообще? типовая последовательность обработки прерывания - 1. считать регистр статуса 2. обработать статус(ы) (в данном случае считать DR) При этом ORE тоже сбросится. Это ошибка которую просто нужно обработать. ТС видимо только читает DR, не глядя на статус, вот прерывание и виснет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 4 августа, 2011 Опубликовано 4 августа, 2011 · Жалоба С последовательностью не спорю, сам так делаю. Но мне кажется, ТС наоборот DR не читает. Ведь сам по себе ORE не появляется. вот к чему мое сложное предложение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 4 августа, 2011 Опубликовано 4 августа, 2011 · Жалоба Возможно и так, сам возникновение ORE встречал только в тяжелом проекте - много прерываний+кривая расстановка приоритетов, в итоге иногда RXNE не успевал обработаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 4 августа, 2011 Опубликовано 4 августа, 2011 · Жалоба Последнее предложение не осилил, вы к чему это вообще? типовая последовательность обработки прерывания - 1. считать регистр статуса 2. обработать статус(ы) (в данном случае считать DR) При этом ORE тоже сбросится. Это ошибка которую просто нужно обработать. ТС видимо только читает DR, не глядя на статус, вот прерывание и виснет. ну вот я раньше просто считывал _DR, сбрасывал ...PendingBit и не было проблем. Да в принципе так то не страшно, если не допускать возникновение ORE. Но самый то вопрос в том - почему прерывание от ORE не разрешено, а оно возникает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 4 августа, 2011 Опубликовано 4 августа, 2011 · Жалоба Но самый то вопрос в том - почему прерывание от ORE не разрешено, а оно возникает... Смотри "Reference manual RM0008 Rev 13" стр.786 таб.196 строчка 5. Или рисунок 300. Т.е. в твоем случае возникает не прерывание "Error interrupt", которое включается битом EIE, а прерывание "RXNE interrupt". Вот кстати из описания регистра USART_CR1 : Bit 5 RXNEIE: RXNE interrupt enable This bit is set and cleared by software. 0: Interrupt is inhibited 1: A USART interrupt is generated whenever ORE=1 or RXNE=1 in the USART_SR register Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться