- 2025-04-07
-
发表了主题帖:
LVGL 图形库求助
使用LVGL8.3.3 ,使用了编码器;
问题:按键的时候能打印 LV_KEY_ENTER ;但是不会触发事件, 进入encoder_key_handler打印,求助大佬指点
lv_group_t * g_encoder_group; // 焦点组
extern lv_indev_t * indev_encoder;
static void encoder_key_handler(lv_event_t *e) {
lv_event_code_t code = lv_event_get_code(e);
lv_key_t key = lv_indev_get_key(lv_indev_get_act());
printf("event code=%d, key=%d \r\n", (int)code, (int) key);
uint32_t key1 = *(uint32_t*)lv_event_get_param(e);
printf("Event key1: %d\n", key1);
lv_indev_t *indev = lv_indev_get_act();
printf("Input device type: %d\n", indev->driver->type);
}
void setup_scr_screen111(lv_ui *ui){
// 创建焦点组
g_encoder_group = lv_group_create();
lv_indev_set_group(indev_encoder, g_encoder_group); // 编码器绑定到焦点组
// 将对象加入焦点组(例如容器和按钮)
lv_group_add_obj(g_encoder_group, ui->screen_btn_CC);
lv_group_add_obj(g_encoder_group, ui->screen_btn_CV);
lv_obj_add_flag(ui->screen_btn_CC, LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_flag(ui->screen_btn_CV, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_style_bg_color(ui->screen_btn_CC, lv_color_hex(0x007ACC), LV_PART_MAIN | LV_STATE_FOCUSED); // 按钮聚焦样式
lv_obj_set_style_bg_color(ui->screen_btn_CV, lv_color_hex(0x007ACC), LV_PART_MAIN | LV_STATE_FOCUSED);
// 绑定事件到容器和按钮
lv_obj_add_event_cb(ui->screen_btn_CC, encoder_key_handler, LV_EVENT_KEY, NULL);
lv_obj_add_event_cb(ui->screen_btn_CV, encoder_key_handler, LV_EVENT_KEY, NULL);
lv_group_focus_obj(ui->screen_btn_CC); // 手动设置焦点
printf("%d",lv_obj_has_state(ui->screen_btn_CC, LV_STATE_FOCUSED));
}
static void encoder_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
data->enc_diff = encoder_diff;
data->state = encoder_state;
if((key_steady == 0) &&(encoder_click == 1)){
encoder_click = 0;
data->state = LV_INDEV_STATE_PRESSED; // 中键按下为0
data->key = LV_KEY_ENTER ;
printf("LV_KEY_ENTER \r\n");
}
else if((key_steady == 1) &&(encoder_click == 0)){
encoder_click = 1;
data->state = LV_INDEV_STATE_RELEASED; // 没有键被按下
data->key = LV_KEY_ESC; // 默认返回 ESC 键(可选)
printf("LV_KEY_ESC \r\n");
}
// 2. 处理旋转(仅在无按键操作时生效)
else if (encoder_diff != 0) {
data->enc_diff = encoder_diff;
data->key = (encoder_diff > 0) ? LV_KEY_RIGHT : LV_KEY_LEFT;
data->state = LV_INDEV_STATE_RELEASED;
printf("encoder_read state=%d, key = %d\r\n", data->state, data->key);
}
encoder_diff = 0; // 清零旋转差值
}
- 2025-03-14
-
回复了主题帖:
STM32H743 利用定时器DMA触发SPI发送和 接收数据,发现接收的数据,前面5个都不变化
damiaa 发表于 2025-3-14 09:38
变量访问前最好初始化一下。
不太理解,初始化只是给到了一个固定值,如果我不需要初始化值的话,应该意义也不大吧。
另外刚刚测试了一下,这个0X240049AC 这个地址的变量,如果我在程序里面 去写了自加一 的变量操作,是能正常动的
-
回复了主题帖:
STM32H743 利用定时器DMA触发SPI发送和 接收数据,发现接收的数据,前面5个都不变化
damiaa 发表于 2025-3-13 20:10
是不是数组越界了?
1,对调一下这两个数组的定义位置。这样也许就DAMRxBuf变化,SPI1DMARxB ...
嗯,我试过,如果把下面那个变量,放在上面,就是说 0X240049AC这个地址的变量名就是SPI1DMARxBuf 了, 那这个变量的前5个地址也不会变化。
而且,变量我申请了32个,我设置搬移的长度是14个,都不至于会溢出越界。
另外一个就是,如果我在定义的时候,初始化为0,其地址就变化了, 赋值也就都正常了
- 2025-03-13
-
发表了主题帖:
STM32H743 利用定时器DMA触发SPI发送和 接收数据,发现接收的数据,前面5个都不变化
STM32H743 利用定时器DMA触发SPI发送和 接收数据,发现接收的前面5个都不变化,
SPI的芯片是一个ADC芯片,触发后,直接可以从MISO上获取到数据。
初始化程序,CH2 是 RX, CH4是TX,定义了两个buf
现象就是,我使用0X240049AC这个地址的变量,前面5个数据,就不会变化,只会变化后面的。
而我如果使用 SPI1DMARxBuf ,地址是 0X24004A2C ,则发现,数据读写就正常。
优化等级,设置的是LEVEL 0, ICACHE 和 DCHACHE 都是enable的;
对于这个现象,百思不得其解,求助大佬指点