基于RT-Thread和兆易创新GD32F527系列MCU的健康监测站 | 技术集结

RT-Thread 移植教程 基于GD32F4XX。 本文将详细介绍如何将RT-Thread实时操作系统移植到GD32F4XX系列MCU上。GD32F4XX是兆易创新推出的高性能ARM Cortex-M4内核微控制器,与STM32F4系列引脚兼容但性价比更高。RT-Thread是一个开源嵌入式实时操作系统,具有内核小巧、组件丰富等特点。目录下可以找到GD32的板级支持包。从RT-Thread官方GitHub仓库获取源码后,在。 阅读详情

本项目为RT-Thread嵌入式大赛获奖作品,基于RT-Thread和兆易创新GD32F527I-EVAL的健康监测站。

目录

项目概述

系统硬件框架结构

基础驱动程序实现

整体驱动实现

工程效果

演示视频及代码

演示视频链接:https://www.bilibili.com/video/BV1WgUoBXE2n/?pop_share=1&vd_source=e1bd226340c8b87027d5dcfc6b0c3344

1 项目概述

1.1 项目背景

血氧、心率监测是人们最常关心的,特别是一些特殊的群体比如老人,患有心血管系统、呼吸系统疾病的人。能方便及时的监测到心率与血氧。本项目主要利用了开发板的大内存、大屏幕,移植LVGL,能够让老年人也看得清楚。

1.2 系统功能介绍

基于GD32F527I-EVAL开发板实现如下功能:

  • 使用管方的RTTherad库,管理整个系统资源。

  • 移植LCD驱动,给LVGL提供显示基础

  • 移植触摸驱动,给LVGL提供用户输入基础

  • 移植USART5,实现与传感器的交互接口。

  • 移植LVGL,设计GUI界面

  • 实现传感器驱动,实现血氧、心率的监测。

1.3 系统使用的技术要点

  • 整个系统由国产开源操作系统RT-Thead实现驱动的模块化设计,以及系统调度。

  • 硬件:GD32F527I-EVAL

  • 开发板语言:C、GuiGuider

2 系统硬件框架结构

2.1 TFT—LCD接口

开发板板载了LCD屏,其原理图如下:

2.2 SDRAM接口

由于开发板上外扩了RAM,给LVGL驱动提供了大内存空间,原理图如下:

2.3 USART5接口

由于开发板的外设非常多,找到摄像头接口的PC6、PC7作为USART5的接口:

3 基础驱动程序实现

3.1 基础工程

3.1.1 下载RT-Thread源码

https://gitee.com/rtthread/rt-thread

下载源码到本地。

3.1.2 同步并打包

  1. 下载好源码后,进入rt-thread/tree/master/bsp/gd32/arm/gd32527I-eval目录下面执行pkgs —upgrade-force同步

  2. 然后进行pkgs —update

  3. 执行 scons —target=mdk5

  4. 然后进行 scons —dist 打包单独的工程。

  5. 复制打包好的工程到单独的目录下。

现在单独的工程就创建好了。

3.2 移植LVGL

创建好工程后,首先就需要生成用户交互界面。我在论坛有单独的作品:

https://club.rt-thread.org/ask/article/a2dba0eaa063757a.html

3.3 移植触摸驱动

LVGL需要驱动触摸屏,我也有单独的作品:

https://club.rt-thread.org/ask/article/104ea5e6b33e788e.html

3.4 移植mks传感器串口接口

详见单独作品:

https://club.rt-thread.org/ask/article/1074357ba9757cdb.html

4 整体驱动实现

通过上的基工程的实现,接下来就是整合驱动,实整个工程。

4.1 界面设计

4.1.1 GuiGuide设计

我使用开源的GuiGuider设了用户交互界面:

控件1:btn_start,实现开始、停止测量的复用功能

控件2:label_heart 用于显示测量到的心率值

控件3:label_spo2 用于显示测量到的心率值

控件4:bar 用于显示测量的进度条

其余控件为固定标签。

4.1.2 事件添加

为btn_start 添加clicked事件

最后生成C语言的工程。

4.2 LVGL工程移植

4.2.1 复制guiguider工程

在生成工程的目录中,我复制generated文件夹到基础工程下的LVGL目录下面,替换掉原来的generated文件夹。

4.2.2 添加文件到工程

在mdk中,将generated下面的所有.c/h添加到mdk工程中:

4.2.3 添加bnt事件代码

根据传感器的手册,我们开始测量时,是向串口发送数据0x8A,停止是向串口发送0x88。

添加按键的的驱动代码如下:

extern lv_ui guider_ui;externintmks_cmd(int argc, char *argv[]);// 全局/静态变量:控制进度条和定时器(确保回调中可访问)staticlv_timer_t *progress_timer = NULL;  // 进度条定时器staticint current_progress = 0;          // 当前进度值(0-100)// 进度条定时器回调函数(每隔 200ms 触发一次)staticvoidprogress_timer_cb(lv_timer_t *timer){    current_progress++;  // 每次进度 +1%(200ms × 100 = 20 秒)    // 更新进度条值(关闭动画,避免和定时器冲突)    lv_bar_set_value(guider_ui.screen_bar, current_progress, LV_ANIM_OFF);    // 进度达到 100%,停止定时器并重置状态    if (current_progress >= 100) {        lv_timer_del(progress_timer);  // 删除定时器(释放资源)        progress_timer = NULL;         // 重置定时器指针        current_progress = 0;          // 重置进度值        char *argv[] = {"mks_cmd", "stop", NULL};        int argc = 2;        mks_cmd(argc, argv);        // 可选:进度完成后,自动将按钮切回「开始」       lv_label_set_text(guider_ui.screen_btn_start_label, "Start");       lv_bar_set_value(guider_ui.screen_bar, 0, LV_ANIM_OFF);    }}staticvoidscreen_btn_start_event_handler(lv_event_t *e){    lv_event_code_t code = lv_event_get_code(e);    switch (code) {    case LV_EVENT_CLICKED:    {         constchar *btn_text = lv_label_get_text(guider_ui.screen_btn_start_label);;         if (btn_text != NULL && strcmp(btn_text, "Start") == 0) {         rt_kprintf("start test\n");         // 停止已存在的定时器(避免重复启动,防止进度加速)         if (progress_timer != NULL) {             lv_timer_del(progress_timer);             progress_timer = NULL;         }         // 初始化进度状态         current_progress = 0;         lv_bar_set_range(guider_ui.screen_bar, 0, 100);  // 设置进度条范围:0-100(百分比)         lv_bar_set_value(guider_ui.screen_bar, 0, LV_ANIM_OFF);  // 进度条归零         // 创建并启动定时器:周期 200ms,触发回调函数         progress_timer = lv_timer_create(progress_timer_cb, 200, NULL);         lv_timer_resume(progress_timer);  // 启动定时器(LVGL 定时器默认创建后启动,保险起见手动调用)         // 构造参数并调用         char *argv[] = {"mks_cmd", "start", NULL};         int argc = 2;         mks_cmd(argc, argv);         lv_label_set_text(guider_ui.screen_btn_start_label, "Stop");         }         elseif (btn_text != NULL && strcmp(btn_text, "Stop") == 0) {         // 停止并删除定时器         if (progress_timer != NULL) {         lv_timer_del(progress_timer);         progress_timer = NULL;         }         // 进度条归零,状态重置         current_progress = 0;         lv_bar_set_value(guider_ui.screen_bar, 0, LV_ANIM_OFF);         char *argv[] = {"mks_cmd", "stop", NULL};         int argc = 2;         mks_cmd(argc, argv);         lv_label_set_text(guider_ui.screen_btn_start_label, "Start");         lv_obj_center(guider_ui.screen_btn_start_label);    }         break;    }    default:        break;    }}

4.2.4 添加初始化gui代码

在main.c中添加用于lvgl 心跳包的任务,与初始化lvgl的代码:

#define LED1_PIN GET_PIN(E, 3)#define LVGL_TASK_PERIOD 10  // ms#define LVGL_TICK_PERIOD 5   // mslv_ui guider_ui; staticrt_thread_t lvgl_task_thread = RT_NULL;staticrt_thread_t lvgl_tick_thread = RT_NULL;staticvoidlvgl_tick_thread_entry(void *parameter){    while (1)    {       lv_tick_inc(5);        rt_thread_delay(5);    }}staticvoidlvgl_task_thread_entry(void *parameter){    lv_init();    lcd_init();    lv_port_disp_init();    lv_port_indev_init();    setup_ui(&guider_ui);    setup_ui(&guider_ui);    events_init(&guider_ui);    while (1)    {        lv_task_handler();        rt_thread_delay(10);    }}intmain(void){    /* set LED1 pin mode to output */    rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);    exmc_synchronous_dynamic_ram_init(EXMC_SDRAM_DEVICE0);    //在这里启用两个任务    lvgl_task_thread = rt_thread_create("lvgl_task", lvgl_task_thread_entry, RT_NULL, 4096, 25, 10);    if (lvgl_task_thread != RT_NULL)        rt_thread_startup(lvgl_task_thread);    lvgl_tick_thread = rt_thread_create("lvgl_tick", lvgl_tick_thread_entry, RT_NULL, 512, 25, 10);    if (lvgl_tick_thread != RT_NULL)        rt_thread_startup(lvgl_tick_thread);    while (1)    {        rt_thread_mdelay(1000); // 主线程可以做其他事情    }    return RT_EOK;}

将程序下载到开发板后,按下按键,能在USART5上面看到的0x8A、0x88输出,说明程序运转正常。

4.3 mks传感器驱动

4.3.1 mks传感器通信协议:

根据通信协议进行串口的代码实现。

4.3.2 mks串口添加:

在menuconfig中,打开usart5,保存工程并重新生成工程。

4.3.3 mks串口驱动实现

  1. 在驱动中,按照rtthead srial的标准驱动。

  2. 由于mkd传感器的波特率为38400,因此需要在初始化后,重新配置serial的驱动结构体,并进行配置。

  3. 定义他为uart5 实现中断接收功能,详见驱动代码如下:

接收传感器并实现解码,并实时将接收到的数据通过LVGL显示到界面中。

#include"app.h"#include"string.h"#include<stdio.h>#include<rtthread.h>#include<rtdevice.h>#include"lvgl.h"#include"gui_guider.h"#define MAX_BUFFSIZE 128#define RECEIVE_LENGTH 88 #define PACKET_HEADER 0xFF#define SAMPLE_UART_NAME       "uart5"/* 用于接收消息的信号量 */staticstructrt_semaphorerx_sem;staticrt_device_t serial;// --- 全局变量定义 ---int8_t mks_waveform_data[MKS_WAVEFORM_SAMPLES];uint8_t mks_heart_rate = 0;uint8_t mks_spo2 = 0;volatileuint8_t mks_new_data_flag = 0;  // Use volatile as it might be checked in timer/ISR context later// --- 内部接收缓冲区 ---staticuint8_t mks_rx_buffer[MKS_PACKET_SIZE];staticuint8_t mks_bytes_received = 0;// lvglextern lv_ui guider_ui; staticchar buf[4];/* 接收数据回调函数 */staticrt_err_tuart_input(rt_device_t dev, rt_size_t size){    /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */    rt_sem_release(&rx_sem);    return RT_EOK;}/** * 串口接受线程 * @param parameter */staticvoidserial_thread_entry(void *parameter){    char ch;    mks_bytes_received = 0;     // Reset buffer state    mks_new_data_flag = 0;  // 初始无新数据    // 初始化数据为0    memset(mks_rx_buffer,0, RECEIVE_LENGTH);    mks_heart_rate = 0;    mks_spo2 = 0;    while (1)    {        /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */        while (rt_device_read(serial, -1, &ch, 1) != 1)        {            /* 阻塞等待接收信号量,等到信号量后再次读取数据 */            rt_sem_take(&rx_sem, RT_WAITING_FOREVER);        }        if(ch == PACKET_HEADER)        {            mks_bytes_received = 1;            mks_new_data_flag = 0;                mks_rx_buffer[0] = (uint8_t)ch;         }         else         {            if(mks_bytes_received>0)            {            //mks_bytes_received++;                mks_rx_buffer[mks_bytes_received++] = (uint8_t)ch;                if(mks_bytes_received >= RECEIVE_LENGTH)                {                    mks_new_data_flag = 1;                    mks_bytes_received = 0;                    sprintf(buf,  "%d", mks_rx_buffer[65]);                    lv_label_set_text(guider_ui.screen_label_heart, buf); //更新到LVGL                    sprintf(buf,  "%d", mks_rx_buffer[66]);                    lv_label_set_text(guider_ui.screen_label_spo2, buf);//更新到LVGL                    memset(mks_rx_buffer,0, RECEIVE_LENGTH);                    mks_new_data_flag = 0;                }            }        }    }}staticintuart_sample(int argc, char *argv[]){    rt_err_t ret = RT_EOK;    struct  serial_configurecfg;  // 配置结构体    char uart_name[RT_NAME_MAX];    char str[] = "hello RT-Thread!\r\n";    if (argc == 2)    {        rt_strncpy(uart_name, argv[1], RT_NAME_MAX);    }    else    {        rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);    }    /* 查找系统中的串口设备 */    serial = rt_device_find(uart_name);    if (!serial)    {        rt_kprintf("find %s failed!\n", uart_name);        return RT_ERROR;    }    cfg.baud_rate = BAUD_RATE_38400;    // 目标波特率(可改为 38400、19200 等)    cfg.data_bits = DATA_BITS_8;  // 8 数据位    cfg.stop_bits = STOP_BITS_1;  // 1 停止位    cfg.parity    = PARITY_NONE;  // 无校验    cfg.bit_order = BIT_ORDER_LSB;    // 低位优先(默认)    cfg.invert    = NRZ_NORMAL;    cfg.bufsz     = RT_SERIAL_RB_BUFSZ;    cfg.flowcontrol = RT_SERIAL_FLOWCONTROL_NONE;    cfg.reserved    = 0;    rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &cfg);    /* 初始化信号量 */    rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);    /* 以中断接收及轮询发送模式打开串口设备 */    rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);    /* 设置接收回调函数 */    rt_device_set_rx_indicate(serial, uart_input);    /* 发送字符串 */    rt_device_write(serial, 0, str, (sizeof(str) - 1));    /* 创建 serial 线程 */    rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);    /* 创建成功则启动线程 */    if (thread != RT_NULL)    {        rt_thread_startup(thread);    }    else    {        ret = RT_ERROR;    }    return ret;}intmks_cmd(int argc, char *argv[]){    rt_err_t ret = RT_EOK;    uint8_t send_data = 0;  // 要发送的字节数据    // 第一步:检查串口设备是否已初始化(首次使用时查找并打开)    if (serial == RT_NULL)    {        // 查找串口设备        serial = rt_device_find(SAMPLE_UART_NAME);        if (serial == RT_NULL)        {            rt_kprintf("错误:未找到串口设备 %s!\n", SAMPLE_UART_NAME);            return RT_ERROR;        }        // 打开串口(RT_DEVICE_OFLAG_RDWR:读写模式)        if (rt_device_open(serial, RT_DEVICE_OFLAG_RDWR) != RT_EOK)        {            rt_kprintf("错误:打开串口设备 %s 失败!\n", SAMPLE_UART_NAME);            serial = RT_NULL;  // 打开失败,重置句柄            return RT_ERROR;        }    }    // 第二步:解析命令参数    if (argc == 2)  // 仅支持 "mks start" 或 "mks stop"(2个参数)    {        // 比较第二个参数(argv[1])        if (strcmp(argv[1], "start") == 0)        {            send_data = 0x8A;  // start 对应发送 0x8A            rt_kprintf("执行 mks start,发送数据:0x%02X\n", send_data);        }        elseif (strcmp(argv[1], "stop") == 0)        {            send_data = 0x88;  // stop 对应发送 0x88            rt_kprintf("执行 mks stop,发送数据:0x%02X\n", send_data);        }        else        {            // 无效参数:提示正确用法            rt_kprintf("错误:无效命令参数!\n");            rt_kprintf("正确用法:\n");            rt_kprintf("  mks start  - 发送 0x8A\n");            rt_kprintf("  mks stop   - 发送 0x88\n");            return -RT_EINVAL;        }        // 第三步:通过串口发送数据(发送1个字节)        ret = rt_device_write(serial, 0, &send_data, 1);        if (ret != 1)  // rt_device_write 返回实际发送的字节数,成功应为 1        {            rt_kprintf("错误:串口发送失败!返回值:%d\n", ret);            return -RT_ERROR;        }    }    else    {        // 参数个数错误:提示正确用法        rt_kprintf("错误:命令格式错误!\n");        rt_kprintf("正确用法:\n");        rt_kprintf("  mks start  - 发送 0x8A\n");        rt_kprintf("  mks stop   - 发送 0x88\n");        return -RT_EINVAL;    }    return ret;}// 3. 导出命令到 FinSH 终端(支持在终端直接输入 mks 命令)MSH_CMD_EXPORT(mks_cmd, mks command: mks start/stop);/* 导出到 msh 命令列表中 */MSH_CMD_EXPORT(uart_sample, uart device sample);

接收传感器并实现解码,并实时将接收到的数据通过LVGL显示到界面中。

5 工程效果

6 演示视频及代码

演示视频链接:https://www.bilibili.com/video/BV1WgUoBXE2n/?pop_share=1&vd_source=e1bd226340c8b87027d5dcfc6b0c3344

源代码:https://club.rt-thread.org/file_download/a6fe3781d8bcf12d

非常感谢RTT论坛,通过这次参赛让我进一步的体会到了RT-Thread开源操作系统的强大。

RT-Thread Github 开源仓库,欢迎撒个星(Star)支持,更期待你的代码贡献: https://github.com/RT-Thread/rt-thread

添加小师弟微信↓,拉你进RT-Thread技术交流群,找到组织!

图片

图片

图片

想要在RT-Thread平台或社区投放内容?

或想参与相关直播活动及赛事?

RT-Thread已开放对接窗口,

请通过邮件与我们取得联系,期待合作!

合作邮箱: tongfangyi@rt-thread.com 

点击“阅读原文”

MM32F5270(STAR-MC1内核)适配RT-Thread 概述2022年4月,灵动微电子发布了搭载安谋科技“星辰”STAR-MC1处理器的全新高性能 MM32F5 微控制器系列。该系列在内核、总线和外设配置等多个方面进行了创新,内核上更是首次搭载了 Armv8-M 架构的 “星辰” STAR-MC1 处理器。很高兴通过ARM中国拿到该芯片的开发板(可以搞事情)MM32F5270 是一款搭载了安谋科技 STAR-MC1 内核的 MCU 产品,其工作频率可达... 阅读详情

相关推荐

基于GD32F527I-EVAL开发的多功能智能门禁控制系统_嵌入式开发_智能家居_物联网_多媒体交互_远程监控_门禁管理_图像采集_语音识别_RFID识别_网络通信_嵌入式系统开.zip

基于GD32F527I-EVAL开发的多功能智能门禁控制系统_嵌入式开发_智能家居_物联网_多媒体交互_远程监控_门禁管理_图像采集_语音识别_RFID识别_网络通信_嵌入式系统开.zip

在GD32F527I-EVAL 上运行RT-Thread Nano多线程

本文主要介绍在 GD32F527I-EVAL 评估板上移植 RT-Thread Nano 。笔者还编写一个具体的例程,验证RT-Thread的工作状态。笔者使用的开发板为GD32F527I-EVAL,该板卡集成包括扩展引脚在内的及 SWD, Reset, Boot, User button key, LED, CAN, I2C, I2S, USART, RTC, LCD, SPI, ADC, DAC, EXMC, CTC, SDIO, DCI, ENET, USBFS, USBHS, GD-Link 等外设

mftang的博客 1865

基于gd32f527的can数据监视回显工具

基于gd32f527的can数据监视回显工具

GD32F527I 定时器产生PWM的方法介绍

本文主要介绍GD32微控制器的PWM功能及其使用方法。GD32的PWM功能非常强大且灵活,是其定时器外设的核心功能之一。PWM 的全称是脉冲宽度调制,它是一种通过数字方式来模拟模拟信号的技术。其核心是通过改变一个周期固定的方波信号的占空比,来改变输出信号的平均电压。在GD32中,PWM主要由高级定时器(TIMERx) 和通用定时器(TIMERx) 产生。最常用的是通用定时器,如TIMER0, TIMER1, TIMER2等。

mftang的博客 1337

ur3手眼标定+realsenseL515

知乎 csdn

AI_future的博客 976

UCOS-III 系统移植

UCOSIII系统移植到GD32F303详细过程 工程代码:https://github.com/jslaobing/techIot_ucosiii_porting

TechIoT - 探索物联网与嵌入式系统 2086

【GD32F527_EVAL】USB 驱动移植 和 USB CDC Device 接入PC实验

【摘要】本文记录GD32F527开发板USB驱动移植过程,重点介绍USB CDC设备接入PC的实现。硬件上需注意USB-FS的48MHz时钟配置和PD13电源脚跳线;软件方面梳理了GD官方USB库结构(包含底层驱动、设备核心和类驱动)及RT-Thread已移植/未移植的驱动列表。通过四层架构(应用层-RT框架-适配层-硬件层)完成驱动移植,提供标准流程:从工具链配置、官方库确认到RT框架适配,最终实现USB虚拟串口功能。调试建议使用rt_kprintf输出,并需特别注意USB-FS与串口的硬件跳线冲突问题。

jomoly的博客 1123

避开模板匹配的坑:OpenCVSharp中边缘梯度算法的优化实践

本文深入探讨了OpenCVSharp中边缘梯度算法在模板匹配中的优化实践,解决了传统方法在尺度变化、角度旋转和光照差异下的局限性。通过Sobel算子提取边缘梯度特征,结合轮廓检测和多尺度匹配策略,显著提升了匹配的鲁棒性和准确性。文章还分享了并行计算、内存访问优化等实战技巧,适用于工业检测和自动化识别场景。

http9protocoller的博客 196

【MM32F5270开发板试用】快速移植STM32应用到MM32F5270(以OLED为例)

本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:@#@

weixin_47569031的博客 994

23、资产分散化与有效前沿:投资组合优化的核心策略

本文深入探讨了现代投资组合理论的核心概念,包括分散投资的重要性、均值-方差优化框架以及有效前沿的构建与应用。通过案例分析和数学模型,阐述了如何通过科学方法降低投资组合风险并实现最优风险收益权衡。文章还介绍了实际应用中的求解方法与决策流程,为投资者提供系统的投资组合优化指导。

cc789的博客 114

DRV8711驱动器的各寄存器的介绍

drv8711驱动器

PCLintelligence的博客 1634

GD32F527 在rtthread中的ADC驱动解决方案

GD32F527-EVAL在RT-Thread下ADC驱动问题的解决方案:当使用env工具配置ADC外设时,由于RT-Thread对GD32F5系列兼容性问题会出现编译错误。解决方法是在rtconfig.h中定位SOC_SERIES_GD32F5xx宏定义,并在drv_adc.c文件中将该定义添加到GD32F4系列判断分支中,复用相似的ADC初始化函数。修改完成后可正常通过scons生成工程。该方案参考了GD32原厂代码,也可查看RT-Thread论坛相关PR#10826获取替代方案。(149字)

qq_58877484的博客 272

在 ABAP 平台上搭建 OAuth 2.0 Server:架构、流程、权限与落地实战

摘要:本文为SAP ABAP开发人员提供将ABAP平台配置为OAuth 2.0授权服务器的实战指南。重点介绍两种授权流程(授权码和SAML Bearer)的实现方案,包括核心事务配置(SOAUTH2/SAML2)、授权对象(S_SCOPE)管理以及端点交互规范。通过具体配置清单和三类典型集成场景(第三方Web应用访问OData、企业集成平台调用、BTP应用对接)的落地示例,帮助读者快速构建安全的OAuth 2.0服务架构。文档强调SSL/TLS基础安全、scope最小授权原则以及授权与令牌端点的标准交互模式

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 307

GD32 f527 bootload 跳转到APP失败原因分析

在进行GD系列f527升级程序开发时候,因为之前调试过f470的跳转代码,使用直接使用了470的AIP程序到527芯片,但是跳转失败,排查了许多问题,都没有效果;

B_J_yang的博客 65

光学传播仿真软件:ASAP_(1).ASAP软件介绍与安装

ASAP(Advanced System for Analysis and Propagation)是一款强大的光学传播仿真软件,广泛应用于光学系统的设计、分析和优化。它提供了丰富的建模工具和仿真功能,可以帮助用户从简单的光学元件到复杂的光学系统进行仿真。:支持光学、机械、热学等多物理场的联合仿真。:采用高精度的算法,确保仿真结果的准确性。:内置了大量的光学元件,如透镜、反射镜、棱镜、光栅等。:提供直观的用户界面,支持多种建模和仿真方式。:支持使用脚本语言进行二次开发,增强软件的定制能力。

kkchenjj的博客 1590

基于Jeecgboot3.9.0的flowable7.2.0流程增加一个OA请假单功能例子(二)

基于Jeecgboot3.9.0的flowable7.2.0流程增加一个OA请假单功能例子(二)

宁波阿成的博客 198

GD32F527微控制器特性深度分析与研究

随着工业物联网、安全嵌入式系统和高性能控制应用的快速发展,对微控制器的算力、存储容量、信息安全及外设集成度提出了更高要求。GD32F527是兆易创新(GigaDevice)推出的基于Arm Cortex-M33内核的高性能微控制器,最高主频200 MHz,集成了大容量Flash与SRAM、硬件加密加速单元、安全启动机制以及丰富的外设接口。本文从内核架构、存储配置、安全与功能安全特性、外设接口、封装与工作条件等方面对GD32F527进行了系统性分析,并与GD32F4xx系列进行了对比研究。

mftang的博客 490

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【MM32F5270开发板试用】二、GPIO的操作~点灯

第二步:添加rt-thread的pin功能的驱动,添加rtt的驱动这点在上一节我似乎忘记说了,串口记得添加serial哈。这里 MM32F5_PIN中第一个参数是PINx_xx对应的号,0,1,2,3…第四步:在rtconfig.h文件中使能PIN的功能,“RT_USING_PIN”第一步:初始化引脚对应的时钟,如果不太考虑功耗的话,像我一样,全给他时钟打开了。大似乎跟我说过不太推荐pin脚的那个框架了,但我觉得那玩意还行,挺好的。这篇文章让我们说说rt-thread上pin脚的使用,虽然我记得。...

weixin_47569031的博客 373

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【MM32F5270开发板试用】开发环境搭建

本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:心梦

weixin_47569031的博客 437

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

快速LVGL移植(以GD32为例)

快速LVGL移植(以GD32为例)

wallwayj的博客 3196

RT-Thread GD32303C-START开发板BSP说明

GD32303C-START是-兆易创新推出的一款GD32F30X系列的评估板,最高主频高达120M,该开发板具有丰富的板载资源,可以充分发挥 GD32303C的芯片性能。开发板外观如下图所示:该开发板常用板载资源如下:GD32305R,主频 120MHz,1024KB FLASH ,96KB RAM常用外设LED :3个,LED1 (PB14),LED2(PB15),LED3 (电源指示灯)按键:2个,K1(用户按键,PA0),K2(复位引脚)常用接口:USB 接口。

华为奋斗者精神 600

立创梁山派GD32F470ZGT6--LVGL移植

GD32F4的LVGL移植

qq_51930953的博客 4456

基于STM32单片机的心率血氧监测系统设计

本项目是一个完整的嵌入式医疗监测系统解决方案,包含硬件设计、软件开发和移动端应用开发。系统采用STM32单片机作为核心控制器,通过传感器采集人体心率和血氧数据,并通过无线通信模块将数据传输至手机APP进行实时显示和记录。

Made In SQL 1468

RT-Thread——国产RTOS标杆

大概是2014年9月,接过主管交接的项目,项目以STM32F103ZET6硬件平台,而运行的实时系统(RTOS)正是RT-Thread(RTT)。也是从此时开始接触到RTT,国人自己写的开源系统,从此对其也是“爱不释手”,在往后的工作中,一直在使用,特别是在后来换了份工作,在新东家里用RTT开发了几款产品,也给自己也带来了财富和才华。比较惭愧的是,在RTT伴随着自己职业生涯的几年里,...

只要思想不滑坡,想法总比问题多。 7万+
上一篇: 开源向实,生产力如何进化:RT-Thread睿赛德二十周年的岁月回响与未来启航
下一篇: RT-Thread首款低功耗AI产品预售: Edgi Talk
RT-Thread物联网操作系统
博客等级 码龄6年 2万+粉丝 392原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值