|
LVGL应用的一大亮点就是极大简化了MCU存储和处理图片数据的难度,有专门一个结构体叫lv_image_dsc_t负责记录保存图片的RAW数据、长宽参数、占用空间和颜色格式,并且有专门的在线和离线工具负责生成lv_image_dsc_t,LVGL应用调用img或者img_btn控件时,直接指定lv_image_dsc_t结构体对象即可完成图像的填充,非常方便,本帖就使用MPU6050模块读取XY方向倾角数据,实现一个简单有趣的图片动画,并实现一个图片按钮(img_btn),按下和抬起分别显示两张图片。: O6 n! }/ X8 `# M" Z# K* R MPU6050模块接在另一组模拟I2C接口上(PD11和PD12),与之前的BME680模块错开: #define FAKE_I2C_SCL_PD11_GPIO_PORT GPIOD #define FAKE_I2C_SCL_PD11_GPIO_PIN GPIO_PIN_116 b2 v( a4 M) n% f #define FAKE_I2C_SCL_PD11_GPIO_CLK_ENABLE __HAL_RCC_GPIOD_CLK_ENABLE();2 t9 `( z$ P9 w/ d, H: e7 w E " E3 r7 c' K: s #define FAKE_I2C_SCL_PD11_H HAL_GPIO_WritePin(FAKE_I2C_SCL_PD11_GPIO_PORT , FAKE_I2C_SCL_PD11_GPIO_PIN , GPIO_PIN_SET); #define FAKE_I2C_SCL_PD11_L HAL_GPIO_WritePin(FAKE_I2C_SCL_PD11_GPIO_PORT , FAKE_I2C_SCL_PD11_GPIO_PIN , GPIO_PIN_RESET); #define FAKE_I2C_SDA_PD12_GPIO_PORT GPIOD #define FAKE_I2C_SDA_PD12_GPIO_PIN GPIO_PIN_12+ V1 } l: f: M6 G# _* l2 Z #define FAKE_I2C_SDA_PD12_GPIO_CLK_ENABLE __HAL_RCC_GPIOD_CLK_ENABLE();8 k# }4 H8 g% C% F; a" O7 A6 K #define FAKE_I2C_SDA_PD12_H HAL_GPIO_WritePin(FAKE_I2C_SDA_PD12_GPIO_PORT , FAKE_I2C_SDA_PD12_GPIO_PIN , GPIO_PIN_SET);- h9 j* v8 @9 e6 G" H5 O" c8 C #define FAKE_I2C_SDA_PD12_L HAL_GPIO_WritePin(FAKE_I2C_SDA_PD12_GPIO_PORT , FAKE_I2C_SDA_PD12_GPIO_PIN , GPIO_PIN_RESET);8 [. o% I3 V% e 4 [* n: \% n: T& b! Q3 T O2 F' t5 {8 X8 @" s #define IIC_READ_SDA_PD12 HAL_GPIO_ReadPin(FAKE_I2C_SDA_PD12_GPIO_PORT , FAKE_I2C_SDA_PD12_GPIO_PIN), U9 ]3 Y" \0 ^/ H* L7 a( W. A6 x0 Z 7 Y4 ~ ~3 y3 _) s4 z 具体模拟I2C读写方式和BME680模块基本一致,只修改MPU6050初始化函数和倾角数据读写函数即可:+ m5 V. h% Y" V6 L& ^ L2 d uint8_t MPU6050_Init() { uint8_t data;4 N8 l. u) L( s5 ?$ z" X. R uint8_t mpu9250_id;& t4 F$ L% y' g' x' j% l data = 0x07;1 \% e' \9 D: q% _# E9 i MPU_Write_Reg(MPU6050_ADDR , MPU_SAMPLE_RATE_REG , data);- h0 q$ s8 ^1 e- P. H) J+ N data = MPU_Read_Reg(MPU6050_ADDR , MPU_SAMPLE_RATE_REG); printf("MPU_SAMPLE_RATE_REG = 0x%x.\n" , data); + r6 V( v. a0 m ; Q# i0 X. i" h& o5 ^' Z- } data = 0x01;# |4 w; w/ H9 l# [* M4 Q1 h. W MPU_Write_Reg(MPU6050_ADDR , MPU_PWR_MGMT1_REG , data); data = MPU_Read_Reg(MPU6050_ADDR , MPU_PWR_MGMT1_REG);8 B& F g! X( S9 ] printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data); * `; O& H$ b% ^) k data = 0; MPU_Write_Reg(MPU6050_ADDR , MPU_CFG_REG , data);! n3 W/ ?) i5 T data = MPU_Read_Reg(MPU6050_ADDR , MPU_CFG_REG); printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data); 8 M6 y5 [6 Y- e8 g1 Q# Z. n# a" ` / ?% g2 @. ^# o) U data = 0x18;" u7 g$ N( [0 B' l MPU_Write_Reg(MPU6050_ADDR , MPU_GYRO_CFG_REG , data); data = MPU_Read_Reg(MPU6050_ADDR , MPU_GYRO_CFG_REG); printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data); $ u8 Q, s7 r, h7 ?9 f ( e1 \" q; i6 G; ~/ Q/ G4 Q data = 0x01; MPU_Write_Reg(MPU6050_ADDR , MPU_INT_EN_REG , data); data = MPU_Read_Reg(MPU6050_ADDR , MPU_INT_EN_REG);# c) ` [* t2 P$ r0 b- A printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data); data = 0; K+ X Y' [. S* E( g1 p z2 r MPU_Write_Reg(MPU6050_ADDR , MPU_PWR_MGMT2_REG , data);- B# A+ o3 Y9 @7 f: ] data = MPU_Read_Reg(MPU6050_ADDR , MPU_PWR_MGMT2_REG);7 H% s B- j5 c$ C- S' b/ u1 _0 T3 G printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);% ^# [! Q+ h2 Q/ v( Q5 h' {' e0 M( T return mpu9250_id;' ] Y2 N9 U/ e" W } 初始化需要用作演示动画的img控件:/ G3 y3 H; B6 [# C) u
; R7 }( p% W" X9 I! } img_anim = lv_image_create(tile_3); lv_image_set_src(img_anim , &img_st_logo); lv_obj_align(img_anim , LV_ALIGN_TOP_LEFT , 100 , 100); 读取MPU6050数据并修改图片位置: / q, P+ s- _( E1 M static void my_timer1(lv_timer_t * timer) { 。。。) Q) q9 V5 |/ ^) w' R# A MPU_Read_Regs(MPU6050_ADDR , ACCEL_XOUT_H , mpu9250_read_data , 2);7 a$ L) m( [6 F4 [ acc_x = mpu9250_read_data[0] << 8 | mpu9250_read_data[1];" R7 r/ w2 R0 _6 ~+ D, P MPU_Read_Regs(MPU6050_ADDR , ACCEL_YOUT_H , mpu9250_read_data + 2 , 2);7 k- u6 @/ E; ` acc_y = mpu9250_read_data[2] << 8 | mpu9250_read_data[3];( O7 Q" j+ F. l3 P: I$ V4 n4 `5 w printf("acc_x = %d acc_y = %d %d.\n" , acc_x , acc_y); , c- o# U, c% p acc_x = - acc_x; - j( s, h. G# P3 Y acc_x_index = acc_x / 100;! g7 @, |$ z& t! f if(acc_x_index <= -80)8 j3 j, n9 o- O$ _* K, r. [ acc_x_index = -80;9 P" [/ f# j: C* N else if(acc_x_index >= 80) acc_x_index = 80; acc_y_index = acc_y / 80; if(acc_y_index <= -195)( [# _1 B1 r1 z- k, W% D acc_y_index = -195;9 [ B# ~( [5 E9 s7 Q4 e else if(acc_y_index >= 195)2 X- G/ h7 _7 A8 D acc_y_index = 195; 0 D& d) _. [3 q% v ^" A' i lv_obj_align(img_anim , LV_ALIGN_CENTER , acc_x_index , acc_y_index); 。。。 } % ?0 m6 f; b: T7 ~$ x, N: D" |; m 然后是添加img_btn在第四页(tile_4)并设置按下和释放的图像数据:. ]) X4 V1 L/ P5 q+ z6 H5 ?7 X
imgbtn_st = lv_imagebutton_create(tile_4);9 V1 g0 g$ I7 v2 R# ?% g lv_imagebutton_set_src(imgbtn_st , LV_IMAGEBUTTON_STATE_RELEASED , NULL , &img_st_poster1 , NULL);+ X# U9 X! U1 p0 L lv_imagebutton_set_src(imgbtn_st , LV_IMAGEBUTTON_STATE_PRESSED , NULL , &img_st_poster2 , NULL);8 R8 F) C# x" ^$ ` lv_obj_align(imgbtn_st , LV_ALIGN_TOP_LEFT , 0 , 0);) s' @" Y* s/ M; q 6 q- B8 G% d# R0 J" q 演示效果: 8 D G/ |) b* e% b' P |
STM32H743基于CubeMx5.0配置手册
STM32L562DK探索板——串口通讯测试成功
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
M24LR-discovery测试小结
STM32L562DK探索板——串口通讯的再测试
STM32L562DK探索板——串口通讯的测试
STM32L562DK探索板——运动传感器测试
STM32L562DK探索板——继续深入了解Audio Play的工作流程
STM32L562DK探索板——触摸菜单实验之触摸测试
微信公众号
手机版