1.新增串口文档。

This commit is contained in:
MacRsh
2023-12-05 14:16:11 +08:00
parent 53b019fab0
commit 8418f8d024
3 changed files with 243 additions and 5 deletions

View File

@@ -65,11 +65,11 @@ int mr_dev_ioctl(int desc, int cmd, void *args);
| `<0` | 错误码 |
- `cmd`:命令码,支持以下命令:
- `MR_CTL_PIN_SET_NUMBER`:设置引脚编号。
- `MR_CTL_PIN_GET_NUMBER`:获取引脚编号。
- `MR_CTL_PIN_SET_MODE`:设置引脚模式。
- `MR_CTL_PIN_SET_EXTI_CALL`:设置外部中断回调函数。
- `MR_CTL_PIN_GET_EXTI_CALL`:获取外部中断回调函数。
- `MR_CTL_PIN_SET_NUMBER`:设置引脚编号。
- `MR_CTL_PIN_GET_NUMBER`:获取引脚编号。
- `MR_CTL_PIN_SET_MODE`:设置引脚模式。
- `MR_CTL_PIN_SET_EXTI_CALL`:设置外部中断回调函数。
- `MR_CTL_PIN_GET_EXTI_CALL`:获取外部中断回调函数。
### 设置/获取引脚编号

232
document/device/serial.md Normal file
View File

@@ -0,0 +1,232 @@
# SERIAL设备
## 打开SERIAL设备
```c
int mr_dev_open(const char *name, int oflags);
```
| 参数 | 描述 |
|---------|---------|
| name | 设备名称 |
| oflags | 打开设备的标志 |
| **返回值** | |
| `>=0` | 设备描述符 |
| `<0` | 错误码 |
- `name`SERIAL设备名称一般为`serialx`,例如:`serial1``serial2``serial3`
- `oflags`:打开设备的标志,支持 `MR_OFLAG_RDONLY``MR_OFLAG_WRONLY``MR_OFLAG_RDWR``MR_OFLAG_NONBLOCK`
使用时应根据实际情况为不同的任务分别打开SERIAL设备并使用适当的`oflags`进行管理和权限控制,以确保它们不会相互影响。
## 关闭SERIAL设备
```c
int mr_dev_close(int desc);
```
| 参数 | 描述 |
|---------|-------|
| desc | 设备描述符 |
| **返回值** | |
| `=0` | 关闭成功 |
| `<0` | 错误码 |
## 配置PIN设备
```c
int mr_dev_ioctl(int desc, int cmd, void *args);
```
| 参数 | 描述 |
|---------|-------|
| desc | 设备描述符 |
| cmd | 命令码 |
| args | 命令参数 |
| **返回值** | |
| `=0` | 设置成功 |
| `<0` | 错误码 |
- `cmd`:命令码,支持以下命令:
- `MR_CTL_SERIAL_SET_CONFIG` 设置SERIAL设备配置
- `MR_CTL_SERIAL_GET_CONFIG` 获取SERIAL设备配置
- `MR_CTL_SERIAL_SET_RD_BUFSZ` 设置读缓冲区大小
- `MR_CTL_SERIAL_GET_RD_BUFSZ` 获取读缓冲区大小
- `MR_CTL_SERIAL_SET_WR_BUFSZ` 设置写缓冲区大小
- `MR_CTL_SERIAL_GET_WR_BUFSZ` 获取写缓冲区大小
- `MR_CTL_SERIAL_SET_RD_CALL`:设置读回调函数
- `MR_CTL_SERIAL_GET_RD_CALL`:获取读回调函数
- `MR_CTL_SERIAL_SET_WR_CALL`:设置写回调函数
- `MR_CTL_SERIAL_GET_WR_CALL`:获取写回调函数
### 设置/获取SERIAL设备配置
SERIAL设备配置
- `baud_rate`:波特率
- `data_bits`:数据位数
- `stop_bits`:停止位数
- `parity`:校验位
- `bit_order`:数据传输顺序
- `invert`:极性反转
```c
/* 设置默认配置 */
struct mr_serial_config config = MR_SERIAL_CONFIG_DEFAULT;
/* 设置SERIAL设备配置 */
mr_dev_ioctl(ds, MR_CTL_SERIAL_SET_CONFIG, &config);
/* 获取SERIAL设备配置 */
mr_dev_ioctl(ds, MR_CTL_SERIAL_GET_CONFIG, &config);
```
注:如未手动配置,默认配置为:
- 波特率:`115200`
- 数据位数:`MR_SERIAL_DATA_BITS_8`
- 停止位数:`MR_SERIAL_STOP_BITS_1`
- 校验位:`MR_SERIAL_PARITY_NONE`
- 数据传输顺序:`MR_SERIAL_BIT_ORDER_LSB`
- 极性反转:`MR_SERIAL_NRZ_NORMAL`
### 设置/获取读/写缓冲区大小
```c
size_t size = 256;
/* 设置读缓冲区大小 */
mr_dev_ioctl(ds, MR_CTL_SERIAL_SET_RD_BUFSZ, &size);
/* 获取读缓冲区大小 */
mr_dev_ioctl(ds, MR_CTL_SERIAL_GET_RD_BUFSZ, &size);
/* 设置写缓冲区大小 */
mr_dev_ioctl(ds, MR_CTL_SERIAL_SET_WR_BUFSZ, &size);
/* 获取写缓冲区大小 */
mr_dev_ioctl(ds, MR_CTL_SERIAL_GET_WR_BUFSZ, &size);
```
注:如未手动配置,将使用 `Kconfig`中配置的大小默认为32Byte
### 设置/获取读/写回调函数
```c
/* 定义回调函数 */
int call(int desc, void *args)
{
/* 获取缓冲区数据大小 */
ssize_t data_size = *(ssize_t *)args;
/* 处理中断 */
return MR_EOK;
}
int (*callback)(int, void *args);
/* 设置读回调函数 */
mr_dev_ioctl(ds, MR_CTL_SERIAL_SET_RD_CALL, &call);
/* 获取读回调函数 */
mr_dev_ioctl(ds, MR_CTL_SERIAL_GET_RD_CALL, &callback);
/* 设置写回调函数 */
mr_dev_ioctl(ds, MR_CTL_SERIAL_SET_WR_CALL, &call);
/* 获取写回调函数 */
mr_dev_ioctl(ds, MR_CTL_SERIAL_GET_WR_CALL, &callback);
```
## 读取SERIAL设备数据
```c
ssize_t mr_dev_read(int desc, void *buf, size_t size);
```
| 参数 | 描述 |
|---------|---------|
| desc | 设备描述符 |
| buf | 读取数据缓冲区 |
| size | 读取数据大小 |
| **返回值** | |
| `>=0` | 读取数据大小 |
| `<0` | 错误码 |
```c
char buf[128];
/* 读取SERIAL设备数据 */
ssize_t size = mr_dev_read(ds, buf, sizeof(buf));
/* 是否读取成功 */
if (size < 0)
{
}
```
注:当未设置读缓冲区时将使用轮询方式同步读取数据(无法保证完整接收数据)。当设置读缓冲区后会从读缓冲区读取指定数量的数据(返回实际读取的数据大小)。
## 写入SERIAL设备数据
```c
ssize_t mr_dev_write(int desc, const void *buf, size_t size);
```
| 参数 | 描述 |
|---------|---------|
| desc | 设备描述符 |
| buf | 写入数据缓冲区 |
| size | 写入数据大小 |
| **返回值** | |
| `>=0` | 写入数据大小 |
| `<0` | 错误码 |
```c
char buf[] = {"hello world"};
/* 写入SERIAL设备数据 */
ssize_t size = mr_dev_write(ds, buf, sizeof(buf));
/* 是否写入成功 */
if (size < 0)
{
}
```
注:当未设置写缓冲区且未使用 `MR_OFLAG_NONBLOCK` 打开时将使用轮询方式同步写入数据。
当设置写缓冲区后会将数据写入写缓冲区返回实际写入的数据大小通过中断或DMA异步发送数据发送完成后会触发写回调函数。
当有数据在异步发送时,写入锁将自动上锁,此时无法同步写入,直至异步发送完成。
## 使用示例:
```c
#include "include/mr_lib.h"
int serial_ds = -1;
int serial_init(void)
{
/* 初始化串口 */
serial_ds = mr_dev_open("serial1", MR_OFLAG_RDWR);
if (serial_ds < 0)
{
mr_printf("serial open failed: %s\r\n", mr_strerror(serial_ds));
return serial_ds;
}
/* 设置串口配置 */
struct mr_serial_config config = MR_SERIAL_CONFIG_DEFAULT;
mr_dev_ioctl(serial_ds, MR_CTL_SERIAL_SET_CONFIG, &config);
}
/* 导出到自动初始化APP级 */
MR_APP_EXPORT(serial_init);
int main(void)
{
/* 自动初始化serial_init函数将在此处自动调用 */
mr_auto_init();
while (1)
{
/* 回环测试 */
char buf[64];
ssize_t ret = mr_dev_read(serial_ds, buf, sizeof(buf));
mr_dev_write(serial_ds, buf, ret);
}
}
```
回环测试,将接收到的数据重新发送回去。

View File

@@ -82,6 +82,12 @@ struct mr_serial_config
/**
* @brief SERIAL control command.
*/
#define MR_CTL_SERIAL_SET_CONFIG MR_CTL_SET_CONFIG /**< Set configuration */
#define MR_CTL_SERIAL_GET_CONFIG MR_CTL_GET_CONFIG /**< Get configuration */
#define MR_CTL_SERIAL_SET_RD_BUFSZ MR_CTL_SET_RD_BUFSZ /**< Set read buffer size */
#define MR_CTL_SERIAL_GET_RD_BUFSZ MR_CTL_GET_RD_BUFSZ /**< Get read buffer size */
#define MR_CTL_SERIAL_SET_WR_BUFSZ MR_CTL_SET_WR_BUFSZ /**< Set write buffer size */
#define MR_CTL_SERIAL_GET_WR_BUFSZ MR_CTL_GET_WR_BUFSZ /**< Get write buffer size */
#define MR_CTL_SERIAL_SET_RD_CALL MR_CTL_SET_RD_CALL /**< Set read callback */
#define MR_CTL_SERIAL_GET_RD_CALL MR_CTL_GET_RD_CALL /**< Get read callback */
#define MR_CTL_SERIAL_SET_WR_CALL MR_CTL_SET_WR_CALL /**< Set write complete callback */