详细参考大佬这篇文章:
泰凌微TLSR825X开发七 UART通信_玉怀一捧雪的博客-CSDN博客
我这里只记录开发时用到的串口程序,详细请看大佬文章
/*
* mat_uart.h
*
* Created on: 2022-9-16
* Author:
*/
#ifndef MAT_UART_H
#define MAT_UART_H
#include "tl_common.h"
#define RX_DATA_LEN 10
typedef struct
{
unsigned char* rx_data;
unsigned char front;
unsigned char rear;
}que_t;
void mat_uart_init(void);
void app_in_que(que_t* queue, unsigned char val, unsigned char queue_length);
unsigned char app_out_que(que_t* queue, unsigned char *val, unsigned char queue_length);
void handler_uart(void);
int test_uart_send(void);
#endif
/*
* mat_uart.c
*
* Created on: 2022-9-16
* Author: YQ19755
*/
#include "mat_uart.h"
unsigned char rx_data[RX_DATA_LEN] = {0};
que_t uart_que = {rx_data, 0, 0};
//串口初始化
void mat_uart_init(void)
{
uart_gpio_set(UART_TX_PB1, UART_RX_PB0);
uart_reset(); //reset uart
uart_init(9, 13, PARITY_NONE, STOP_BIT_ONE);//115200, no parity, one stop bit
uart_dma_enable(0, 0);//disable dma
irq_clr_mask(FLD_IRQ_DMA_EN);
dma_chn_irq_enable(FLD_DMA_CHN_UART_RX | FLD_DMA_CHN_UART_TX, 0);//disbale dma irq
uart_irq_enable(1,0); //enable rx irq,disabe tx irq
uart_ndma_irq_triglevel(1,0);
irq_enable();
}
//rx接受数据的中断回调函数
void handler_uart(void)
{
if(uart_ndmairq_get())
{
static unsigned char i = 0;
unsigned char val = reg_uart_data_buf(i);
app_in_que(&uart_que, val, RX_DATA_LEN);
i++;
if(i > 3)
{
i = 0;
}
}
}
//将接受的数据返回
int test_uart_send(void)
{
unsigned char val = 0;
if(app_out_que(&uart_que, &val, RX_DATA_LEN) == 0)
{
uart_ndma_send_byte(val);
}
return 0;
}
//判断队列是否为空
static unsigned char app_que_is_empty(que_t* queue)
{
if (queue->front == queue->rear)
{
return 1;
}
return 0;
}
//入队
void app_in_que(que_t* queue, unsigned char val, unsigned char queue_length)
{
if (queue->front == (queue->rear + 1) % queue_length)
{
queue->rx_data[queue->rear] = val;
queue->rear = queue->front;
queue->front = (queue->front + 1) % queue_length;
}
else
{
queue->rx_data[queue->rear] = val;
queue->rear = (queue->rear + 1) % queue_length;
}
}
//出队
unsigned char app_out_que(que_t* queue, unsigned char *val, unsigned char queue_length)
{
if (app_que_is_empty(queue))
{
return 1;
}
else
{
*val = queue->rx_data[queue->front];
queue->front = (queue->front + 1) % queue_length;
}
return 0;
}
在main.c中需要添加的一些东西
_attribute_ram_code_ void irq_handler(void)
{
handler_uart();//在终端入口添加串口回调函数
}
_attribute_ram_code_ int main (void) //must run in ramcode
{
//**省略其他代码***//
mat_uart_init();//串口初始化
blt_soft_timer_add(test_uart_send,5000);//在定时器中添加测试函数
}
本来打算用将串口的发送引脚和IO口模拟串口输出的统一到一个引脚,但是经过测试不行,因此后面开发log打印和串口发送引脚要搞两个串口模块来接收数据。
按道理tlsr8258也可以将串口的重映射到printf,但是不知道怎么搞,会搞的同学可以留言,到时候借鉴一下。