|
LVGL应用的一大亮点就是极大简化了MCU存储和处理图片数据的难度,有专门一个结构体叫lv_image_dsc_t负责记录保存图片的RAW数据、长宽参数、占用空间和颜色格式,并且有专门的在线和离线工具负责生成lv_image_dsc_t,LVGL应用调用img或者img_btn控件时,直接指定lv_image_dsc_t结构体对象即可完成图像的填充,非常方便,本帖就使用MPU6050模块读取XY方向倾角数据,实现一个简单有趣的图片动画,并实现一个图片按钮(img_btn),按下和抬起分别显示两张图片。$ L3 o& q+ W- R5 ~2 X# g MPU6050模块接在另一组模拟I2C接口上(PD11和PD12),与之前的BME680模块错开:& d4 C. M0 R6 R, W8 a' J #define FAKE_I2C_SCL_PD11_GPIO_PORT GPIOD& M5 H6 l- ?- D: ~ N #define FAKE_I2C_SCL_PD11_GPIO_PIN GPIO_PIN_11) `7 g; R, g; x" W #define FAKE_I2C_SCL_PD11_GPIO_CLK_ENABLE __HAL_RCC_GPIOD_CLK_ENABLE(); ! f% S/ |! \. b4 Q C$ @4 `' O% {6 ?6 ?% l8 {) Q #define FAKE_I2C_SCL_PD11_H HAL_GPIO_WritePin(FAKE_I2C_SCL_PD11_GPIO_PORT , FAKE_I2C_SCL_PD11_GPIO_PIN , GPIO_PIN_SET);* y! R: u+ E# g2 x' l6 A #define FAKE_I2C_SCL_PD11_L HAL_GPIO_WritePin(FAKE_I2C_SCL_PD11_GPIO_PORT , FAKE_I2C_SCL_PD11_GPIO_PIN , GPIO_PIN_RESET); / A* M: b1 b/ z 9 _% C. d# E( Z2 u* n/ e #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();+ r" B% D5 `3 m( _5 e7 T( v! @ " G, {# N' A) Z 3 l$ y: U% n9 F0 s6 f) Q #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);# w$ y( `0 u* f 9 G5 z" T5 u" F/ Z7 l8 C7 @6 ^/ ` 3 E$ ]$ W) o1 K$ j. \, S #define IIC_READ_SDA_PD12 HAL_GPIO_ReadPin(FAKE_I2C_SDA_PD12_GPIO_PORT , FAKE_I2C_SDA_PD12_GPIO_PIN)3 T7 K# C f) z3 z O6 E8 A$ {! f# x 具体模拟I2C读写方式和BME680模块基本一致,只修改MPU6050初始化函数和倾角数据读写函数即可:+ ?) P9 z# S7 v! {$ g 1 i0 P( v$ R* ?5 h) G uint8_t MPU6050_Init()* b3 z6 ?4 j+ G7 I# B& x" x5 o5 } { uint8_t data; uint8_t mpu9250_id; data = 0x07; F. T7 `0 g L MPU_Write_Reg(MPU6050_ADDR , MPU_SAMPLE_RATE_REG , data); data = MPU_Read_Reg(MPU6050_ADDR , MPU_SAMPLE_RATE_REG); printf("MPU_SAMPLE_RATE_REG = 0x%x.\n" , data); 9 S& j! \9 G- w$ ]) M & {: u4 t8 U* t/ E: X# e7 C) A, I data = 0x01; MPU_Write_Reg(MPU6050_ADDR , MPU_PWR_MGMT1_REG , data);4 y8 v3 a+ k; H+ y( \# @0 u data = MPU_Read_Reg(MPU6050_ADDR , MPU_PWR_MGMT1_REG);) d1 I/ d0 H, W7 R* R* s printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data); % `+ o* H" c1 v data = 0; MPU_Write_Reg(MPU6050_ADDR , MPU_CFG_REG , data);- _0 o' a% y/ G' A data = MPU_Read_Reg(MPU6050_ADDR , MPU_CFG_REG); printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data); data = 0x18;' A* H1 x2 G, F7 e$ J 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); # F$ C S" s+ b 5 i# B! ?1 s: E5 X. [6 B2 E, z8 v 8 f9 S' G; [, ^5 r, {5 c data = 0x01;& P/ f% J! J7 {0 J7 z. o MPU_Write_Reg(MPU6050_ADDR , MPU_INT_EN_REG , data); data = MPU_Read_Reg(MPU6050_ADDR , MPU_INT_EN_REG);0 V6 n+ v8 @+ Y) l. {! r \ printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data); * m3 `& V. z) W: A. i [/ }5 i' Q data = 0;- \6 \5 Z4 Q o MPU_Write_Reg(MPU6050_ADDR , MPU_PWR_MGMT2_REG , data);, H" }6 o+ W- ? O( Z data = MPU_Read_Reg(MPU6050_ADDR , MPU_PWR_MGMT2_REG);0 U7 |/ {, i7 z; c/ V1 x; f9 _! m. j printf("MPU_PWR_MGMT1_REG = 0x%x.\n" , data);* C0 q5 L# y. o3 S" m, D 8 H/ W9 _6 T( X8 c# h4 m return mpu9250_id; } " `7 H4 l$ k) D- B 0 U0 I6 |2 m+ x! d 初始化需要用作演示动画的img控件:4 T3 `' H: e5 K# [& L2 P" h
0 ^6 A, c5 B! r& X- D0 Y. Y# C 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);2 m( ^1 l! Q9 {9 j, G' Q: j 4 ?2 F, i4 o5 W" F& L 读取MPU6050数据并修改图片位置:. R( A6 \ o; U2 o: m 8 u% y2 M. B& W2 k static void my_timer1(lv_timer_t * timer) {( J, X: B1 {5 C1 | 。。。+ d4 v. q- } o$ h7 C; F3 i MPU_Read_Regs(MPU6050_ADDR , ACCEL_XOUT_H , mpu9250_read_data , 2);5 y W) z; H% c$ B0 }- v acc_x = mpu9250_read_data[0] << 8 | mpu9250_read_data[1];3 z6 J' U# m: R% _ MPU_Read_Regs(MPU6050_ADDR , ACCEL_YOUT_H , mpu9250_read_data + 2 , 2); acc_y = mpu9250_read_data[2] << 8 | mpu9250_read_data[3]; printf("acc_x = %d acc_y = %d %d.\n" , acc_x , acc_y);- \# b' g7 W" T0 N; F( e% P 6 K+ t* {9 u0 C$ W! k acc_x = - acc_x;* [' D" Y: @$ I; j acc_x_index = acc_x / 100; if(acc_x_index <= -80) acc_x_index = -80;' h# F2 |" I; z: y6 K( P else if(acc_x_index >= 80) acc_x_index = 80; / S5 ]9 ?* C8 R9 A9 |$ Q+ d; R' ^ acc_y_index = acc_y / 80; if(acc_y_index <= -195)* W |9 ~3 d" n" E0 S acc_y_index = -195;) M" `0 T! j+ Y else if(acc_y_index >= 195) acc_y_index = 195;# q0 x. s7 }: E+ Y lv_obj_align(img_anim , LV_ALIGN_CENTER , acc_x_index , acc_y_index);( @8 B4 }0 \' ~! |% a 。。。 } " y1 T6 W1 K# _5 O- ` 6 r1 e5 M3 Y# }. d: r q! j 然后是添加img_btn在第四页(tile_4)并设置按下和释放的图像数据:
imgbtn_st = lv_imagebutton_create(tile_4);) k; m6 [1 _/ [ v' l) t+ P' u lv_imagebutton_set_src(imgbtn_st , LV_IMAGEBUTTON_STATE_RELEASED , NULL , &img_st_poster1 , NULL); lv_imagebutton_set_src(imgbtn_st , LV_IMAGEBUTTON_STATE_PRESSED , NULL , &img_st_poster2 , NULL);. J/ d% P, B4 n8 ]6 A lv_obj_align(imgbtn_st , LV_ALIGN_TOP_LEFT , 0 , 0); % z+ M1 r9 ~8 E3 G9 ` 演示效果:" c4 j& z7 F: y& r 5 S7 |- N+ _! [6 {9 p* L, U |
STM32C542RC开发板的串口DMA发送及接收实验
终于完成了STM32C542RC开发板的串口发送实验
STM32C542RC开发板的按键控制LED闪烁实验
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
《STM32CubeMX2 实战课程》学习笔记--课程1:STM32CubeMX2安装
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
STM32L562DK探索板——串口通讯测试成功
【STM32H735G-DK测评】lvgl移植
微信公众号
手机版