发帖
0 0 0

[BW20]二次开发学习3 串口通讯

夜雨喧嚣
中级会员

7

主题

4

回帖

386

积分

中级会员

积分
386
BW系列 19 0 8 小时前
[i=s] 本帖最后由 夜雨喧嚣 于 2025-5-18 01:25 编辑 [/i]

1、驱动函数熟悉

驱动函数位置

ameba-rtos/component/soc/amebadplus/hal/src/serial_api.c

具体内容可以自行下载SDK查看

本文需要使用的函数如下

1.1、串口初始化函数

文件中第454行起

void serial_init(serial_t *obj, PinName tx, PinName rx)

obj:串口对象

tx:tx脚

rx:rx脚

1.2、串口波特率设置

文件中第560行起

void serial_baud(serial_t *obj, int baudrate)

obj:串口对象

baudrate:波特率

1.3、串口其他参数设置,如数据位,停止位等

文件中第587行起

void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)

obj:串口对象

data_bits:数据位

parity:校验

stop_bits:停止位

1.4、发送函数

文件中第733行起

void serial_putc(serial_t *obj, int c)

obj:串口对象

c:需要发送的数据(为什么用int不用char?)

1.5、接收函数

文件中第716行起

int serial_getc(serial_t *obj)

obj:串口对象

1.6、中断配置

文件中第682行起

void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)

obj:串口对象

irq:中断模式

enable:是否启用中断

1.7、接收回调配置

文件中第662行起

void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)

obj:串口对象

handler:回调函数

id:回调参数

2、uart.c,.h文件创建

.c代码如下(因为我刚刚已经删了改成中断接收了,所以可能有些地方有点问题,有问题可以和我说我改下)


#include "userUartApp.h"

#define uart2TX_PIN PB_5
#define uart2RX_PIN PB_4
serial_t uart2;

void userUartInit(void)
{
    uart2.uart_idx = 0;

    serial_init(&uart2,PB_5,PB_4);  //初始化

    serial_baud(&uart2,115200);  //波特率设置115200

    serial_format(&uart2,8,0,1);  //8位数据位,无校验,1位停止位
}

void userUart2Send(char * dat, int len)  //发送
{
    int datlen = 0;
    if((NULL == dat)||(0 == len))
    {
        return;
    }

    for(datlen = 0; datlen < len; datlen++)
    {
        serial_putc(&uart2,dat[datlen]);
    }
}

void userUart2Read(void * pvParameters)  //接收并发送
{
    (void)pvParameters;
    char dat;
    dat = serial_getc(&uart2);
    userUart2Send(dat,1);
}

.h代码如下

#ifndef USERUARTAPP_H
#define USERUARTAPP_H#include "serial_api.h"void userUartInit(void);
void userUart2Send(char * dat, int len);
void userUart2Read(void * pvParameters);
#endif

3、主函数实现

3.1、任务函数

void uartTask(void * pvParameters)
{
	(void)pvParameters;
	while(1)
	{
		userUart2Read(pvParameters);
		rtos_time_delay_ms(1);
	}
}

3.2初始化串口和创建任务

image.png

现象如下

image.png

4、中断接收

.c修改为如下


#include "userUartApp.h"

#define uart2TX_PIN PB_5
#define uart2RX_PIN PB_4
#define RX_TIMEOUT 40  //接收超时
serial_t uart2;


static char uartData[1024] = {0};  //接收缓存区
static int datLen = 0;  //接收长度

volatile int RxTimeOutCount = 0;


void uartRxTimeOut(void)  //接收超时计数
{
    if(0 == RxTimeOutCount)
    {
        return;
    }
    if(RX_TIMEOUT > RxTimeOutCount)
    {
        RxTimeOutCount++;
    }
}

static void userUart2Read(void);

void userUartInit(void)
{
    uart2.uart_idx = 0;

    serial_init(&uart2,PB_5,PB_4);

    serial_baud(&uart2,115200);

    serial_format(&uart2,8,0,1);

    serial_irq_set(&uart2, RxIrq, 1);  //配置中断模式
    serial_irq_handler(&uart2,(uart_irq_handler)userUart2Read,0);  //配置接收回调函数
  
}

void userUart2Send(char * dat, int len)
{
    int datlen = 0;
    if((NULL == dat)||(0 == len))
    {
        return;
    }

    for(datlen = 0; datlen < len; datlen++)
    {
        serial_putc(&uart2,dat[datlen]);
    }
}

void userUart2Test(void)  //接收超时达到发送
{
    if(RxTimeOutCount >= RX_TIMEOUT)
    {
        userUart2Send(uartData,datLen);
        datLen = 0;
    }
}


static void userUart2Read(void)  //接收回调
{
    uartData[datLen++] = serial_getc(&uart2);
    RxTimeOutCount = 1;
}


.h修改如下

#ifndef _USERUARTAPP_H_
#define _USERUARTAPP_H_

#include "serial_api.h"
#include "serial_ex_api.h"

void userUartInit(void);
void userUart2Send(char * dat, int len);
void userUart2Test(void);
void uartRxTimeOut(void);
#endif

main.c修改如下

image.png

void gpioTestTask(void * pvParameters)
{
	(void)pvParameters;
	static unsigned int msCount = 0;
	msCount++;
	uartRxTimeOut();
	if(500 <= msCount)
	{
		msCount = 0;
	}
}

void uartTask(void * pvParameters)
{
	(void)pvParameters;
	while(1)
	{
		userUart2Test();
		rtos_time_delay_ms(1);
	}
}

效果展示如下

image.png

发送中断因为我这边用不到就没写,DMA的话我技术差,用不太来而且感觉意义不大就没看了

──── 0人觉得很赞 ────

使用道具 举报

您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28748 个
  • 话题数: 41022 篇