Files
2025-12-03 11:12:34 +08:00

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);
}
}