KT24-1110_65E-HA-651B/cpu/br25/uart_test.c
2024-11-10 18:44:17 +08:00

175 lines
5.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "system/includes.h"
#include "asm/uart_dev.h"
#if 0
/*
[[ 注意!!! ]]
* 如果当系统任务较少时使用本demo需要将低功耗关闭#define TCFG_LOWPOWER_LOWPOWER_SEL 0//SLEEP_EN 否则任务被串口接收函数调用信号量pend时会导致cpu休眠串口中断和DMA接收将遗漏数据或数据不正确
*/
#define UART_DEV_USAGE_TEST_SEL 2 //uart_dev.c api接口使用方法选择
// 选择1 串口中断回调函数推送事件,由事件响应函数接收串口数据
// 选择2 由task接收串口数据
#define UART_DEV_TEST_MULTI_BYTE 1 //uart_dev.c 读写多个字节api / 读写1个字节api 选择
static u8 uart_cbuf[512] __attribute__((aligned(4)));
static u8 uart_rxbuf[512] __attribute__((aligned(4)));
static void my_put_u8hex(u8 dat)
{
u8 tmp;
tmp = dat / 16;
if (tmp < 10) {
putchar(tmp + '0');
} else {
putchar(tmp - 10 + 'A');
}
tmp = dat % 16;
if (tmp < 10) {
putchar(tmp + '0');
} else {
putchar(tmp - 10 + 'A');
}
putchar(0x20);
}
//设备事件响应demo
static void uart_event_handler(struct sys_event *e)
{
const uart_bus_t *uart_bus;
u32 uart_rxcnt = 0;
if (!strcmp(e->arg, "uart_rx_overflow")) {
if (e->u.dev.event == DEVICE_EVENT_CHANGE) {
printf("uart event: %s\n", e->arg);
uart_bus = (const uart_bus_t *)e->u.dev.value;
uart_rxcnt = uart_bus->read(uart_rxbuf, sizeof(uart_rxbuf), 0);
if (uart_rxcnt) {
printf("get_buffer:\n");
for (int i = 0; i < uart_rxcnt; i++) {
my_put_u8hex(uart_rxbuf[i]);
if (i % 16 == 15) {
putchar('\n');
}
}
if (uart_rxcnt % 16) {
putchar('\n');
}
uart_bus->write(uart_rxbuf, uart_rxcnt);
}
printf("uart out\n");
}
}
if (!strcmp(e->arg, "uart_rx_outtime")) {
if (e->u.dev.event == DEVICE_EVENT_CHANGE) {
printf("uart event: %s\n", e->arg);
uart_bus = (const uart_bus_t *)e->u.dev.value;
uart_rxcnt = uart_bus->read(uart_rxbuf, sizeof(uart_rxbuf), 0);
if (uart_rxcnt) {
printf("get_buffer:\n");
for (int i = 0; i < uart_rxcnt; i++) {
my_put_u8hex(uart_rxbuf[i]);
if (i % 16 == 15) {
putchar('\n');
}
}
if (uart_rxcnt % 16) {
putchar('\n');
}
uart_bus->write(uart_rxbuf, uart_rxcnt);
}
printf("uart out\n");
}
}
}
SYS_EVENT_HANDLER(SYS_DEVICE_EVENT, uart_event_handler, 0);
static void uart_u_task(void *arg)
{
const uart_bus_t *uart_bus = arg;
int ret;
u32 uart_rxcnt = 0;
printf("uart_u_task start\n");
while (1) {
#if !UART_DEV_TEST_MULTI_BYTE
//uart_bus->getbyte()在尚未收到串口数据时会pend信号量挂起task直到UART_RX_PND或UART_RX_OT_PND中断发生post信号量唤醒task
ret = uart_bus->getbyte(&uart_rxbuf[0], 0);
if (ret) {
uart_rxcnt = 1;
printf("get_byte: %02x\n", uart_rxbuf[0]);
uart_bus->putbyte(uart_rxbuf[0]);
}
#else
//uart_bus->read()在尚未收到串口数据时会pend信号量挂起task直到UART_RX_PND或UART_RX_OT_PND中断发生post信号量唤醒task
uart_rxcnt = uart_bus->read(uart_rxbuf, sizeof(uart_rxbuf), 0);
if (uart_rxcnt) {
printf("get_buffer:\n");
for (int i = 0; i < uart_rxcnt; i++) {
my_put_u8hex(uart_rxbuf[i]);
if (i % 16 == 15) {
putchar('\n');
}
}
if (uart_rxcnt % 16) {
putchar('\n');
}
uart_bus->write(uart_rxbuf, uart_rxcnt);
}
#endif
}
}
static void uart_isr_hook(void *arg, u32 status)
{
const uart_bus_t *ubus = arg;
struct sys_event e;
//当CONFIG_UARTx_ENABLE_TX_DMAx = 0, 1为1时不要在中断里面调用ubus->write()因为中断不能pend信号量
if (status == UT_RX) {
printf("uart_rx_isr\n");
#if (UART_DEV_USAGE_TEST_SEL == 1)
e.type = SYS_DEVICE_EVENT;
e.arg = "uart_rx_overflow";
e.u.dev.event = DEVICE_EVENT_CHANGE;
e.u.dev.value = (int)ubus;
sys_event_notify(&e);
#endif
}
if (status == UT_RX_OT) {
printf("uart_rx_ot_isr\n");
#if (UART_DEV_USAGE_TEST_SEL == 1)
e.type = SYS_DEVICE_EVENT;
e.arg = "uart_rx_outtime";
e.u.dev.event = DEVICE_EVENT_CHANGE;
e.u.dev.value = (int)ubus;
sys_event_notify(&e);
#endif
}
}
void uart_dev_test_main()
{
const uart_bus_t *uart_bus;
struct uart_platform_data_t u_arg = {0};
u_arg.tx_pin = IO_PORTA_01;
u_arg.rx_pin = IO_PORTA_02;
u_arg.rx_cbuf = uart_cbuf;
u_arg.rx_cbuf_size = 512;
u_arg.frame_length = 32;
u_arg.rx_timeout = 100;
u_arg.isr_cbfun = uart_isr_hook;
u_arg.baud = 9600;
u_arg.is_9bit = 0;
uart_bus = uart_dev_open(&u_arg);
if (uart_bus != NULL) {
printf("uart_dev_open() success\n");
#if (UART_DEV_USAGE_TEST_SEL == 2)
os_task_create(uart_u_task, (void *)uart_bus, 31, 512, 0, "uart_u_task");
#endif
}
}
#endif