本帖最后由 尹小舟 于 2024-3-30 11:16 编辑
实验目的
我们通过GUI-Guider 使用按键控件 控制板子上的RGB
硬件电路
使用GUI-Guider 搭建界面
1 创建新项目
2 选择v8.3.5
3 选择模拟器
4 选择个空的模版
5. 选择面板类型
选择320*240
6. 搭建界面
7 添加事件
在事件中可以控制其他控件,我们添加3个按键控制显示旁边的提示器
9 生成C代码
10 导出Zephyr 代码
MCU 代码实现
聆思MCU 使用的是Zephyr RTOS ,它本身就就集成了LVGL ,将代码直接复制过去就好了
1 , 要在prj.conf 加入GPIO和SPI LCD 的内容
CONFIG_GPIO=y
CONFIG_GPIO_CSK6_CH32V003=y
CONFIG_SPI=y
CONFIG_ST7789V=y
CONFIG_I2C=y
CONFIG_KSCAN=y
CONFIG_KSCAN_FT5336=y
CONFIG_KSCAN_FT5336_INTERRUPT=y
CONFIG_LV_Z_DISPLAY_DEV_NAME="ST7789V"
CONFIG_LV_Z_HOR_RES_MAX=320
CONFIG_LV_Z_VER_RES_MAX=480
CONFIG_LV_Z_POINTER_KSCAN=y
CONFIG_LV_Z_POINTER_KSCAN_DEV_NAME="FT5336"
2 在events_init.c中添加RGB 控制代码
#include "events_init.h"
#include <stdio.h>
#include "lvgl.h"
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
#define RGB_R_NODE DT_ALIAS(led_rgb_red)
#define RGB_G_NODE DT_ALIAS(led_rgb_green)
#define RGB_B_NODE DT_ALIAS(led_rgb_blue)
static const struct gpio_dt_spec rgb_r = GPIO_DT_SPEC_GET(RGB_R_NODE, gpios);
static const struct gpio_dt_spec rgb_g = GPIO_DT_SPEC_GET(RGB_G_NODE, gpios);
static const struct gpio_dt_spec rgb_b = GPIO_DT_SPEC_GET(RGB_B_NODE, gpios);
int ret;
//rgb_b
static void screen_btn_1_event_handler (lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
switch (code) {
case LV_EVENT_CLICKED:
{
lv_obj_add_flag(guider_ui.screen_led_3, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(guider_ui.screen_led_2, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(guider_ui.screen_led_1, LV_OBJ_FLAG_HIDDEN);
gpio_pin_set_dt(&rgb_r,GPIO_ACTIVE_HIGH);
gpio_pin_set_dt(&rgb_g,GPIO_ACTIVE_HIGH);
gpio_pin_set_dt(&rgb_b,GPIO_ACTIVE_LOW );
break;
}
default:
break;
}
}
//rgb_g
static void screen_btn_2_event_handler (lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
switch (code) {
case LV_EVENT_CLICKED:
{
lv_obj_add_flag(guider_ui.screen_led_3, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(guider_ui.screen_led_2, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(guider_ui.screen_led_1, LV_OBJ_FLAG_HIDDEN);
gpio_pin_set_dt(&rgb_r,GPIO_ACTIVE_HIGH);
gpio_pin_set_dt(&rgb_b,GPIO_ACTIVE_HIGH );
gpio_pin_set_dt(&rgb_g,GPIO_ACTIVE_LOW);
break;
}
default:
break;
}
}
//rgb_
static void screen_btn_3_event_handler (lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
switch (code) {
case LV_EVENT_CLICKED:
{
lv_obj_clear_flag(guider_ui.screen_led_3, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(guider_ui.screen_led_2, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(guider_ui.screen_led_1, LV_OBJ_FLAG_HIDDEN);
gpio_pin_set_dt(&rgb_g,GPIO_ACTIVE_HIGH);
gpio_pin_set_dt(&rgb_b,GPIO_ACTIVE_HIGH );
gpio_pin_set_dt(&rgb_r,GPIO_ACTIVE_LOW);
break;
}
default:
break;
}
}
void events_init_screen(lv_ui *ui)
{
lv_obj_add_event_cb(ui->screen_btn_1, screen_btn_1_event_handler, LV_EVENT_ALL, NULL);
lv_obj_add_event_cb(ui->screen_btn_2, screen_btn_2_event_handler, LV_EVENT_ALL, NULL);
lv_obj_add_event_cb(ui->screen_btn_3, screen_btn_3_event_handler, LV_EVENT_ALL, NULL);
}
void events_init(lv_ui *ui)
{
gpio_is_ready_dt(&rgb_r);
gpio_is_ready_dt(&rgb_b);
gpio_is_ready_dt(&rgb_g);
gpio_pin_configure_dt(&rgb_r, GPIO_OUTPUT_ACTIVE);
gpio_pin_configure_dt(&rgb_g, GPIO_OUTPUT_ACTIVE);
gpio_pin_configure_dt(&rgb_b, GPIO_OUTPUT_ACTIVE);
gpio_pin_set_dt(&rgb_r,GPIO_ACTIVE_HIGH);
gpio_pin_set_dt(&rgb_g,GPIO_ACTIVE_HIGH);
gpio_pin_set_dt(&rgb_b,GPIO_ACTIVE_LOW );
}
通过GPIO_DT_SPEC_GET获取GPIO 在设备树的配置
就可以使用gpio_pin_set_dt函数驱动GPIO了
编译下载
在工程目录下打开控制台 可以使用如下命令下载编译
编译 lisa zep build -b csk6_duomotai_devkit -p
下载 lisa zep flash -r pyocd --frequency 20000000
|