Tlsr8258开发-uart串口

本文介绍了如何在TLSR825X微控制器上进行UART通信的初始化、中断处理及数据收发。作者提供了一个简单的串口接收队列实现,并分享了测试发送数据的函数。在实际应用中,由于串口发送引脚与模拟输出的冲突,作者决定采用两个独立的串口模块来处理不同任务。此外,还探讨了可能将UART重映射到printf功能的可能性。
摘要由CSDN通过智能技术生成

详细参考大佬这篇文章:

泰凌微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,但是不知道怎么搞,会搞的同学可以留言,到时候借鉴一下。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

入门->放弃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值