182 lines
5.6 KiB
C
182 lines
5.6 KiB
C
|
#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)));
|
|||
|
|
|||
|
void set_bt_uart_bus(uart_bus_t *uart_bus);
|
|||
|
void bt_product_test_uart(u8 *data, u16 len);
|
|||
|
|
|||
|
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');
|
|||
|
}
|
|||
|
bt_product_test_uart(uart_rxbuf, uart_rxcnt);
|
|||
|
/* 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_DMA(x = 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");
|
|||
|
|
|||
|
set_bt_uart_bus(uart_bus);
|
|||
|
|
|||
|
#if (UART_DEV_USAGE_TEST_SEL == 2)
|
|||
|
os_task_create(uart_u_task, (void *)uart_bus, 31, 512, 0, "uart_u_task");
|
|||
|
#endif
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|