RP2350-LCD-1.28 是一款Waveshare设计的高性能的微控制器开发板,其在较小的板型情况下,板载了1.28inch LCD、锂电池充电芯片、六轴传感器(三轴加速度与三轴陀螺仪)等外设,并且引出了所有的GPIO与Debug接口,方便用户开发,并嵌入应用到产品中。
LCD参数 | |||
控制芯片 | GC9A01A | 分辨率 | 240(H)RGB x 240(V) |
通信接口 | SPI | 显示尺寸 | Φ32.4mm |
显示面板 | IPS | 像素大小 | 0.135(H)x0.135(V)mm |
IMU参数 | |||
传感器名称 | QMI8658 | ||
加速度计特性 | 分辨率:16 位 量程 (可选):±2、±4、±8、±16g | ||
陀螺仪特性 | 分辨率:16 位 量程 (可选):±16、±32、±64、±128、±256、±512、 ±1024、±2048°/sec |
为了方便在电脑上使用MicroPython开发Pico/Pico2板,建议下载Thonny IDE
【MicroPython】machine.Pin类函数详解
【MicroPython】machine.PWM类函数详解
【MicroPython】machine.ADC类函数详解
【MicroPython】machine.UART类函数详解
【MicroPython】machine.I2C类函数详解
【MicroPython】machine.SPI类函数详解
【MicroPython】rp2.StateMachine类函数详解
对于 C/C++,建议使用 Pico VS Code 进行开发,这是一款 Microsoft Visual Studio Code 扩展,旨在让您在为 Raspberry Pi Pico 系列开发板创建、开发和调试项目时更加轻松。无论您是初学者还是经验丰富的专业人士,此工具都可以帮助您自信而轻松地进行 Pico 开发。下面我们介绍如何安装该扩展并使用。
Cmake Path: ${HOME}/.pico-sdk/cmake/v3.28.6/bin/cmake.exe Git Path: ${HOME}/.pico-sdk/git/cmd/git.exe Ninja Path: ${HOME}/.pico-sdk/ninja/v1.12.1/ninja.exe Python3 Path: ${HOME}/.pico-sdk/python/3.12.1/python.exe
set(PICO_BOARD pico CACHE STRING "Board type")
https://github.com/earlephilhower/arduino-pico/releases/download/4.0.2/package_rp2040_index.json
注意:如果您已经有ESP32板URL,您可以使用逗号分隔 URL,如下所示:
https://dl.espressif.com/dl/package_esp32_index.json,https://github.com/earlephilhower/arduino-pico/releases/download/4.0.2/package_rp2040_index.json
C:\Users\[username]\AppData\Local\Arduino15\packages
注意:将里面用户名:[username]替换成自己的用户名
MircoPython视频例程(github)
MicroPython固件/Blink例程(C)
树莓派官方C/C++示例程序 (github)
树莓派官方micropython示例程序 (github)
Arduino官方C/C++示例程序 (github)
本例显示的效果为两个可以通过触摸屏滑动或六轴传感器抬动切换的界面。
本例用于测试 LVGL 控件交互、样式美化等, LVGL 的具体开发请参考LVGL开发文档。
mkdir build
cd build export PICO_SDK_PATH=../../pico-sdk
注意:pico-sdk 的路径需要按照实际情况进行调整
cmake ..
make
等待编译好后将生成的 .uf2 格式的文件复制到pico中即可。
void LVGL_Init(void);
// LVGL static lv_disp_draw_buf_t disp_buf; //LVGL显示缓冲区 static lv_color_t buf0[DISP_HOR_RES * DISP_VER_RES/2];//LVGL颜色数据缓冲区0 static lv_color_t buf1[DISP_HOR_RES * DISP_VER_RES/2];//LVGL颜色数据缓冲区1 static lv_disp_drv_t disp_drv; //LVGL显示驱动 static lv_indev_drv_t indev_en; //LVGL六轴传感器模拟编码器输入设备驱动 static lv_group_t *group; //编码器控件组
// 初始化LVGL核心 lv_init(); // 初始化LVGL显示缓冲区结构体变量disp_buf lv_disp_draw_buf_init(&disp_buf, buf0, buf1, DISP_HOR_RES * DISP_VER_RES / 2); lv_disp_drv_init(&disp_drv); disp_drv.flush_cb = disp_flush_cb; disp_drv.draw_buf = &disp_buf; disp_drv.hor_res = DISP_HOR_RES; disp_drv.ver_res = DISP_VER_RES; lv_disp_t *disp= lv_disp_drv_register(&disp_drv); // 初始化编码器输入设备 lv_indev_drv_init(&indev_en); indev_en.type = LV_INDEV_TYPE_ENCODER; indev_en.read_cb = encoder_read_cb; lv_indev_t * encoder_indev = lv_indev_drv_register(&indev_en); group = lv_group_create(); lv_indev_set_group(encoder_indev, group);//将编码器控制设备添加控件组
add_repeating_timer_ms(5, repeating_lvgl_timer_callback, NULL, &lvgl_timer);//每5ms调用一次定时器回调函数 static bool repeating_lvgl_timer_callback(struct repeating_timer *t) { lv_tick_inc(5); return true; } int main() { ... while(1) { lv_task_handler(); DEV_Delay_ms(5); } }
void disp_flush( lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p ) 参数: lv_disp_drv_t *disp_drv: 显示驱动结构体指针,包含了与显示相关的信息和函数指针。该参数常用于通知刷新完成 const lv_area_t *area : 区域结构体指针,包含待刷新区域的位置信息。在本例中,用于创建 TFT 显示的窗口 lv_color_t *color_p : 颜色结构体指针,表示要在刷新区域内显示的颜色数据。在本例中,作为DMA输入读取地址将数据传输到SPI总线,完成图像的绘制
#define LV_COLOR_16_SWAP 1
#define LV_DISP_DEF_REFR_PERIOD 10 /*[ms]*/
static void disp_flush_cb(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { LCD_1IN28_SetWindows(area->x1, area->y1, area->x2 , area->y2);//设置图像的显示区域 dma_channel_configure(dma_tx, &c, &spi_get_hw(LCD_SPI_PORT)->dr, //SPI总线的输出数据寄存器地址 color_p, //待刷新的颜色数据数组地址 ((area->x2 + 1 - area-> x1)*(area->y2 + 1 - area -> y1))*2, true //设置完毕后立刻进行传输 ); }
static void dma_handler(void) { if (dma_channel_get_irq0_status(dma_tx)) { dma_channel_acknowledge_irq0(dma_tx); lv_disp_flush_ready(&disp_drv); } }
static void encoder_read_cb(lv_indev_drv_t * drv, lv_indev_data_t*data); 参数: lv_indev_drv_t *indev_drv: LVGL 中的输入设备驱动结构体指针。在本例中,该结构体为六轴传感器模拟的编码器输入设备驱动 lv_indev_data_t *data : LVGL 中的输入设备数据结构体指针。在本例中,该结构体用于存储输入设备的状态和数据,包括当前的切换事件(上抬或下抬)以及确定事件(右抬)
#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/
static bool repeating_imu_diff_timer_callback(struct repeating_timer *t);//每隔50ms更新一次输入事件 { get_diff_data();//多次采样识别输入事件更新全局变量encoder_diff和encoder_act return true; } static void encoder_read_cb(lv_indev_drv_t * drv, lv_indev_data_t*data) { data->enc_diff = encoder_diff; data->state = encoder_act; }
void Widgets_Init(void);
lv_obj_t *btn = lv_btn_create(lv_scr_act()); //创建一个控件,其中lv_scr_act层为该按键的父对象,可以替换为list、title等可以有子对象的控件
lv_obj_align(btn, LV_ALIGN_CENTER, -50 , 50);//将btn控件定位在中心点向左偏移50个像素,向下偏移50个像素的位置
static lv_style_t style_base; lv_style_init(&style_base); //初始化风格 lv_style_set_bg_color(&style_base, lv_palette_main(LV_PALETTE_LIGHT_GREEN)); //设置背景颜色 lv_style_set_border_color(&style_base, lv_palette_darken(LV_PALETTE_LIGHT_GREEN, 3));//设置边界的颜色 lv_style_set_border_width(&style_base, 2); //设置编辑的宽度 lv_style_set_radius(&style_base, 10); //设置倒角的尺寸 lv_style_set_shadow_width(&style_base, 10); //设置阴影的宽度 lv_obj_add_style(btn,&style_base,0); //设置btn主题的风格,0可以替换为位置和状态
lv_group_add_obj(group, btn);//将btn控件添加到控件组group中
周一-周五(9:30-6:30)周六(9:30-5:30)
手机:13434470212
邮箱:services04@spotpear.cn
QQ:202004841