|
|
|
@ -18,6 +18,7 @@ |
|
|
|
|
|
|
|
|
|
struct usart_console { |
|
|
|
|
char recv_buf[RECV_BUF_LEN]; |
|
|
|
|
void (* process_line)(void); |
|
|
|
|
volatile size_t cur, next; |
|
|
|
|
uint32_t dev; |
|
|
|
|
}; |
|
|
|
@ -28,21 +29,25 @@ struct usart_console user_console; |
|
|
|
|
static void usart_isr(struct usart_console *console) |
|
|
|
|
{ |
|
|
|
|
uint32_t reg; |
|
|
|
|
size_t i; |
|
|
|
|
size_t idx, next; |
|
|
|
|
|
|
|
|
|
if (!console) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
while (usart_get_flag(console->dev, USART_ISR_RXNE)) { |
|
|
|
|
console->recv_buf[console->next] = usart_recv(console->dev); |
|
|
|
|
idx = console->next; |
|
|
|
|
console->recv_buf[idx] = usart_recv(console->dev); |
|
|
|
|
|
|
|
|
|
if (console->recv_buf[console->next] == '\003') |
|
|
|
|
scb_reset_system(); |
|
|
|
|
next = (console->next + 1) % RECV_BUF_LEN; |
|
|
|
|
|
|
|
|
|
i = (console->next + 1) % RECV_BUF_LEN; |
|
|
|
|
if (next != console->cur) |
|
|
|
|
console->next = next; |
|
|
|
|
|
|
|
|
|
if (i != console->cur) |
|
|
|
|
console->next = i; |
|
|
|
|
switch (console->recv_buf[idx]) { |
|
|
|
|
case '\003': scb_reset_system(); |
|
|
|
|
case '\r': console->process_line(); |
|
|
|
|
default: break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|