|
LVGL应用的一大亮点就是极大简化了MCU存储和处理图片数据的难度,有专门一个结构体叫lv_image_dsc_t负责记录保存图片的RAW数据、长宽参数、占用空间和颜色格式,并且有专门的在线和离线工具负责生成lv_image_dsc_t,LVGL应用调用img或者img_btn控件时,直接指定lv_image_dsc_t结构体对象即可完成图像的填充,非常方便,本帖就使用MPU6050模块读取XY方向倾角数据,实现一个简单有趣的图片动画,并实现一个图片按钮(img_btn),按下和抬起分别显示两张图片。- y( _3 I7 B% A0 \ MPU6050模块接在另一组模拟I2C接口上(PD11和PD12),与之前的BME680模块错开: #define FAKE_I2C_SCL_PD11_GPIO_PORT GPIOD6 i/ S; y2 ~ m2 V) d% z' K/ u' t* i #define FAKE_I2C_SCL_PD11_GPIO_PIN GPIO_PIN_11' U5 H# W9 h7 S: N, _ #define FAKE_I2C_SCL_PD11_GPIO_CLK_ENABLE __HAL_RCC_GPIOD_CLK_ENABLE(); / V! O5 o+ r4 |+ 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);9 }) V s. Q. L% ~ #define FAKE_I2C_SCL_PD11_L HAL_GPIO_WritePin(FAKE_I2C_SCL_PD11_GPIO_PORT , FAKE_I2C_SCL_PD11_GPIO_PIN , GPIO_PIN_RESET);" e7 c z6 B) `5 a' J4 B$ U" ~2 T8 W : n2 n$ x) Z _ #define FAKE_I2C_SDA_PD12_GPIO_PORT GPIOD #define FAKE_I2C_SDA_PD12_GPIO_PIN GPIO_PIN_12 #define FAKE_I2C_SDA_PD12_GPIO_CLK_ENABLE __HAL_RCC_GPIOD_CLK_ENABLE(); ) n. O V" X" b; I$ \: N$ @ ) |! [+ v) x' |, i0 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); #define FAKE_I2C_SDA_PD12_L HAL_GPIO_WritePin(FAKE_I2C_SDA_PD12_GPIO_PORT , FAKE_I2C_SDA_PD12_GPIO_PIN , GPIO_PIN_RESET); & V4 h2 p1 X2 ~( ?; t; Z #define IIC_READ_SDA_PD12 HAL_GPIO_ReadPin(FAKE_I2C_SDA_PD12_GPIO_PORT , FAKE_I2C_SDA_PD12_GPIO_PIN) 具体模拟I2C读写方式和BME680模块基本一致,只修改MPU6050初始化函数和倾角数据读写函数即可:: d7 b0 e% `7 P6 Y: E" h8 B 1 j2 i7 t7 o) K7 W/ S uint8_t MPU6050_Init() {& O. q* L3 C" N% r0 {: { uint8_t data;5 f* S: K/ O. j2 @# ^3 ~" r& g3 Q" r uint8_t mpu9250_id; ; ]5 O0 d" J! N data = 0x07;& R1 i6 n5 f0 S. P MPU_Write_Reg(MPU6050_ADDR , MPU_SAMPLE_RATE_REG , data); data = MPU_Read_Reg(MPU6050_ADDR , MPU_SAMPLE_RATE_REG);9 A* n* E" g& ? printf("MPU_SAMPLE_RATE_REG = 0x%x.\n" , data); 1 m d {, f4 A6 F/ D data = 0x01;( |2 u( c) e5 h/ f7 Y3 R MPU_Write_Reg(MPU6050_ADDR , MPU_PWR_MGMT1_REG , data);8 z+ B* b" V& r/ A" e2 h1 D6 Y data = MPU_Read_Reg(MPU6050_ADDR , MPU_PWR_MGMT1_REG); printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data); + }: f2 t) o4 ?# H1 O% w r5 X2 \ data = 0; MPU_Write_Reg(MPU6050_ADDR , MPU_CFG_REG , data); data = MPU_Read_Reg(MPU6050_ADDR , MPU_CFG_REG);: D. P* X0 f- x8 b; [ printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data); data = 0x18; MPU_Write_Reg(MPU6050_ADDR , MPU_GYRO_CFG_REG , data);5 S' h E, g6 ]' b data = MPU_Read_Reg(MPU6050_ADDR , MPU_GYRO_CFG_REG);2 ^" y( X9 U- \) v0 _4 A3 x# h5 x( y printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data); ) I, x* o; g% h4 c0 U) v 6 L; z8 k1 R( b( p data = 0x01;* I7 |. E5 ^/ f, U$ H MPU_Write_Reg(MPU6050_ADDR , MPU_INT_EN_REG , data);% m- t% L3 Q( m; K data = MPU_Read_Reg(MPU6050_ADDR , MPU_INT_EN_REG);+ `8 ^& h) ^% m- z8 E0 a. t printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data); data = 0; MPU_Write_Reg(MPU6050_ADDR , MPU_PWR_MGMT2_REG , data); data = MPU_Read_Reg(MPU6050_ADDR , MPU_PWR_MGMT2_REG);: V/ `9 s! x# O, }/ O- j- e" \5 @! Y# u7 V printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);+ d: \! o/ E; Q% D 5 S1 r$ H' @' w, W3 t return mpu9250_id; }+ ~. g8 ^- l; @' q 初始化需要用作演示动画的img控件:( H; _, X. Z3 G [. B$ P, h6 K. _
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数据并修改图片位置: 0 q* m3 j7 y. @ - w8 O' ?% {0 a/ h$ s! M9 J static void my_timer1(lv_timer_t * timer)7 w$ @) }+ U1 h+ H0 {8 t$ o+ \ {6 a9 w3 {7 \) E, G& ]+ A6 c0 a 。。。( U' @* h! K0 ~2 }3 U8 u" Z* \ MPU_Read_Regs(MPU6050_ADDR , ACCEL_XOUT_H , mpu9250_read_data , 2); acc_x = mpu9250_read_data[0] << 8 | mpu9250_read_data[1];, p+ N$ S/ I0 j& p9 q2 \5 P, v MPU_Read_Regs(MPU6050_ADDR , ACCEL_YOUT_H , mpu9250_read_data + 2 , 2); acc_y = mpu9250_read_data[2] << 8 | mpu9250_read_data[3];3 B! p, a# V ~$ M# y printf("acc_x = %d acc_y = %d %d.\n" , acc_x , acc_y);. Y, ^0 L2 Y- E; a# A9 F; Z 5 ?$ i4 ~% e) N7 W* T; u2 k acc_x = - acc_x; 9 [5 y% O4 F% R# r. }9 q \ acc_x_index = acc_x / 100;8 M" [' M. O* u, ^8 X if(acc_x_index <= -80) acc_x_index = -80; else if(acc_x_index >= 80)( M: }6 i$ a; }/ w2 c8 p acc_x_index = 80; 0 G6 B- Z- ~- c( A$ d9 C acc_y_index = acc_y / 80;) q* @) I! A- z* d: h1 K) }2 }" G if(acc_y_index <= -195)7 I6 ~ N' i" K acc_y_index = -195; else if(acc_y_index >= 195) acc_y_index = 195; lv_obj_align(img_anim , LV_ALIGN_CENTER , acc_x_index , acc_y_index); 。。。 }3 A, T, S9 V- W* O , i: \5 l1 f: Z 然后是添加img_btn在第四页(tile_4)并设置按下和释放的图像数据:( n! O8 r- D9 U
imgbtn_st = lv_imagebutton_create(tile_4); lv_imagebutton_set_src(imgbtn_st , LV_IMAGEBUTTON_STATE_RELEASED , NULL , &img_st_poster1 , NULL);* g- h s, D! e- I n! ~# X! ? lv_imagebutton_set_src(imgbtn_st , LV_IMAGEBUTTON_STATE_PRESSED , NULL , &img_st_poster2 , NULL); lv_obj_align(imgbtn_st , LV_ALIGN_TOP_LEFT , 0 , 0);/ d0 O& D: o, i7 L& T3 U" |9 d4 m ! D8 H+ q/ U4 q* x, J* d9 h4 q 演示效果:) u6 c S/ U' x |
STM32L562DK探索板——串口通讯测试成功
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
M24LR-discovery测试小结
STM32L562DK探索板——串口通讯的再测试
STM32L562DK探索板——串口通讯的测试
STM32L562DK探索板——运动传感器测试
STM32L562DK探索板——继续深入了解Audio Play的工作流程
STM32L562DK探索板——触摸菜单实验之触摸测试
STM32L562DK探索板——触摸菜单实验之LED闪烁
微信公众号
手机版