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

 
 
> 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
Ответов
ohmjke
сообщение Apr 21 2012, 10:11
Сообщение #2


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

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



Не уверен, что верно понял, что Вам нужно. Но я использую два кольцевых буфера, на прием и передачу.

CODE
#define USART1_BUF_SIZE (64)
#define USART1_BUF_MASK (USART1_BUF_SIZE - 1)

typedef struct {
uint8_t buf [USART1_BUF_SIZE];
uint8_t in;
uint8_t out;
uint8_t count;
} usart1_buf_t;

volatile static usart1_buf_t usart1_rx, usart1_tx;

extern void usart1_putchar (uint8_t symb) {
if ((USART1->SR & USART_SR_TXE) && !usart1_tx.count) {
USART1->DR = symb;
} else if (usart1_tx.count < USART1_BUF_SIZE) {
usart1_tx.buf [usart1_tx.in++] = symb;
usart1_tx.count++;
usart1_tx.in &= USART1_BUF_MASK;
};
};

extern uint8_t usart1_getchar (void) {
uint8_t symb;
if (usart1_rx.count > 0) {
symb = usart1_rx.buf [usart1_rx.out++];
usart1_rx.count--;
usart1_rx.out &= USART1_BUF_MASK;
return symb;
};
return 0;
};

void USART1_IRQHandler (void) {
if (USART1->SR & USART_SR_TC) {
USART1->SR &= ~USART_SR_TC;
if (usart1_tx.count > 0) {
USART1->DR = usart1_tx.buf [usart1_tx.out++];
usart1_tx.count--;
usart1_tx.out &= USART1_BUF_MASK;
};
} else if (USART1->SR & USART_SR_RXNE) {
USART1->SR &= ~USART_SR_RXNE;
if (usart1_rx.count < USART1_BUF_SIZE) {
usart1_rx.buf [usart1_rx.in++] = USART1->DR;
usart1_rx.in &= USART1_BUF_MASK;
usart1_rx.count++;
};
};
};


Сообщение отредактировал ohmjke - Apr 21 2012, 10:15
Go to the top of the page
 
+Quote Post
dimka2001
сообщение Apr 21 2012, 15:00
Сообщение #3


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

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



Цитата(ohmjke @ Apr 21 2012, 13:11) *
Не уверен, что верно понял, что Вам нужно. Но я использую два кольцевых буфера, на прием и передачу.

CODE
#define USART1_BUF_SIZE (64)
#define USART1_BUF_MASK (USART1_BUF_SIZE - 1)

typedef struct {
uint8_t buf [USART1_BUF_SIZE];
uint8_t in;
uint8_t out;
uint8_t count;
} usart1_buf_t;

volatile static usart1_buf_t usart1_rx, usart1_tx;

extern void usart1_putchar (uint8_t symb) {
if ((USART1->SR & USART_SR_TXE) && !usart1_tx.count) {
USART1->DR = symb;
} else if (usart1_tx.count < USART1_BUF_SIZE) {
usart1_tx.buf [usart1_tx.in++] = symb;
usart1_tx.count++;
usart1_tx.in &= USART1_BUF_MASK;
};
};

extern uint8_t usart1_getchar (void) {
uint8_t symb;
if (usart1_rx.count > 0) {
symb = usart1_rx.buf [usart1_rx.out++];
usart1_rx.count--;
usart1_rx.out &= USART1_BUF_MASK;
return symb;
};
return 0;
};

void USART1_IRQHandler (void) {
if (USART1->SR & USART_SR_TC) {
USART1->SR &= ~USART_SR_TC;
if (usart1_tx.count > 0) {
USART1->DR = usart1_tx.buf [usart1_tx.out++];
usart1_tx.count--;
usart1_tx.out &= USART1_BUF_MASK;
};
} else if (USART1->SR & USART_SR_RXNE) {
USART1->SR &= ~USART_SR_RXNE;
if (usart1_rx.count < USART1_BUF_SIZE) {
usart1_rx.buf [usart1_rx.in++] = USART1->DR;
usart1_rx.in &= USART1_BUF_MASK;
usart1_rx.count++;
};
};
};



не понятно когда вызывается прерывание на передачу буфера (ну или как запустить передачу буфера) и зачем нужны функции extern void usart1_putchar (uint8_t symb) и extern uint8_t usart1_getchar (void) . прием осуществляется по прерыванию, т.е. каждый байт по прерыванию, я думал что нужно один байт принять по прерыванию а остальные по проверке флага...
Go to the top of the page
 
+Quote Post

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


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 12:27
Рейтинг@Mail.ru


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