diff --git a/document/device/adc.md b/document/device/adc.md new file mode 100644 index 0000000..7ffd2e5 --- /dev/null +++ b/document/device/adc.md @@ -0,0 +1,185 @@ +# ADC设备 + + +* [ADC设备](#adc设备) + * [打开ADC设备](#打开adc设备) + * [关闭ADC设备](#关闭adc设备) + * [控制ADC设备](#控制adc设备) + * [设置/获取通道编号](#设置获取通道编号) + * [设置/获取通道状态](#设置获取通道状态) + * [读取ADC设备通道值](#读取adc设备通道值) + * [使用示例:](#使用示例) + + +## 打开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值并打印。 diff --git a/document/device/dac.md b/document/device/dac.md new file mode 100644 index 0000000..e481861 --- /dev/null +++ b/document/device/dac.md @@ -0,0 +1,191 @@ +# DAC设备 + + +* [DAC设备](#dac设备) + * [打开DAC设备](#打开dac设备) + * [关闭DAC设备](#关闭dac设备) + * [控制DAC设备](#控制dac设备) + * [设置/获取通道编号](#设置获取通道编号) + * [设置/获取通道状态](#设置获取通道状态) + * [写入DAC设备通道值](#写入dac设备通道值) + * [使用示例:](#使用示例) + + +## 打开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)。