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

 
 
> stm32 uart rs485, описание прерывания на прием в буфер (и на передачу)
dimka2001
сообщение Apr 20 2012, 15:57
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 129
Регистрация: 6-11-05
Пользователь №: 10 508



ситуация такая, нужно написать прерывание на прием в буфер и в зависимости от значения первого байта в ответ отправить другой буфер (около 20 байт). ниже кусок прерывания для одного байта. как его переделать для буфера??? помогите!!!


Код
void USART1_IRQHandler(void)
{
    //Receive Data register not empty interrupt
      if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
   {
       rx=1;
       USART_ClearITPendingBit(USART1, USART_IT_RXNE);
       tmp=USART_ReceiveData (USART1);

   }
      //Transmission complete interrupt
      if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
      {
          USART_ClearITPendingBit(USART1, USART_IT_TC);
          tx_end=1;
      }
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SSerge
сообщение Apr 21 2012, 18:34
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Идея правильная, а в реализации есть несколько неприятных ошибок.

Переменная usart1_tx.count модифицируется в двух местах: в функции usart1_putchar и в обработчике прерывания.
Аналогично и с usart1_rx.count, она также модифицируется в функции usart1_getchar и в обработчике прерывания.
А ведь прерывание может случится как раз между чтением этих переменных из памяти и записью в память изменённого значения. После этого значение счётчика будет неправильным и никакой volatile от этого не спасает.

Самое простое решение - запрещать прерывания в функциях usart1_putchar и usart1_getchar непосредственно перед модификацией счётчиков и разрешать сразу после.
Если отказаться от использования счётчиков, а оперировать только индексами буферов (или указателями в буфер) то можно обойтись без запрета/разрешения прерываний.

И ещё, прерывания от передатчика логичнее разрешить от флага TXE, он для этого и придуман.
Флаг ТС при работе черех RS-485 тоже понадобится, но только один раз на каждый пакет, он нужен чтобы узнать что передача последнего байта пакета закончилась и можно переключать драйвер RS-485 с передачи на приём.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
ohmjke
сообщение Apr 21 2012, 18:53
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 116
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094



Мне пока что usart нужен лишь для того, чтобы посылать кое-какую инфу на комп во время отладки. С этой задачей данная реализация справляется без проблем.
Но за советы спасибо, возможно, когда-нибудь они и пригодятся.
И кстати, насчет модификации счетчиков - а что если применить bit-banding?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Apr 21 2012, 19:28
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(ohmjke @ Apr 22 2012, 01:53) *
И кстати, насчет модификации счетчиков - а что если применить bit-banding?

а как? Через этот механизм можно только логические операции с битами производить, зато атомарно. Инкремент/декремент так не сделать.
С другой стороны, зачем вообще нужны эти счётчики, если работать с индексами массивов получается ничуть не хуже.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 19:31
Рейтинг@Mail.ru


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