diff --git a/document/device/i2c.md b/document/device/i2c.md index 6fc22b0..790e54e 100644 --- a/document/device/i2c.md +++ b/document/device/i2c.md @@ -177,12 +177,12 @@ mr_dev_ioctl(ds, MR_CTL_I2C_GET_RD_DATASZ, &size); /* 定义回调函数 */ int call(int desc, void *args) { -/* 获取缓冲区数据大小 */ -ssize_t data_size = *(ssize_t *)args; - -/* 处理中断 */ - -return MR_EOK; + /* 获取缓冲区数据大小 */ + ssize_t data_size = *(ssize_t *)args; + + /* 处理中断 */ + + return MR_EOK; } int (*callback)(int, void *args); diff --git a/document/device/pin.md b/document/device/pin.md index 0fa5f64..78821fe 100644 --- a/document/device/pin.md +++ b/document/device/pin.md @@ -229,7 +229,9 @@ int key_call(int desc, void *args) mr_dev_read(desc, &level, sizeof(level)); level = !level; mr_dev_write(desc, &level, sizeof(level)); + return MR_EOK; } + return MR_EINVAL; } int led_key_init(void) diff --git a/document/device/serial.md b/document/device/serial.md index ba57337..92a7bf5 100644 --- a/document/device/serial.md +++ b/document/device/serial.md @@ -151,12 +151,12 @@ mr_dev_ioctl(ds, MR_CTL_SERIAL_GET_WR_DATASZ, &size); /* 定义回调函数 */ int call(int desc, void *args) { -/* 获取缓冲区数据大小 */ -ssize_t data_size = *(ssize_t *)args; - -/* 处理中断 */ - -return MR_EOK; + /* 获取缓冲区数据大小 */ + ssize_t data_size = *(ssize_t *)args; + + /* 处理中断 */ + + return MR_EOK; } int (*callback)(int, void *args); diff --git a/document/device/timer.md b/document/device/timer.md new file mode 100644 index 0000000..58f1740 --- /dev/null +++ b/document/device/timer.md @@ -0,0 +1,196 @@ +# TIMER设备 + +## 打开TIMER设备 + +```c +int mr_dev_open(const char *name, int oflags); +``` + +| 参数 | 描述 | +|---------|---------| +| name | 设备名称 | +| oflags | 打开设备的标志 | +| **返回值** | | +| `>=0` | 设备描述符 | +| `<0` | 错误码 | + +- `name`:TIMER设备名称一般为:`timerx`,例如:`timer1`、`timer2`、`timer3`。 +- `oflags`:打开设备的标志,支持 `MR_OFLAG_RDONLY`、 `MR_OFLAG_WRONLY`、 `MR_OFLAG_RDWR`。 + +注:使用时应根据实际情况为不同的任务分别打开TIMER设备,并使用适当的`oflags`进行管理和权限控制,以确保它们不会相互影响。 + +## 关闭TIMER设备 + +```c +int mr_dev_close(int desc); +``` + +| 参数 | 描述 | +|---------|-------| +| desc | 设备描述符 | +| **返回值** | | +| `=0` | 关闭成功 | +| `<0` | 错误码 | + +## 控制TIMER设备 + +```c +int mr_dev_ioctl(int desc, int cmd, void *args); +``` + +| 参数 | 描述 | +|---------|-------| +| desc | 设备描述符 | +| cmd | 命令码 | +| args | 命令参数 | +| **返回值** | | +| `=0` | 设置成功 | +| `<0` | 错误码 | + +- `cmd`:命令码,支持以下命令: + - `MR_CTL_TIMER_SET_CONFIG`:设置TIMER设备配置。 + - `MR_CTL_TIMER_SET_TIMEOUT_CALL`:设置超时回调函数。 + - `MR_CTL_TIMER_GET_CONFIG`:获取TIMER设备配置。 + - `MR_CTL_TIMER_GET_TIMEOUT_CALL`:获取超时回调函数。 + +### 设置/获取TIMER设备配置 + +TIMER设备配置: + +- `mode`:周期或单次模式。 + +```c +/* 设置默认配置 */ +struct mr_timer_config config = MR_TIMER_CONFIG_DEFAULT; + +/* 设置TIMER设备配置 */ +mr_dev_ioctl(ds, MR_CTL_TIMER_SET_CONFIG, &config); +/* 获取TIMER设备配置 */ +mr_dev_ioctl(ds, MR_CTL_TIMER_GET_CONFIG, &config); +``` + +注:如未手动配置,默认配置为: + +- 模式:`MR_TIMER_MODE_PERIOD` + +### 设置/获取超时回调函数 + +```c +/* 定义回调函数 */ +int call(int desc, void *args) +{ + /* 处理中断 */ + + return MR_EOK; +} +int (*callback)(int, void *args); + +/* 设置超时回调函数 */ +mr_dev_ioctl(ds, MR_CTL_TIMER_SET_TIMEOUT_CALL, &call); +/* 获取超时回调函数 */ +mr_dev_ioctl(ds, MR_CTL_TIMER_GET_TIMEOUT_CALL, &callback); +``` + +## 读取TIMER设备运行时间 + +```c +ssize_t mr_dev_read(int desc, void *buf, size_t size); +``` + +| 参数 | 描述 | +|---------|---------| +| desc | 设备描述符 | +| buf | 读取数据缓冲区 | +| size | 读取数据大小 | +| **返回值** | | +| `>=0` | 读取数据大小 | +| `<0` | 错误码 | + +```c +uint32_t time; +/* 读取TIMER设备数据 */ +ssize_t size = mr_dev_read(ds, &time, sizeof(time)); +/* 是否读取成功 */ +if (size < 0) +{ + +} +``` + +注: +- 时间单位为微妙。单次读取最小单位为`uint32_t`,即4个字节。 +- 运行时间指定时器启动后运行的时间,超时后重置。 + +## 写入TIMER设备定时时间 + +```c +ssize_t mr_dev_write(int desc, const void *buf, size_t size); +``` + +| 参数 | 描述 | +|---------|---------| +| desc | 设备描述符 | +| buf | 写入数据缓冲区 | +| size | 写入数据大小 | +| **返回值** | | +| `>=0` | 写入数据大小 | +| `<0` | 错误码 | + +注: +- 时间单位为微妙。单次写入最小单位为`uint32_t`,即4个字节。 +- 当有一次写入多个单位数据时,仅实际生效最后一个有效数据(如果最后一个有效数据为`0`将关闭定时器)。 + +## 使用示例 + +```c +#include "include/mr_lib.h" + +int timeout_call(int desc, void *args) +{ + /* 注意:请将CONSOLE的打开方式设置成非阻塞模式 */ + mr_printf("Timeout\r\n"); + return MR_EOK; +} + +/* 定时时间 */ +#define TIMEOUT 500000 + +int timer_init(void) +{ + /* 初始化TIMER */ + int timer_ds = mr_dev_open("timer1", MR_OFLAG_RDWR); + if (timer_ds < 0) + { + mr_printf("timer open failed: %s\r\n", mr_strerror(timer_ds)); + return timer_ds; + } + /* 打印TIMER描述符 */ + mr_printf("TIMER desc: %d\r\n", timer_ds); + /* 设置超时回调函数 */ + mr_dev_ioctl(led_ds, MR_CTL_TIMER_SET_TIMEOUT_CALL, timeout_call); + /* 设置定时时间 */ + uint32_t timeout = TIMEOUT; + int ret = mr_dev_write(timer_ds, &timeout, sizeof(timeout)); + if(ret < 0) + { + mr_printf("timer write failed: %s\r\n", mr_strerror(ret)); + return ret; + } + return MR_EOK; +} +/* 导出到自动初始化(APP级) */ +MR_APP_EXPORT(timer_init); + +int main(void) +{ + /* 自动初始化(timer_init函数将在此处自动调用) */ + mr_auto_init(); + + while(1) + { + + } +} +``` + +定时器以500ms为周期,每500ms打印一次`Timeout`。 diff --git a/include/device/timer.h b/include/device/timer.h index ca7e173..4974107 100644 --- a/include/device/timer.h +++ b/include/device/timer.h @@ -36,7 +36,7 @@ extern "C" { */ struct mr_timer_config { - uint32_t mode: 1; /* Mode */ + uint32_t mode: 1; /* Mode */ uint32_t reserved: 31; };