[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初始化串口和创建任务

现象如下

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修改如下

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);
}
}
效果展示如下

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