|
stm32 uart rs485, описание прерывания на прием в буфер (и на передачу) |
|
|
|
Apr 20 2012, 15:57
|
Частый гость
 
Группа: Участник
Сообщений: 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; }
|
|
|
|
|
 |
Ответов
|
Apr 21 2012, 10:11
|

Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 21 2012, 15:00
|
Частый гость
 
Группа: Участник
Сообщений: 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) . прием осуществляется по прерыванию, т.е. каждый байт по прерыванию, я думал что нужно один байт принять по прерыванию а остальные по проверке флага...
|
|
|
|
Сообщений в этой теме
dimka2001 stm32 uart rs485 Apr 20 2012, 15:57 demiurg_spb Надеюсь, что структурка с восьмибитными счётчиками... Apr 21 2012, 11:08  ohmjke Цитата(dimka2001 @ Apr 21 2012, 19:00) ну... Apr 21 2012, 15:06   dimka2001 Цитата(ohmjke @ Apr 21 2012, 18:06) Вызыв... Apr 21 2012, 16:11    _Артём_ Цитата(dimka2001 @ Apr 21 2012, 19:11) не... Apr 21 2012, 16:33    ohmjke Цитата(dimka2001 @ Apr 21 2012, 20:11) не... Apr 21 2012, 16:39 ohmjke Ну, вообще да, изначально было сделано для AVR.
А ... Apr 21 2012, 11:16 demiurg_spb Цитата(ohmjke @ Apr 21 2012, 14:16) Ну, в... Apr 23 2012, 07:13 SSerge Идея правильная, а в реализации есть несколько неп... Apr 21 2012, 18:34 ohmjke Мне пока что usart нужен лишь для того, чтобы посы... Apr 21 2012, 18:53  SSerge Цитата(ohmjke @ Apr 22 2012, 01:53) И кст... Apr 21 2012, 19:28   ohmjke Цитата(SSerge @ Apr 21 2012, 23:28) а как... Apr 21 2012, 19:59   jcxz Цитата(SSerge @ Apr 22 2012, 01:28) С дру... Apr 22 2012, 03:04
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|