diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/Kconfig" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/Kconfig" new file mode 100644 index 0000000000000000000000000000000000000000..39e3a48642cc7b06208f60a5be81c222c54efe95 --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/Kconfig" @@ -0,0 +1,13 @@ +menuconfig MQTT_JSON_CONFIG + bool "Enable MQTT JSON Configuration" + default y + +if MQTT_JSON_CONFIG + config MQTT_JSON_NAME + string "Name in JSON message" + default "xiaoming" + + config MQTT_JSON_STUDY + string "Study message in JSON" + default "Keep up the good work!" +endif \ No newline at end of file diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/test.c" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/test.c" new file mode 100644 index 0000000000000000000000000000000000000000..a454a526cc7c486b2abde61cbb18b4077767b1e6 --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\344\272\224\345\244\251\344\275\234\344\270\232/test.c" @@ -0,0 +1,204 @@ +#include +#include +#include +#include +#include +#include +#include "mqttclient.h" +#include + +/* MQTT Configuration */ +#ifndef KAWAII_MQTT_HOST +#define KAWAII_MQTT_HOST "jiejie01.top" +#endif +#ifndef KAWAII_MQTT_PORT +#define KAWAII_MQTT_PORT "1883" +#endif +#ifndef KAWAII_MQTT_CLIENTID +#define KAWAII_MQTT_CLIENTID "rtthread1209" +#endif +#ifndef KAWAII_MQTT_USERNAME +#define KAWAII_MQTT_USERNAME "rt-thread" +#endif +#ifndef KAWAII_MQTT_PASSWORD +#define KAWAII_MQTT_PASSWORD "rt-thread" +#endif +#ifndef KAWAII_MQTT_SUBTOPIC +#define KAWAII_MQTT_SUBTOPIC "rtt-sub" +#endif +#ifndef KAWAII_MQTT_PUBTOPIC +#define KAWAII_MQTT_PUBTOPIC "rtt-pub" +#endif + +#ifndef MQTT_JSON_NAME +#define MQTT_JSON_NAME "xiaoming" +#endif +#ifndef MQTT_JSON_STUDY +#define MQTT_JSON_STUDY "Keep up the good work!" +#endif + +static mqtt_client_t *mqtt_client = NULL; + +/* 创建JSON消息 */ +static char* create_json_message(void) +{ + cJSON *root = cJSON_CreateObject(); + if (root == NULL) { + KAWAII_MQTT_LOG_E("Failed to create JSON object"); + return NULL; + } + + cJSON_AddStringToObject(root, "name", MQTT_JSON_NAME); + cJSON_AddStringToObject(root, "study", MQTT_JSON_STUDY); + + char *json_string = cJSON_PrintUnformatted(root); + cJSON_Delete(root); + + if (json_string == NULL) { + KAWAII_MQTT_LOG_E("Failed to print JSON"); + } + + return json_string; +} + +/* 订阅消息处理回调 */ +static void mqtt_message_handler(void* client, message_data_t* msg) +{ + (void)client; + char *payload = (char*)msg->message->payload; + + KAWAII_MQTT_LOG_I("\n--- Received Message ---"); + KAWAII_MQTT_LOG_I("Topic: %s", msg->topic_name); + KAWAII_MQTT_LOG_I("Payload: %s", payload); + + /* 解析JSON消息 */ + cJSON *root = cJSON_Parse(payload); + if (root == NULL) { + KAWAII_MQTT_LOG_E("Invalid JSON format"); + return; + } + + /* 检查字段是否存在 */ + cJSON *name = cJSON_GetObjectItem(root, "name"); + cJSON *study = cJSON_GetObjectItem(root, "study"); + + if (cJSON_IsString(name) && cJSON_IsString(study)) { + KAWAII_MQTT_LOG_I("Parsed JSON - name: %s, study: %s", + name->valuestring, study->valuestring); + + /* 验证消息内容 */ + if (strcmp(name->valuestring, MQTT_JSON_NAME) == 0 && + strcmp(study->valuestring, MQTT_JSON_STUDY) == 0) { + + /* 构造回复消息 */ + mqtt_message_t reply_msg; + memset(&reply_msg, 0, sizeof(reply_msg)); + reply_msg.qos = QOS0; + reply_msg.payload = "辛苦了,下周的比赛加油!"; + + /* 发布回复 */ + if (mqtt_publish(mqtt_client, KAWAII_MQTT_PUBTOPIC, &reply_msg) == 0) { + KAWAII_MQTT_LOG_I("Sent response: %s", (char*)reply_msg.payload); + } else { + KAWAII_MQTT_LOG_E("Failed to send response"); + } + } + } else { + KAWAII_MQTT_LOG_E("Missing required JSON fields"); + } + + cJSON_Delete(root); + KAWAII_MQTT_LOG_I("-----------------------\n"); +} + +/* MQTT客户端初始化 */ +static int mqtt_client_init(void) +{ + mqtt_client = mqtt_lease(); + if (mqtt_client == NULL) { + KAWAII_MQTT_LOG_E("Failed to create MQTT client"); + return -1; + } + + /* 设置MQTT参数 */ + mqtt_set_host(mqtt_client, KAWAII_MQTT_HOST); + mqtt_set_port(mqtt_client, KAWAII_MQTT_PORT); + mqtt_set_client_id(mqtt_client, KAWAII_MQTT_CLIENTID); + mqtt_set_user_name(mqtt_client, KAWAII_MQTT_USERNAME); + mqtt_set_password(mqtt_client, KAWAII_MQTT_PASSWORD); + mqtt_set_clean_session(mqtt_client, 1); + + /* 连接服务器 */ + if (mqtt_connect(mqtt_client) != 0) { + KAWAII_MQTT_LOG_E("MQTT connect failed"); + return -1; + } + + /* 订阅主题 */ + if (mqtt_subscribe(mqtt_client, KAWAII_MQTT_SUBTOPIC, QOS0, mqtt_message_handler) != 0) { + KAWAII_MQTT_LOG_E("Subscribe failed"); + return -1; + } + + KAWAII_MQTT_LOG_I("MQTT client initialized successfully"); + KAWAII_MQTT_LOG_I("Client ID: %s", KAWAII_MQTT_CLIENTID); + KAWAII_MQTT_LOG_I("Subscribed to: %s", KAWAII_MQTT_SUBTOPIC); + KAWAII_MQTT_LOG_I("Publish to: %s", KAWAII_MQTT_PUBTOPIC); + + return 0; +} + +static void send_test_message(void) +{ + char *json_msg = create_json_message(); + if (json_msg == NULL) { + return; + } + + mqtt_message_t msg; + memset(&msg, 0, sizeof(msg)); + msg.qos = QOS0; + msg.payload = json_msg; + + KAWAII_MQTT_LOG_I("Sending test message: %s", json_msg); + mqtt_publish(mqtt_client, KAWAII_MQTT_SUBTOPIC, &msg); + + cJSON_free(json_msg); +} + +/* MQTT主线程 */ +static void mqtt_thread_entry(void *parameter) +{ + rt_thread_mdelay(5000); + + mqtt_log_init(); + + if (mqtt_client_init() != 0) { + KAWAII_MQTT_LOG_E("MQTT initialization failed"); + return; + } + + send_test_message(); + + while (1) { + rt_thread_mdelay(1000); + } +} + +int ka_mqtt(void) +{ + rt_thread_t tid = rt_thread_create("mqtt_demo", + mqtt_thread_entry, + RT_NULL, + 4096, + 15, + 10); + if (tid != RT_NULL) { + rt_thread_startup(tid); + return RT_EOK; + } + + return -RT_ERROR; +} + +MSH_CMD_EXPORT(ka_mqtt, Kawaii MQTT client with JSON support); \ No newline at end of file diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/drv_vir_led.c" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/drv_vir_led.c" new file mode 100644 index 0000000000000000000000000000000000000000..52926b411a9ec248f439f62a5159c7cdba7c698d --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/drv_vir_led.c" @@ -0,0 +1,113 @@ +#include +#include +#include "vir_led.h" + +// 设备初始化 +static rt_err_t _vir_led_init(rt_device_t dev) +{ + rt_kprintf("Virtual LED device initialized\n"); + return RT_EOK; +} + +// 设备打开 +static rt_err_t _vir_led_open(rt_device_t dev, rt_uint16_t oflag) +{ + rt_kprintf("Virtual LED device opened\n"); + return RT_EOK; +} + +// 设备关闭 +static rt_err_t _vir_led_close(rt_device_t dev) +{ + rt_kprintf("Virtual LED device closed\n"); + return RT_EOK; +} + +// 设备读操作(读取LED状态) +static rt_size_t _vir_led_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + rt_vir_led_device_t led = (rt_vir_led_device_t)dev; + if (led->ops->get_state && buffer != RT_NULL && size >= sizeof(rt_led_state_t)) + { + led->ops->get_state(dev, (rt_led_state_t*)buffer); + return sizeof(rt_led_state_t); + } + return -RT_ERROR; +} + +// 设备写操作(设置LED状态) +static rt_size_t _vir_led_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + rt_vir_led_device_t led = (rt_vir_led_device_t)dev; + if (led->ops->set_state && buffer != RT_NULL && size >= sizeof(rt_led_state_t)) + { + led->ops->set_state(dev, *(rt_led_state_t*)buffer); + return sizeof(rt_led_state_t); + } + return -RT_ERROR; +} + +// 设备控制 +static rt_err_t _vir_led_control(rt_device_t dev, int cmd, void *args) +{ + rt_vir_led_device_t led = (rt_vir_led_device_t)dev; + if (cmd == 1 && led->ops->set_blink) + { + rt_uint32_t *interval = (rt_uint32_t*)args; + led->ops->set_blink(dev, *interval); + return RT_EOK; + } + rt_kprintf("Unsupported control command: %d\n", cmd); + return -RT_ERROR; +} + +// LED注册函数 +rt_err_t rt_hw_vir_led_register(rt_vir_led_device_t device, const char *name, + const struct rt_vir_led_ops *ops, const void *user_data) +{ + RT_ASSERT(device != RT_NULL && ops != RT_NULL); + rt_err_t result; + + device->ops = ops; + device->parent.init = _vir_led_init; + device->parent.open = _vir_led_open; + device->parent.close = _vir_led_close; + device->parent.read = _vir_led_read; + device->parent.write = _vir_led_write; + device->parent.control = _vir_led_control; + result = rt_device_register(&device->parent, name, RT_DEVICE_FLAG_RDWR); + return result; +} + +rt_err_t rt_vir_led_set_state(rt_vir_led_device_t device, rt_led_state_t state) +{ + RT_ASSERT(device != RT_NULL && device->ops != RT_NULL); + if (device->ops->set_state) + { + device->ops->set_state((rt_device_t)device, state); + return RT_EOK; + } + return -RT_ERROR; +} + +rt_err_t rt_vir_led_get_state(rt_vir_led_device_t device, rt_led_state_t *state) +{ + RT_ASSERT(device != RT_NULL && device->ops != RT_NULL && state != RT_NULL); + if (device->ops->get_state) + { + device->ops->get_state((rt_device_t)device, state); + return RT_EOK; + } + return -RT_ERROR; +} + +rt_err_t rt_vir_led_set_blink(rt_vir_led_device_t device, rt_uint32_t interval) +{ + RT_ASSERT(device != RT_NULL && device->ops != RT_NULL); + if (device->ops->set_blink) + { + device->ops->set_blink((rt_device_t)device, interval); + return RT_EOK; + } + return -RT_ERROR; +} \ No newline at end of file diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/drv_vir_led.h" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/drv_vir_led.h" new file mode 100644 index 0000000000000000000000000000000000000000..4618e330d4ab4de07dfdeb8ac2a0f780d771e0da --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/drv_vir_led.h" @@ -0,0 +1,14 @@ +#ifndef __DRV_VIR_LED_H__ +#define __DRV_VIR_LED_H__ + +#include +#include "vir_led.h" + +struct vir_led_dev { + struct rt_vir_led_device parent; + rt_led_state_t state; // LED当前状态 + rt_uint32_t blink_interval; // 闪烁间隔(ms) + char *info; // 设备描述信息 +}; + +#endif \ No newline at end of file diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/drv_vir_led_dev.c" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/drv_vir_led_dev.c" new file mode 100644 index 0000000000000000000000000000000000000000..b197062a2f53b8768b21f019da0b9113a6a7a4ee --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/drv_vir_led_dev.c" @@ -0,0 +1,61 @@ +#include +#include "drv_vir_led.h" + +// 定义LED设备实例 +struct vir_led_dev vir_led; + +// 设置LED状态 +void vir_led_set_state(struct rt_device *device, rt_led_state_t state) +{ + struct vir_led_dev *led = (struct vir_led_dev *)device; + led->state = state; + switch(state) + { + case LED_OFF: + rt_kprintf("Virtual LED turned OFF\n"); + break; + case LED_ON: + rt_kprintf("Virtual LED turned ON\n"); + break; + case LED_BLINK: + rt_kprintf("Virtual LED started blinking\n"); + break; + } +} + +// 获取LED状态 +void vir_led_get_state(struct rt_device *device, rt_led_state_t *state) +{ + struct vir_led_dev *led = (struct vir_led_dev *)device; + *state = led->state; +} + +// 设置闪烁间隔 +void vir_led_set_blink(struct rt_device *device, rt_uint32_t interval) +{ + struct vir_led_dev *led = (struct vir_led_dev *)device; + led->blink_interval = interval; + rt_kprintf("Virtual LED blink interval set to %dms\n", interval); +} + +// LED操作函数集 +static struct rt_vir_led_ops vir_led_ops = { + vir_led_set_state, + vir_led_get_state, + vir_led_set_blink, +}; + +// LED初始化 +static int rt_hw_vir_led_init(void) +{ + // 初始化设备数据 + vir_led.state = LED_OFF; + vir_led.blink_interval = 500; + vir_led.info = "Virtual LED Device (GPIO Emulated)"; + + + rt_hw_vir_led_register(&vir_led.parent, "vir_led", &vir_led_ops, (void*)vir_led.info); + return RT_EOK; +} + +INIT_DEVICE_EXPORT(rt_hw_vir_led_init); diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/vir_led.h" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/vir_led.h" new file mode 100644 index 0000000000000000000000000000000000000000..548f15141b8087acad310091a4a78e2d7a23c8fa --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/vir_led.h" @@ -0,0 +1,35 @@ +#ifndef __VIR_LED_H__ +#define __VIR_LED_H__ + +#include +#include + +// LED状态枚举 +typedef enum { + LED_OFF = 0, + LED_ON = 1, + LED_BLINK +} rt_led_state_t; + +// 虚拟LED操作函数集 +struct rt_vir_led_ops { + void (*set_state)(struct rt_device *device, rt_led_state_t state); // 设置LED状态 + void (*get_state)(struct rt_device *device, rt_led_state_t *state); // 获取LED状态 + void (*set_blink)(struct rt_device *device, rt_uint32_t interval); // 设置闪烁间隔(ms) +}; + +// 虚拟LED设备基类 +struct rt_vir_led_device { + struct rt_device parent; + const struct rt_vir_led_ops *ops; +}; +typedef struct rt_vir_led_device *rt_vir_led_device_t; + +// 注册及操作函数声明 +rt_err_t rt_hw_vir_led_register(rt_vir_led_device_t device, const char *name, + const struct rt_vir_led_ops *ops, const void *user_data); +rt_err_t rt_vir_led_set_state(rt_vir_led_device_t device, rt_led_state_t state); +rt_err_t rt_vir_led_get_state(rt_vir_led_device_t device, rt_led_state_t *state); +rt_err_t rt_vir_led_set_blink(rt_vir_led_device_t device, rt_uint32_t interval); + +#endif \ No newline at end of file diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/vir_led_test.c" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/vir_led_test.c" new file mode 100644 index 0000000000000000000000000000000000000000..42781efc2dc435468b418700bbca4fd0099aa0d4 --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\344\275\234\344\270\232/\347\254\254\345\233\233\345\244\251\344\275\234\344\270\232/vir_led_test.c" @@ -0,0 +1,54 @@ +#include +#include +#include "vir_led.h" +#include "drv_vir_led.h" + +int vir_led_test(void) +{ + rt_device_t led_dev; + rt_led_state_t state; + rt_size_t ret; + rt_uint32_t blink_interval = 1000; // 1秒闪烁间隔 + + // 查找设备 + led_dev = rt_device_find("vir_led"); + if (led_dev == RT_NULL) + { + rt_kprintf("Find virtual LED device failed!\n"); + return -RT_ERROR; + } + + // 打开设备 + if (rt_device_open(led_dev, RT_DEVICE_FLAG_RDWR) != RT_EOK) + { + rt_kprintf("Open virtual LED device failed!\n"); + return -RT_ERROR; + } + + // 设置为点亮 + state = LED_ON; + ret = rt_device_write(led_dev, 0, &state, sizeof(state)); + if (ret != sizeof(state)) + rt_kprintf("Write LED state failed!\n"); + + // 读取当前状态 + ret = rt_device_read(led_dev, 0, &state, sizeof(state)); + if (ret == sizeof(state)) + rt_kprintf("Device read state: %d (0=OFF,1=ON,2=BLINK)\n", state); + + //设置为闪烁 + rt_vir_led_set_state((rt_vir_led_device_t)led_dev, LED_BLINK); + rt_vir_led_set_blink((rt_vir_led_device_t)led_dev, blink_interval); + + // 修改闪烁间隔 + rt_device_control(led_dev, 1, &blink_interval); + + // 获取当前状态 + rt_vir_led_get_state((rt_vir_led_device_t)led_dev, &state); + rt_kprintf("Special API read state: %d\n", state); + + // 关闭设备 + rt_device_close(led_dev); + return RT_EOK; +} +MSH_CMD_EXPORT(vir_led_test, Virtual LED test command); \ No newline at end of file diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/image.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/image.png" deleted file mode 100644 index 2cfd11a6817a6bb36c925d240cf116d1e9323069..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/image.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/1.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/1.png" new file mode 100644 index 0000000000000000000000000000000000000000..0a415a7a129453792a9c58fe222c7f9484abe3ba Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/1.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/10.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/10.png" new file mode 100644 index 0000000000000000000000000000000000000000..de85068e235985b54d9667492a941a2b7476c075 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/10.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/11.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/11.png" new file mode 100644 index 0000000000000000000000000000000000000000..5b4e53b693db4e100555e014447940a616a53579 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/11.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/12.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/12.png" new file mode 100644 index 0000000000000000000000000000000000000000..a34fe9a80d8f4180c0d000ac66b4e1580ffdd17d Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/12.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/13.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/13.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ad9db831d1c0aff74508a7526a751d88b429d65 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/13.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/14.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/14.png" new file mode 100644 index 0000000000000000000000000000000000000000..1df7174651acf427c4a6c32ce2e10499bf10e7f8 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/14.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/15.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/15.png" new file mode 100644 index 0000000000000000000000000000000000000000..278dce7b3b8698d39f814f3f2bed7e4e4ba15436 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/15.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/16.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/16.png" new file mode 100644 index 0000000000000000000000000000000000000000..e80798dec63420730aa0bcd7a4ed249cff2ed239 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/16.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/17.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/17.png" new file mode 100644 index 0000000000000000000000000000000000000000..77ffb4a13ee684a24c1031a0d8c904b6b2592a99 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/17.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/18.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/18.png" new file mode 100644 index 0000000000000000000000000000000000000000..6d916370e9f062ff1fe1df2528d16866d5561bc9 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/18.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/19.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/19.png" new file mode 100644 index 0000000000000000000000000000000000000000..c0a1c187d98a6182147635a7e81ed50d89701f8b Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/19.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/2.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/2.png" new file mode 100644 index 0000000000000000000000000000000000000000..7bea47cf041532f5c33cc239cf93001bf1332af0 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/2.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/20.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/20.png" new file mode 100644 index 0000000000000000000000000000000000000000..5ee0309df03e9ab706cdb871ecf5e5bb60296fb1 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/20.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/21.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/21.png" new file mode 100644 index 0000000000000000000000000000000000000000..136ef16382adc2721390190c1f605126b1328c74 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/21.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/22.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/22.png" new file mode 100644 index 0000000000000000000000000000000000000000..2a3adc651b2c01f7858c71b9a6d1449aaa9891ea Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/22.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/23.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/23.png" new file mode 100644 index 0000000000000000000000000000000000000000..95c5889738ae3af63fa693e6e6345134371e500e Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/23.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/24.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/24.png" new file mode 100644 index 0000000000000000000000000000000000000000..c92659189b7ee38a93b11d052bb83a3a5eb556a2 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/24.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/25.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/25.png" new file mode 100644 index 0000000000000000000000000000000000000000..370a1e5fbc24006f67b6dbe2cb52b78df39953d6 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/25.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/26.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/26.png" new file mode 100644 index 0000000000000000000000000000000000000000..ade837bd23ae99010611ec5c0258167396dd8f34 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/26.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/27.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/27.png" new file mode 100644 index 0000000000000000000000000000000000000000..b719573cc82c946b0ed0ff3c3059f38fa8c37d43 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/27.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/28.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/28.png" new file mode 100644 index 0000000000000000000000000000000000000000..ab55dd168681e187d57508c140c4b9c84262d96c Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/28.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/29.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/29.png" new file mode 100644 index 0000000000000000000000000000000000000000..a73db0af2e43bcdc2a0843ce8a243529cf468c2c Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/29.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/3.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/3.png" new file mode 100644 index 0000000000000000000000000000000000000000..deb8d8d34237154ed2c56c90d235d7c0aa214786 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/3.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/30.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/30.png" new file mode 100644 index 0000000000000000000000000000000000000000..1070e65a5f4370882b0a298524f8de27d1e714d6 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/30.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/31.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/31.png" new file mode 100644 index 0000000000000000000000000000000000000000..0b8d19b546002a0a0cc800df920f57175ccddecf Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/31.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/4.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/4.png" new file mode 100644 index 0000000000000000000000000000000000000000..8a76ea6dd62be78d374595f8b6c45fdec3798d8b Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/4.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/5.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/5.png" new file mode 100644 index 0000000000000000000000000000000000000000..9106c5326caeb14101d245f20421910f9ce536b1 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/5.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/6.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/6.png" new file mode 100644 index 0000000000000000000000000000000000000000..1f6ab5189d18933d6173ec1d124442732b6b8f47 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/6.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/7.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/7.png" new file mode 100644 index 0000000000000000000000000000000000000000..b4887cf060d72e4bdbaba73dd0e29a620d69605e Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/7.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/8.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/8.png" new file mode 100644 index 0000000000000000000000000000000000000000..8fdc795987ec4d076a4b7c52bbc0aa17d0466c65 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/8.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/9.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/9.png" new file mode 100644 index 0000000000000000000000000000000000000000..adfc57d53a8a5e77e508042dc41169f8aceecd1f Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day4/9.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/1.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/1.png" new file mode 100644 index 0000000000000000000000000000000000000000..7355571c520c0ce41b221d1235d15da220a84600 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/1.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/10.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/10.png" new file mode 100644 index 0000000000000000000000000000000000000000..f25109351a75a0c7a1baad7f8ace8875562d4fd1 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/10.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/11.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/11.png" new file mode 100644 index 0000000000000000000000000000000000000000..4e1f5371540b335c96c862162715d88948dfe2c5 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/11.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/12.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/12.png" new file mode 100644 index 0000000000000000000000000000000000000000..2c6ee8b0df3d902c74b9ea4619fd8ae51292274c Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/12.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/13.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/13.png" new file mode 100644 index 0000000000000000000000000000000000000000..b19c43cd9a780fb8253bf5e1e9320810377d74e9 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/13.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/14.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/14.png" new file mode 100644 index 0000000000000000000000000000000000000000..a99b0e2b75c0eb2dcf44bb04885556a00d40679e Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/14.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/15.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/15.png" new file mode 100644 index 0000000000000000000000000000000000000000..c5c7450af423c3c0e17a710e392e6424229af2f6 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/15.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/16.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/16.png" new file mode 100644 index 0000000000000000000000000000000000000000..b2e1b3207ee6f04fe8d0b4316803ba6030f4ee2a Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/16.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/17.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/17.png" new file mode 100644 index 0000000000000000000000000000000000000000..56a6701ba55abcfc776a75c84493aa65677d0dd2 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/17.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/18.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/18.png" new file mode 100644 index 0000000000000000000000000000000000000000..47941ff1577100a252d6a84dce3aa7c455ded1ad Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/18.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/19.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/19.png" new file mode 100644 index 0000000000000000000000000000000000000000..3544f55483b78c0e2c0582a905a087302a4c8fd5 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/19.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/2.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/2.png" new file mode 100644 index 0000000000000000000000000000000000000000..c61c03e1158c2e3fae636d9fcb1ded2641f1f613 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/2.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/20.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/20.png" new file mode 100644 index 0000000000000000000000000000000000000000..954031af8b84e618a3343eee71169d6ab45f6176 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/20.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/21.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/21.png" new file mode 100644 index 0000000000000000000000000000000000000000..c793d05e3c95084ce28554fe1ac1562af28bca25 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/21.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/22.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/22.png" new file mode 100644 index 0000000000000000000000000000000000000000..34c43d2d62cd2f480e420c2593c7656fbd122010 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/22.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/23.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/23.png" new file mode 100644 index 0000000000000000000000000000000000000000..178fe99971927e5051f7c5fb27f774885f1f49a9 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/23.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/24.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/24.png" new file mode 100644 index 0000000000000000000000000000000000000000..117856f4625a248b84472d8064d2448b30137336 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/24.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/25.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/25.png" new file mode 100644 index 0000000000000000000000000000000000000000..7c43a77c653fa0a0dd759ed70087910791282714 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/25.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/26.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/26.png" new file mode 100644 index 0000000000000000000000000000000000000000..41babfd9c9fd01d29dc9f3c5c8f00d4929e7ee0f Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/26.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/27.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/27.png" new file mode 100644 index 0000000000000000000000000000000000000000..fdd76e867d323326dcdbb1674c8fc6d21b4bbd70 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/27.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/28.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/28.png" new file mode 100644 index 0000000000000000000000000000000000000000..8f73d6c2be788d61d0b429bbd16488309263798d Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/28.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/3.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/3.png" new file mode 100644 index 0000000000000000000000000000000000000000..f71d57d2cde9cde4eff61f1283b7a0c329134ae1 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/3.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/4.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/4.png" new file mode 100644 index 0000000000000000000000000000000000000000..f60e11fa5e5fecad386eb57aed9fce68f01f31b1 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/4.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/5.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/5.png" new file mode 100644 index 0000000000000000000000000000000000000000..f46fa2172c7f9ab3db304ab7c0e7ff60b9fa7833 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/5.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/6.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/6.png" new file mode 100644 index 0000000000000000000000000000000000000000..0189af90f587fc366004b55186aff9e4d18b2fa4 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/6.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/7.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/7.png" new file mode 100644 index 0000000000000000000000000000000000000000..3fea43f86b6bc2e81424c45c468a2347f4f0dfd2 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/7.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/8.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/8.png" new file mode 100644 index 0000000000000000000000000000000000000000..13076f61e2bc02371f365ef2e0d22d0b8c100366 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/8.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/9.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/9.png" new file mode 100644 index 0000000000000000000000000000000000000000..83624c7380503bba1eabc48263b62f6583c79e46 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/images/day5/9.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/\343\200\220RSOC25\343\200\221Day 4\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\350\256\276\345\244\207\351\251\261\345\212\250.md" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/\343\200\220RSOC25\343\200\221Day 4\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\350\256\276\345\244\207\351\251\261\345\212\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..0734acf3931fd7ef22191389c4161440b7da80b2 --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/\343\200\220RSOC25\343\200\221Day 4\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\350\256\276\345\244\207\351\251\261\345\212\250.md" @@ -0,0 +1,415 @@ +# 【RSOC25】Day 4课程笔记:设备驱动 +## IO设备框架的概念 +### RT-Thread I/O框架 +![image](images/day4/1.png) +### RT-Thread支持的I/O设备类型 +![image](images/day4/2.png) +### 字符/块设备特点 +![image](images/day4/3.png) +### 为什么要对设备分类 +- MSH可以重定向到意的字符设备上,例如将lcd模拟成字符设备,就可以将打印输出到LCD上,或者是实现一套空字符设备,将msh重定向到这里。 +- Fatfs 文件系统依赖块设备驱动,我们将SD卡读写实现成块设备,但是也可以用ram来模拟块设备驱动, +- 不同的组件和应用会依赖不同的设备,对设备进行分类,可以做到对一类设备同样的控制。 +## I/O API +### 创建/销毁设备 +``` +rt device trt device create(int type, int attach size); +void rt device destroy(rt device t device); +``` +![image](images/day4/4.png) +### 注册/注销设备 +``` +*rt err trt device register(rt device t dev, const charname,rt uint8 t flags); +*rt err trt device unregister(rt device t dev); +``` +![image](images/day4/5.png) +### 查找设备/初始化设备 +``` +rt device trt device find(const char* name) +rt err trt device init(rt device t dev); +``` +![image](images/day4/9.png) +### 打开/关闭设备 +``` +rt err trt device open(rt device tdev,rt uint16 toflags); +rt err trt device close(rt device t dev); +``` +![image](images/day4/10.png) +### 打开标志位 +![image](images/day4/11.png) +### 控制设备 +``` +rt err trt device control(rt device t dev,rt uint8 tcmd, void* arg); +``` +![image](images/day4/12.png) +### 读写设备 +``` +rt size trt device read(rt device t dev,rt off t pos,void* bufferrt size t size); +rt size trt device write(rt device t dev, rt off t pos,const void*buffer, rt size t size); +``` +![image](images/day4/13.png) +### 数据接收回调 +当硬件设备收到数据时,可以通过如下函数回调另一个函数来设置数据接收指示,通知上层应用线程有数据到达: +``` +rt err trt device set rx indicate(rt device t dev,rt err t(*rx ind)(rt device tdev,rt size t size)); +``` +![image](images/day4/14.png) +在应用程序调用rt device write()入数据时,如果底层硬件能够支持自动发送,那么上层应用可以设置一个回调函数。这个回调函数会在底层硬件数据发送完成后(例如DMA传送完成或 FIFO已经写入完毕产生完成中断时)调用。可以通过如下函数设置设备发送完成指示,函数参数及返回值见: +``` +rt err trt device set tx complete(rt device t dev, rt err t(*tx done)(rt device t dev,void *buffer)); +``` +### I/O框架调用关系图 +![image](images/day4/15.png) +## 实验1:注册字符设备test +参考: +``` +rt device trt device create(int type, int attach size); +void rt _device_destroy(rt _device_t device); +rt err trt_device_register(rt device t dev, const char* name.rt _uint8_t flags); +rt err trt device unregister(rt device t dev); +``` +### 创建一个dev_test.c文件 +![image](images/day4/6.png) +### 在dev_test中写代码 +``` +#include +#include + +static int rt_dev_test_init(void) +{ + rt_device_t dev_test = rt_device_create(RT_Device_Class_Char, 0); + if(dev_test == RT_NULL) + { + rt_kprintf("Failed to create test device\n"); + return -RT_ERROR; + } + + if(rt_device_register(dev_test,"test_dev",RT_DEVICE_FLAG_RDWR)!=RT_EOK) + { + rt_kprintf("Failed to register test device\n"); + return -RT_ERROR; + } + + return RT_EOK; +} + +INIT_DEVICE_EXPORT(rt_dev_test_init); +``` +### 编译后将代码下载 +![image](images/day4/7.png) +## 访问I/O设备 +应用程序通过I/O设备管理接口来访问硬件设备,当设备驱动实现后,应用程序就可以访问该硬件。 +![image](images/day4/8.png) + +## GPIO开发 +### 概念与原理 +- 芯片上的引脚一般分为4类:电源、时钟、控制与 IO,I/O 口在使用模式上又分为 General Purpose Input Output(通用输入/输出),简称 GPIO,与功能复用 I/O(如 SPI/I2C/UART 等) +- 大多数MCU的引脚都不止一个功能。不同引脚内部结构不一样拥有的功能也不一样。可以通过不同的配置,切换引脚的实际功能通用 /O 口主要特性如下: +- 可编程控制中断:中断触发模式可配置,一般有下图所示5种中断触发模式: +![image](images/day4/16.png) +### 常用接口 +应用程序通过 RT-Thread 提供的 PIN设备管理接口来访问GPIO相关接口如下所示: +- rt pin mode():设置引脚模式 +- rt_pin_write():设置引脚电平 +- rt pin read():读取引脚电平 +- rt pin attach irg():绑定引脚中断回调函数 +- rt pin irg enable():使能引脚中断 +- rt pin detach irg():脱离引脚中断回调函数 +### 应用开发 +#### 配置GPIO引脚模式 +引脚在使用前需要先设置好输入或者输出模式,通过如下函数完成: +``` +void rt pin mode(rt base_t pin, rt base_t mode); +``` +mode 可取以下宏定义值之一: +![image](images/day4/17.png) +#### 输出高低电平 +设置引脚输出电平的函数如下所示: +``` +void rt pin write(rt base_t pin, rt base_t value); +``` +- value 可取2种宏定义值之一:PIN LOW 低电平PIN +## IIC总线 +### 简介 +![image](images/day4/18.png) +### 传输格式 +![image](images/day4/19.png) +### 起始位和结束位 +![image](images/day4/20.png) +### ACK NACK +![image](images/day4/21.png) +### 主机向从机写数据 +![image](images/day4/22.png) +### 主机向从机读数据 +![image](images/day4/23.png) +### IIC从机常用模式 +- 向I2C从机设备,某个寄存器写一个字节数据:改变传感器寄存器的值 +- 向I2C从机设备,某个寄存器写多个字节数据:同上 +- 向I2C从机设备,从某个寄存器读取一个字节数据:读取传感器寄存器状态 +- 向I2C从机设备,从某个寄存器读取多个字节数据:读取传感器数据 +### IIC设备探测Package +勾选使用I2C-tools软件包,方便对i2c设备进行调试 +![image](images/day4/24.png) +#### 探测总线上的设备:`i2c scan i2c3` +![image](images/day4/25.png) +### API操作 +#### 查找设备 +![image](images/day4/26.png) +#### 传输 +![image](images/day4/27.png) +### I2C消息数据类型 +![image](images/day4/28.png) +### 使用思路 +- 查找IIC设备 +- 构造msgs消息 +- 启动transfer传输 +- 处理结果 +### 例程 +#### 写一个字节数据 +``` +#include +#include + +void i2c_sample_single_byte_write(void) +{ + struct rt_i2c_bus_device *i2c_bus; + struct rt_i2c_msg msgs; + rt_uint8_t buf[2]; + + i2c_bus = (struct rt_i2c_bus_device *)rt_device_find("i2c2"); + if(i2c_bus == RT_NULL) + { + rt_kprintf("can't find %s device!\n", "i2c2"); + return; + } + + buf[0] = 0x6B; + + msgs.addr = 0x68; + msgs.flags = RT_I2C_WR; + msgs.buf = buf; + msgs.len = 1; + + if(rt_i2c_transfer(i2c_bus, &msgs, 1) == 1) + rt_kprintf("single byte write success!\n"); + else + rt_kprintf("single byte write failed...\n"); +} + +MSH_CMD_EXPORT(i2c_sample_single_byte_write, i2c_sample_single_byte_write); +``` +#### 写多字节数据 +``` +#include +#include + +void i2c_sample_multi_byte_write(void) +{ + struct rt_i2c_bus_device *i2c_bus; + struct rt_i2c_msg msgs; + rt_uint8_t buf[3]; + + i2c_bus = (struct rt_i2c_bus_device *)rt_device_find("i2c2"); + if(i2c_bus == RT_NULL) + { + rt_kprintf("can't find %s device!\n", "i2c2"); + } + + buf[0] = 0x01; + buf[1] = 0x02; + buf[2] = 0x03; + + msgs.addr = 0x68; + msgs.flags = RT_I2C_WR; + msgs.buf = buf; + msgs.len = 3; + + if(rt_i2c_transfer(i2c_bus, &msgs, 1) == 1) + rt_kprintf("multi byte write success!\n"); + else + rt_kprintf("multi byte write failed...\n"); +} + +MSH_CMD_EXPORT(i2c_sample_multi_byte_write, i2c_sample_multi_byte_write); +``` +#### 读数据 +``` +#include +#include + +void i2c_sample_single_byte_read(void) +{ + struct rt_i2c_bus_device *i2c_bus; + struct rt_i2c_msg msgs[2]; + rt_uint8_t send_buf[1], recv_buf[1]; + + i2c_bus = (struct rt_i2c_bus_device *)rt_device_find("i2c2"); + if(i2c_bus == RT_NULL) + { + rt_kprintf("can't find %s device!\n", "i2c2"); + } + + send_buf[0] = 0x6B; + recv_buf[0] = 0x6A; + + msgs[0].addr = 0x68; + msgs[0].flags = RT_I2C_WR; + msgs[0].buf = send_buf; + msgs[0].len = 1; + + msgs[1].addr = 0x68; + msgs[1].flags = RT_I2C_RD; + msgs[1].buf = recv_buf; + msgs[1].len = 1; + + if(rt_i2c_transfer(i2c_bus, msgs, 2) == 2) + rt_kprintf("single byte read: 0x%02x success!\n", recv_buf[0]); + else + rt_kprintf("single byte read failed...\n"); +} + +MSH_CMD_EXPORT(i2c_sample_single_byte_read, i2c_sample_single_byte_read); +``` +### 应用开发常见的错误 +- 单设备挂掉导致总线死锁 +- rt_i2c_transfer函数执行返回-5 +### 软件IIC驱动编写 +- 开启I2C框架 +- 选中I2C软件模拟设备功能 +- 编写I2C软件模拟驱动 + +## SPI总线 +### 概念 +SP|(SerialPeripheralInterface,串行外设接口)是一种高速、全双工、同步通信总线,常用于短距离通讯,主要应用于EEPROM、FLASH、实时时钟、AD转换器、还有数字信号处理器和数字信号解码器之间。SPI一般使用4根线通信 +![image](images/day4/29.png) +在RT-Thread 中,SPI设备分为'SPI总线”和“SPI设备”两大类,SPI总线对应SPI控制器,SPI设备对应不同CS连接的从设备,使用前需要先注册SPI总线,再把从设备挂载到总线上。 +### 打开SPI框架/添加SPI BUS驱动 +![image](images/day4/30.png) +### 注册SPI设备 +挂载SPI设备:SPI驱动会注册SPI总线,SPI设备需要挂载到已经注册好的 SP|总线上。 +函数: +``` +rt_err_t rt spi bus _attach device(struct rt_spi device *device,const char *name,const char *bus name,void *user data) + +``` +此函数用于挂载一个SPI设备到指定的SPI总线,并向内核注册SPI设备,并将user data 保存到 SPI设备的控制块里。 +若使用 rt-thread/bsp/stm32目录下的 BSP 则可以使用下面的函数挂载SPI设备到总线: +函数: +``` +rt err trt hw spi device attach(const char*bus name, +const char *device name,GPI0_TypeDef *cs gpiox, +uint16 t cs gpio pin); +``` +一般SPI总线命名原则为spix,SPI设备命名原则为 spixy,如spi10表示挂载在spi1总线上的0号设备。user data 一般为 SPI设备的CS引脚指针,进行数据传输时SPI控制器会操作此引脚进行片选。 +例程: +``` +#include +#include +#include "dry spi.h" +#include "drv gpio.h' +static int spi attach(void){ + return rt hw_spi device attach("spi2","spi20",GET_PIN(B, 12)); +} +INIT DEVICE EXPORT(spi attach); +``` +### 控制SPI设备相关API +![image](images/day4/31.png) +### 演示:SPI设备传输数据(一次通信) +``` +#include +#include + +#include "drv_spi.h" +#include "drv_gpio.h" + +static int spi_attach(void) +{ + return rt_hw_spi_device_attach("spi2", "spi28", GET_PIN(B, 12)); +} +MSH_CMD_EXPORT(spi_attach, spi_attach); + +static int spi_example(void) +{ + rt_err_t ret = RT_EOK; + struct rt_spi_device *spi28 = (struct rt_spi_device *)rt_device_find("spi28"); + + struct rt_spi_configuration cfg; + cfg.data_width = 8; + cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; + cfg.max_hz = 1 * 1000 * 1000; /* 1M */ + rt_spi_configure(spi28, &cfg); + + rt_uint8_t sendBuff = 0xA0; + rt_uint8_t recvBuff = 0xF1; + ret = rt_spi_transfer(spi28, &sendBuff, &recvBuff, 1); + rt_kprintf("ret = %d\n", ret); + + return ret; +} +MSH_CMD_EXPORT(spi_example, spi_example); +``` +### 演示:单独发送数据(一次通信) +``` +static int spi_send_one_data(void) +{ + rt_err_t ret = RT_EOK; + struct rt_spi_device *spi20 = (struct rt_spi_device *)rt_device_find("spi20"); + + struct rt_spi_configuration cfg; + cfg.data_width = 8; + cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; + cfg.max_hz = 1 * 1000 * 1000; /* 1M */ + rt_spi_configure(spi20, &cfg); + + rt_uint8_t sendBuff = 0x1A; + ret = rt_spi_send(spi20, &sendBuff, 1); + rt_kprintf("ret = %d\n", ret); // return actual num + + return ret; +} +MSH_CMD_EXPORT(spi_send_one_data, spi_send_one_data); +``` +### 演示:单独接收数据(一次通信) +``` +static int spi_recv_one_data(void) +{ + rt_err_t ret = RT_EOK; + struct rt_spi_device *spi20 = (struct rt_spi_device *)rt_device_find("spi20"); + + struct rt_spi_configuration cfg; + cfg.data_width = 8; + cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; + cfg.max_hz = 1 * 1000 * 1000; /* 1M */ + rt_spi_configure(spi20, &cfg); + + rt_uint8_t recvBuff = 0x1A; + ret = rt_spi_recv(spi20, &recvBuff, 1); // return actual num + rt_kprintf("ret = %d\n", ret); + + return ret; +} +MSH_CMD_EXPORT(spi_recv_one_data, spi_recv_one_data); +``` +### 演示:连续两次发送数据 +``` +static int spi_send_then_send_data(void) +{ + rt_err_t ret = RT_EOK; + struct rt_spi_device *spi20 = (struct rt_spi_device *)rt_device_find("spi20"); + + struct rt_spi_configuration cfg; + cfg.data_width = 8; + cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; + cfg.max_hz = 1 * 1000 * 1000; /* 1M */ + rt_spi_configure(spi20, &cfg); + + rt_uint8_t sendBuff1[2] = {0x1A, 0x99}; + rt_uint8_t sendBuff2[2] = {0x1A, 0x99}; + ret = rt_spi_send_then_send(spi20, &sendBuff1, 2, &sendBuff2, 2); + rt_kprintf("ret = %d\n", ret); // RT_EOK means success + + return ret; +} +MSH_CMD_EXPORT(spi_send_then_send_data, spi_send_then_send_data); +``` +## \ No newline at end of file diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/\343\200\220RSOC25\343\200\221Day 5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\350\275\257\344\273\266\345\214\205\347\232\204\344\275\277\347\224\250\345\222\214\347\275\221\350\267\257\347\233\270\345\205\263\345\272\224\347\224\250.md" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/\343\200\220RSOC25\343\200\221Day 5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\350\275\257\344\273\266\345\214\205\347\232\204\344\275\277\347\224\250\345\222\214\347\275\221\350\267\257\347\233\270\345\205\263\345\272\224\347\224\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..365616527afce9c90cfa4c47796816bb1b48cad6 --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\345\221\250\351\224\266\347\220\252/\347\254\224\350\256\260/\343\200\220RSOC25\343\200\221Day 5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\350\275\257\344\273\266\345\214\205\347\232\204\344\275\277\347\224\250\345\222\214\347\275\221\350\267\257\347\233\270\345\205\263\345\272\224\347\224\250.md" @@ -0,0 +1,69 @@ +# 【RSOC25】Day 5课程笔记:软件包的使用和网络相关应用 +## 软件包机制 +网站:https://packages.rt-thread.org/index.html +### 步骤 +在env中通过图形化界面选择相应的软件包,保存即可下载到工程中 +![image](images/day5/1.png) +具体: +在D:\2025-RSOC\rt-thread\bsp\qemu-vexpress-a9目录下,打开env +输入 `menuconfig ` +按下键盘中的反斜杠按键,进入到搜索界面 +![image](images/day5/2.png) +如果有PKG为前缀的,就是软件包的索引 +![image](images/day5/3.png) +按下空格,可以选中软件包 +![image](images/day5/4.png) +按Q退出并保存,出来后,可以看见更新了.config +![image](images/day5/5.png) +输入`pkgs --update`下载软件包 +![image](images/day5/6.png) +在VS中,使用`scons -j18`进行编译 +![image](images/day5/7.png) +使用`.\qemu-nographic.bat`命令运行 +![image](images/day5/8.png) +### 添加软件包LLM-Chat +打开软件包仓库 +![image](images/day5/9.png) +找到LLM-Chat +![image](images/day5/10.png) +获取API 链接:https://bailian.console.aliyun.com/?tab=model#/api-key +把获取的API链接添加到下方 +![image](images/day5/11.png) +进入 RT-Thread online packages →security packages→ mbedtls 菜单,修改 Maxiumfragment length in bytes 字段为 6144 +![image](images/day5/12.png) +使能MbedTLS support +![image](images/day5/13.png) +使能网络驱动 +![image](images/day5/14.png) +输入`pkgs --update`拉取软件包 +![image](images/day5/15.png) +使用`scons -j18`进行编译,并使用`.\qemu-nographic.bat`命令运行,输入`help`命令,发现已经支持刚才下载的软件包了 +![image](images/day5/16.png) +### Kconfig、Scons语法 +![image](images/day5/17.png) +Scons基本命令:https://www.rt-thread.org/document/site/#/development-tools/build-config-system/SCons +### 根据上面的流程安装netutils包(一个联网的小组件) +![image](images/day5/18.png) +开启NTP功能(可以联网获得当前时间,可以和本地时间进行校准) +输入`pkgs --update`下载软件包,使用`scons -j18`进行编译,并使用`.\qemu-nographic.bat`命令运行 +![image](images/day5/19.png) +检测联网功能:`ifconfig` +![image](images/day5/20.png) +输入`date`可以查看当前时间 +![image](images/day5/21.png) +### 根据上面的流程安装mqtt软件包 +用到的网站:https://www.emqx.com/zh +![image](images/day5/22.png) +服务器地址改为broker.emqx.io(官方地址) +![image](images/day5/23.png) +id也需要随便设置一个 +![image](images/day5/24.png) +配置好以后,输入`pkgs --update`下载软件包,使用`scons -j18`进行编译并使用`.\qemu-nographic.bat`命令运行 +输入`ka_mqtt`连接服务器 +![image](images/day5/26.png) +打开MQTTX,订阅rtt-pub,可以发现控制台中已经接收到了语句 +![image](images/day5/25.png) +输入`ps`命令,发现tcpip的栈已经占了97% +![image](images/day5/27.png) +可以将这两个栈的大小改大 +![image](images/day5/28.png) \ No newline at end of file