1.新增ADC、DAC文档。

This commit is contained in:
MacRsh
2023-12-06 15:52:58 +08:00
parent bf1f8454e2
commit 884c5045ed
2 changed files with 376 additions and 0 deletions

185
document/device/adc.md Normal file
View File

@@ -0,0 +1,185 @@
# ADC设备
<!-- TOC -->
* [ADC设备](#adc设备)
* [打开ADC设备](#打开adc设备)
* [关闭ADC设备](#关闭adc设备)
* [控制ADC设备](#控制adc设备)
* [设置/获取通道编号](#设置获取通道编号)
* [设置/获取通道状态](#设置获取通道状态)
* [读取ADC设备通道值](#读取adc设备通道值)
* [使用示例:](#使用示例)
<!-- TOC -->
## 打开ADC设备
```c
int mr_dev_open(const char *name, int oflags);
```
| 参数 | 描述 |
|---------|---------|
| name | 设备名称 |
| oflags | 打开设备的标志 |
| **返回值** | |
| `>=0` | 设备描述符 |
| `<0` | 错误码 |
- `name`ADC设备名称一般为`adcx``adc1``adc2`
- `oflags`:打开设备的标志,支持 `MR_OFLAG_RDONLY`
使用时应根据实际情况为不同的任务分别打开ADC设备并使用适当的`oflags`进行管理和权限控制,以确保它们不会相互影响。
## 关闭ADC设备
```c
int mr_dev_close(int desc);
```
| 参数 | 描述 |
|---------|-------|
| desc | 设备描述符 |
| **返回值** | |
| `=0` | 关闭成功 |
| `<0` | 错误码 |
注:关闭设备时所有的通道都将被自动恢复到默认状态,重新打开后需要重新配置通道。
## 控制ADC设备
```c
int mr_dev_ioctl(int desc, int cmd, void *args);
```
| 参数 | 描述 |
|---------|-------|
| desc | 设备描述符 |
| cmd | 命令码 |
| args | 命令参数 |
| **返回值** | |
| `=0` | 设置成功 |
| `<0` | 错误码 |
- `cmd`:命令码,支持以下命令:
- `MR_CTL_ADC_SET_CHANNEL`:设置通道编号。
- `MR_CTL_ADC_GET_CHANNEL`:获取通道编号。
- `MR_CTL_ADC_SET_CHANNEL_STATE`:设置通道状态。
- `MR_CTL_ADC_GET_CHANNEL_STATE`:获取通道状态。
### 设置/获取通道编号
通道编号范围:`0` ~ `31`
```c
/* 定义通道编号 */
#define CHANNEL_NUMBER 5
/* 设置通道编号 */
mr_dev_ioctl(ds, MR_CTL_ADC_SET_CHANNEL, mr_make_local(int, CHANNEL_NUMBER));
/* 获取通道编号 */
int number;
mr_dev_ioctl(ds, MR_CTL_ADC_GET_CHANNEL, &number);
```
### 设置/获取通道状态
通道状态:
- `MR_ADC_STATE_DISABLE`:禁用通道。
- `MR_ADC_STATE_ENABLE`:启用通道。
```c
/* 设置通道状态 */
mr_dev_ioctl(ds, MR_CTL_ADC_SET_CHANNEL_STATE, mr_make_local(int, MR_ADC_STATE_ENABLE));
/* 获取通道状态 */
int state;
mr_dev_ioctl(ds, MR_CTL_ADC_GET_CHANNEL_STATE, &state);
```
## 读取ADC设备通道值
```c
ssize_t mr_dev_read(int desc, void *buf, size_t size);
```
| 参数 | 描述 |
|---------|---------|
| desc | 设备描述符 |
| buf | 读取数据缓冲区 |
| size | 读取数据大小 |
| **返回值** | |
| `>=0` | 读取数据大小 |
| `<0` | 错误码 |
```c
/* 读取通道值 */
uint32_t data;
int ret = mr_dev_read(ds, &data, sizeof(data));
/* 是否读取成功 */
if (ret != sizeof(data))
{
return ret;
}
```
读取数据为ADC原始数据。单次读取最小单位为`uint32_t`即4个字节。
## 使用示例:
```c
#include "include/mr_lib.h"
/* 定义通道编号 */
#define CHANNEL_NUMBER 5
/* 定义ADC设备描述符 */
int adc_ds = -1;
int adc_init(void)
{
int ret = MR_EOK;
/* 初始化ADC */
int adc_ds = mr_dev_open("adc1", MR_OFLAG_RDONLY);
if (adc_ds < 0)
{
mr_printf("ADC1 open failed: %s\r\n", mr_strerror(adc_ds));
return adc_ds;
}
/* 打印ADC描述符 */
mr_printf("ADC1 desc: %d\r\n", adc_ds);
/* 设置到通道5 */
mr_dev_ioctl(adc_ds, MR_CTL_ADC_SET_CHANNEL, mr_make_local(int, CHANNEL_NUMBER));
/* 设置通道使能 */
ret = mr_dev_ioctl(adc_ds, MR_CTL_ADC_SET_CHANNEL_STATE, mr_make_local(int, MR_ADC_STATE_ENABLE));
if (ret < 0)
{
mr_printf("Channel5 enable failed: %s\r\n", mr_strerror(ret));
return ret;
}
return MR_EOK;
}
/* 导出到自动初始化APP级 */
MR_APP_EXPORT(adc_init);
int main(void)
{
/* 自动初始化adc_init函数将在此处自动调用 */
mr_auto_init();
while(1)
{
uint32_t data;
int ret = mr_dev_read(adc_ds, &data, sizeof(data));
if (ret != sizeof(data))
{
mr_printf("Read failed: %s\r\n", mr_strerror(ret));
}
mr_printf("ADC value: %d\r\n", data);
mr_delay_ms(1000);
}
}
```
ADC1通道5使能间隔一秒读取一次ADC值并打印。

191
document/device/dac.md Normal file
View File

@@ -0,0 +1,191 @@
# DAC设备
<!-- TOC -->
* [DAC设备](#dac设备)
* [打开DAC设备](#打开dac设备)
* [关闭DAC设备](#关闭dac设备)
* [控制DAC设备](#控制dac设备)
* [设置/获取通道编号](#设置获取通道编号)
* [设置/获取通道状态](#设置获取通道状态)
* [写入DAC设备通道值](#写入dac设备通道值)
* [使用示例:](#使用示例)
<!-- TOC -->
## 打开DAC设备
```c
int mr_dev_open(const char *name, int oflags);
```
| 参数 | 描述 |
|---------|---------|
| name | 设备名称 |
| oflags | 打开设备的标志 |
| **返回值** | |
| `>=0` | 设备描述符 |
| `<0` | 错误码 |
- `name`DAC设备名称一般为`dacx``dac1``dac2`
- `oflags`:打开设备的标志,支持 `MR_OFLAG_WRONLY`
使用时应根据实际情况为不同的任务分别打开DAC设备并使用适当的`oflags`进行管理和权限控制,以确保它们不会相互影响。
## 关闭DAC设备
```c
int mr_dev_close(int desc);
```
| 参数 | 描述 |
|---------|-------|
| desc | 设备描述符 |
| **返回值** | |
| `=0` | 关闭成功 |
| `<0` | 错误码 |
注:关闭设备时所有的通道都将被自动恢复到默认状态,重新打开后需要重新配置通道。
## 控制DAC设备
```c
int mr_dev_ioctl(int desc, int cmd, void *args);
```
| 参数 | 描述 |
|---------|-------|
| desc | 设备描述符 |
| cmd | 命令码 |
| args | 命令参数 |
| **返回值** | |
| `=0` | 设置成功 |
| `<0` | 错误码 |
- `cmd`:命令码,支持以下命令:
- `MR_CTL_DAC_SET_CHANNEL`:设置通道编号。
- `MR_CTL_DAC_GET_CHANNEL`:获取通道编号。
- `MR_CTL_DAC_SET_CHANNEL_STATE`:设置通道状态。
- `MR_CTL_DAC_GET_CHANNEL_STATE`:获取通道状态。
### 设置/获取通道编号
通道编号范围:`0` ~ `31`
```c
/* 定义通道编号 */
#define CHANNEL_NUMBER 5
/* 设置通道编号 */
mr_dev_ioctl(ds, MR_CTL_DAC_SET_CHANNEL, mr_make_local(int, CHANNEL_NUMBER));
/* 获取通道编号 */
int number;
mr_dev_ioctl(ds, MR_CTL_DAC_GET_CHANNEL, &number);
```
### 设置/获取通道状态
通道状态:
- `MR_DAC_STATE_DISABLE`:禁用通道。
- `MR_DAC_STATE_ENABLE`:启用通道。
```c
/* 设置通道状态 */
mr_dev_ioctl(ds, MR_CTL_DAC_SET_CHANNEL_STATE, mr_make_local(int, MR_DAC_STATE_ENABLE));
/* 获取通道状态 */
int state;
mr_dev_ioctl(ds, MR_CTL_DAC_GET_CHANNEL_STATE, &state);
```
## 写入DAC设备通道值
```c
ssize_t mr_dev_write(int desc, const void *buf, size_t size);
```
| 参数 | 描述 |
|---------|---------|
| desc | 设备描述符 |
| buf | 写入数据缓冲区 |
| size | 写入数据大小 |
| **返回值** | |
| `>=0` | 写入数据大小 |
| `<0` | 错误码 |
```c
/* 写入通道值 */
uint32_t data = 2048;
int ret = mr_dev_write(ds, &data, sizeof(data));
/* 是否写入成功 */
if (ret != sizeof(data))
{
return ret;
}
```
写入数据为DAC原始数据。单次写入最小单位为`uint32_t`即4个字节。
## 使用示例:
```c
#include "include/mr_lib.h"
/* 定义通道编号 */
#define CHANNEL_NUMBER 5
/* 定义DAC设备描述符 */
int dac_ds = -1;
int dac_init(void)
{
int ret = MR_EOK;
/* 初始化DAC */
int dac_ds = mr_dev_open("dac1", MR_OFLAG_RDONLY);
if (dac_ds < 0)
{
mr_printf("DAC1 open failed: %s\r\n", mr_strerror(dac_ds));
return dac_ds;
}
/* 打印DAC描述符 */
mr_printf("DAC1 desc: %d\r\n", dac_ds);
/* 设置到通道5 */
mr_dev_ioctl(dac_ds, MR_CTL_DAC_SET_CHANNEL, mr_make_local(int, CHANNEL_NUMBER));
/* 设置通道使能 */
ret = mr_dev_ioctl(dac_ds, MR_CTL_DAC_SET_CHANNEL_STATE, mr_make_local(int, MR_DAC_STATE_ENABLE));
if (ret < 0)
{
mr_printf("Channel5 enable failed: %s\r\n", mr_strerror(ret));
return ret;
}
return MR_EOK;
}
/* 导出到自动初始化APP级 */
MR_APP_EXPORT(dac_init);
/* 定义DAC数据最大值 */
#define DAC_DATA_MAX 4095
int main(void)
{
/* 自动初始化dac_init函数将在此处自动调用 */
mr_auto_init();
while(1)
{
uint32_t data = 0;
for (data = 0; data < DAC_DATA_MAX; data += 500)
{
int ret = mr_dev_write(dac_ds, &data, sizeof(data));
if (ret != sizeof(data))
{
mr_printf("Write failed: %s\r\n", mr_strerror(ret));
}
mr_printf("DAC value: %d\r\n", data);
mr_delay_ms(500);
}
}
}
```
DAC1通道5使能间隔500毫秒输出一次DAC值并打印输出值递增步进500直到达到最大值4095