88 lines
2.3 KiB
C
88 lines
2.3 KiB
C
#ifdef SUPPORT_MS_EXTENSIONS
|
|
#pragma bss_seg(".uart_test.data.bss")
|
|
#pragma data_seg(".uart_test.data")
|
|
#pragma const_seg(".uart_test.text.const")
|
|
#pragma code_seg(".uart_test.text")
|
|
#endif
|
|
#include "system/includes.h"
|
|
#include "uart.h"
|
|
#include "debug.h"
|
|
|
|
static void uart_irq_func(int uart_num, enum uart_event event)
|
|
{
|
|
if (event & UART_EVENT_TX_DONE) {
|
|
printf("uart[%d] tx done", uart_num);
|
|
}
|
|
|
|
if (event & UART_EVENT_RX_TIMEOUT) {
|
|
printf("uart[%d] rx timerout data", uart_num);
|
|
}
|
|
|
|
if (event & UART_EVENT_RX_FIFO_OVF) {
|
|
printf("uart[%d] rx fifo ovf", uart_num);
|
|
}
|
|
}
|
|
|
|
struct uart_frame {
|
|
u16 crc;
|
|
u16 length;
|
|
u8 data[0];
|
|
};
|
|
void uart_sync_demo(void *p)
|
|
{
|
|
const struct uart_config config = {
|
|
.baud_rate = 2000000,
|
|
.tx_pin = IO_PORTA_04,
|
|
.rx_pin = IO_PORTA_02,
|
|
.parity = UART_PARITY_DISABLE,
|
|
.tx_wait_mutex = 0,//1:不支持中断调用,互斥,0:支持中断,不互斥
|
|
};
|
|
|
|
void *uart_rx_ptr = dma_malloc(768);
|
|
|
|
const struct uart_dma_config dma = {
|
|
.rx_timeout_thresh = 3 * 10000000 / config.baud_rate, //单位:us,公式:3*10000000/baud(ot:3个byte时间)
|
|
.event_mask = UART_EVENT_TX_DONE | UART_EVENT_RX_FIFO_OVF | UART_EVENT_RX_TIMEOUT,
|
|
.irq_priority = 3,
|
|
.irq_callback = uart_irq_func,
|
|
.rx_cbuffer = uart_rx_ptr,
|
|
.rx_cbuffer_size = 768,
|
|
.frame_size = 768,//=rx_cbuffer_size
|
|
};
|
|
|
|
printf("************uart demo***********\n");
|
|
int r;
|
|
uart_dev uart_id = 1;
|
|
int ut = uart_init(uart_id, &config);
|
|
if (ut < 0) {
|
|
printf("uart(%d) init error\n", ut);
|
|
} else {
|
|
printf("uart(%d) init ok\n", ut);
|
|
}
|
|
r = uart_dma_init(uart_id, &dma);
|
|
if (r < 0) {
|
|
printf("uart(%d) dma init error\n", ut);
|
|
} else {
|
|
printf("uart(%d) dma init ok\n", ut);
|
|
}
|
|
|
|
uart_dump();
|
|
struct uart_frame *frame = (struct uart_frame *)dma_malloc(512);
|
|
|
|
while (1) {
|
|
r = uart_recv_blocking(uart_id, frame, 512, 10);
|
|
if (r > 0) { //ok
|
|
printf("r:%d\n", r);
|
|
printf_buf((u8 *)frame, r);
|
|
}
|
|
r = uart_send_blocking(uart_id, frame, r, 20);
|
|
}
|
|
}
|
|
void uart_demo()
|
|
{
|
|
int err = task_create(uart_sync_demo, NULL, "periph_demo");
|
|
if (err != OS_NO_ERR) {
|
|
r_printf("creat fail %x\n", err);
|
|
}
|
|
}
|