|
LVGL的虚拟输入控件有button(按钮)、checkbox(复选框)、radiobox(单选框)、bar(直线拉条)和arc(弧形拉条)等,都可以通过这些输入控件的回调函数给MCU发送指令进而控制GPIO外设,而事件也有按下,抬起,按下+抬起,数值改变,状态改变等,这帖我就用arc+状态改变回调函数,实现弧形拉条控制PWM舵机的功能。1 |( m5 }& `, S/ {+ u . i# x% i3 h& W( x& Z4 | 8 t$ @* K2 S* p4 R, V' V; Q2 | 初始化TIM3为PWM输出功能,输出引脚为PC8,PC8接舵机PWM引脚:; A# u2 e, C3 v: u 9 B1 l8 j- Q$ V2 g* Y$ X TIM_HandleTypeDef g_timx_pwm_chy_handle; $ c6 B! b! N; c! U# d; A' M) z void TIM3_PWM_Init(uint16_t arr, uint16_t psc) {$ s0 J. N! R2 t8 J GPIO_InitTypeDef gpio_init_struct;* w- F# d) z, F/ u! A TIM_OC_InitTypeDef timx_oc_pwm_chy = {0}; ! k' `3 `; K! {) I" ^0 q% d# q( u __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); gpio_init_struct.Mode = GPIO_MODE_AF_PP; gpio_init_struct.Pull = GPIO_PULLUP; gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; gpio_init_struct.Alternate = GPIO_AF2_TIM3; / x* O: v0 }: B1 P gpio_init_struct.Pin = GPIO_PIN_8; K( c. D) h! b HAL_GPIO_Init(GPIOC , &gpio_init_struct); 5 z+ j. @/ [( h/ b+ j; R g_timx_pwm_chy_handle.Instance = TIM3; g_timx_pwm_chy_handle.Init.Prescaler = psc; g_timx_pwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP; g_timx_pwm_chy_handle.Init.Period = arr; HAL_TIM_PWM_Init(&g_timx_pwm_chy_handle); 3 s# J6 S8 T6 K. f: { timx_oc_pwm_chy.OCMode = TIM_OCMODE_PWM1;$ z4 q* m+ k$ F# a$ K5 S3 O timx_oc_pwm_chy.Pulse = arr / 2; 1 T e2 ?: {/ q1 w" j$ h+ R timx_oc_pwm_chy.OCPolarity = TIM_OCPOLARITY_LOW; HAL_TIM_PWM_ConfigChannel(&g_timx_pwm_chy_handle, &timx_oc_pwm_chy, TIM_CHANNEL_3); % T% Z2 r" O2 y! A) E6 G6 r" O1 ` HAL_TIM_PWM_Start(&g_timx_pwm_chy_handle, TIM_CHANNEL_3); }7 l% `" S/ [3 U- }$ v. S ( G: x7 r; C9 A+ T9 a7 F5 r( U 6 o6 S6 W! L# {2 {- T: Y 设置弧形拉条的参数和回调函数,弧形拉条位于tile_2界面即滑屏从左到右数起第二个界面的偏下方(LV_ALIGN_CENTER, 0 , 90),回调函数触发事件为拉条值改变(LV_EVENT_VALUE_CHANGED): void lv_example_tileview(void)7 J" r# a% G3 y+ v% e! u- y; M {2 s) O$ M5 q1 n6 F5 }& N 。。。/ Y& v" R2 h6 z8 r1 O' a arc_left = lv_arc_create(tile_2); lv_obj_set_size(arc_left , 200 , 200); lv_obj_align(arc_left , LV_ALIGN_CENTER, 0 , 90); lv_arc_set_value(arc_left , 66);, i5 Z) J- m2 P3 n- ]$ r lv_obj_set_style_arc_width(arc_left , 40 , LV_PART_MAIN);: A; E x. s- X9 W lv_obj_set_style_arc_width(arc_left , 40 , LV_PART_INDICATOR);) t, k. P# Y2 V$ z J lv_obj_add_event_cb(arc_left , arc_event_cb , LV_EVENT_VALUE_CHANGED, NULL);" ^5 b! h6 H. D; ?6 Q" E4 D: f! Z }) s% u2 J! ~3 { / w9 ^7 m# S! F) _9 I ' Z; B/ p- D+ ^/ w* ~ 弧形拉条回调函数:- Z* B- S; P4 @, J! V. @2 Y static void arc_event_cb(lv_event_t *e) { int32_t val;8 |- d+ N# _- J: c1 x; K& A# X lv_obj_t * target = (lv_obj_t *)lv_event_get_target(e);2 W1 h1 g. m; o& M# i lv_event_code_t code = lv_event_get_code(e);- f+ {0 U/ y! V/ C2 ~: m/ e, k$ X( ? M 2 h! R* f, I( F if(code == LV_EVENT_VALUE_CHANGED)/ C" ?2 @# n. h: o1 x5 _* V {/ v" G7 G; ~, r, l8 g6 z i val = lv_arc_get_value(target);" ~5 }5 }" ^. T: P2 h printf("%d.\n" , val);7 h1 e; \( H) F E) O& g) B TIM3->CCR3 = 10000 + 400 * val; }$ a6 S- p4 Q" K5 Y } 6 k0 ]( g% \. r! k3 k9 F8 }7 m * `# t* ]4 c3 u' c' V |* s M) S 演示效果: 然后是使用SPI3接口控制一个NRF24L01模块进行发送,代码如下:* j- k. H+ j! ? W' j; c SPI_HandleTypeDef g_spi3_handler; # J8 U0 K$ m3 p5 {, G. s0 o) L 0 n. o" ]6 z6 n' Q# F uint8_t SPI3_PC10_PC11_PC12_Read_Write_Byte(uint8_t txdata)8 o3 ]" X/ }( w {- j3 x0 D1 z' g" y6 R* O$ m uint8_t rxdata;% z4 |6 j+ ?8 A$ e0 u HAL_SPI_TransmitReceive(&g_spi3_handler , &txdata , &rxdata , 1 , 1000); return rxdata; }) |% L& p& V; A0 {7 g2 n 8 V4 a6 C+ ^1 Y2 V- ~ void SPI3_PC10_PC11_PC12_Init(void)2 l; h# z$ U/ _0 b0 f0 Y {9 w! y& t6 Y1 @3 R8 ^ GPIO_InitTypeDef GPIO_InitStruct; RCC_PeriphCLKInitTypeDef rcc_periph_clk_init; __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_SPI3_CLK_ENABLE(); $ A( y2 w) Q1 ?2 P' P % F: {" [* ]9 }- V: Q+ Q GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;4 U, [$ j" _- y8 R GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;+ X5 M Q3 O' d+ y" a+ n GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;5 m& X0 `: k5 { ; f4 u" C. l) K GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12; HAL_GPIO_Init(GPIOC , &GPIO_InitStruct); 3 j2 z/ |5 X- R // rcc_periph_clk_init.PeriphClockSelection = RCC_PERIPHCLK_SPI3; // rcc_periph_clk_init.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL; // HAL_RCCEx_PeriphCLKConfig(&rcc_periph_clk_init);2 l- n6 D7 F; c# F; y5 z4 F g_spi3_handler.Instance = SPI3; g_spi3_handler.Init.Mode = SPI_MODE_MASTER;4 e5 j+ ]2 b1 g9 Z, z g_spi3_handler.Init.Direction = SPI_DIRECTION_2LINES;0 C0 {) \; P2 [( l0 c g_spi3_handler.Init.DataSize = SPI_DATASIZE_8BIT;" J2 d4 r* D; V m) Z5 C" f g_spi3_handler.Init.CLKPolarity = SPI_POLARITY_LOW; g_spi3_handler.Init.CLKPhase = SPI_PHASE_1EDGE; g_spi3_handler.Init.NSS = SPI_NSS_SOFT;/ O( A+ B. h7 g. [: ?5 ~5 @ g_spi3_handler.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; g_spi3_handler.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; g_spi3_handler.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;% E+ [/ t0 c( m: C9 m2 A) @8 I! t g_spi3_handler.Init.FirstBit = SPI_FIRSTBIT_MSB;/ }/ \2 U1 Y" ?: {! U( b9 x: H* a g_spi3_handler.Init.TIMode = SPI_TIMODE_DISABLE; g_spi3_handler.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; g_spi3_handler.Init.CRCPolynomial = 7; HAL_SPI_Init(&g_spi3_handler); __HAL_SPI_ENABLE(&g_spi3_handler);" J y, J- r3 s8 d4 x6 k1 Y7 P SPI3_PC10_PC11_PC12_Read_Write_Byte(0xff);3 `3 g9 ~! U& ~: b6 S }9 ~9 a/ r4 R! ]6 z1 w' F void NRF24L01_GPIO_Init(void)8 V# s _+ c( M% [ {0 `9 Y$ i$ T3 _0 ^ GPIO_InitTypeDef gpio_init_struct;! q& x- A/ \- G6 G NRF24L01_CS_GPIO_CLK_ENABLE;8 ^0 W/ y E Y6 o1 f NRF24L01_CE_GPIO_CLK_ENABLE; gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;9 r9 S) }5 P& k+ Y5 ^ gpio_init_struct.Pull = GPIO_PULLUP; gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;8 ]1 i# R, o, @; A! n 8 W1 ~0 I1 u# f G( Y) q gpio_init_struct.Pin = NRF24L01_CS_GPIO_PIN;& G% g; ^& m9 P9 a) J' J HAL_GPIO_Init(NRF24L01_CS_GPIO_PORT , &gpio_init_struct); gpio_init_struct.Pin = NRF24L01_CE_GPIO_PIN; HAL_GPIO_Init(NRF24L01_CE_GPIO_PORT , &gpio_init_struct);7 B5 x+ q! l5 J* T! _ gpio_init_struct.Mode = GPIO_MODE_INPUT;$ Q2 Y8 _* \- N; y) Z' F! ]# q' g gpio_init_struct.Pin = NRF24L01_IRQ_GPIO_PIN; HAL_GPIO_Init(NRF24L01_IRQ_GPIO_PORT , &gpio_init_struct); NRF24L01_CE_LOW;& l0 D7 a9 p3 s NRF24L01_CS_HIGH; }( W* s1 Z# {8 v' q / O; H: a0 L, h& y9 K4 Q' _ uint8_t NRF24L01_Write_Buf(uint8_t reg , uint8_t *pBuf , uint8_t len) {- c# q. C3 a% q! P" Q' ? uint8_t status , u8_ctr; NRF24L01_CS_LOW; ' B8 U6 ]4 O9 H( h1 M status = SPI3_PC10_PC11_PC12_Read_Write_Byte(reg);- F( {3 _6 f- A" x- t" [, K! X for(u8_ctr = 0 ; u8_ctr < len ; u8_ctr ++): n4 m- M* ~0 b! N/ M( ^! _ SPI3_PC10_PC11_PC12_Read_Write_Byte(*pBuf++);, b1 u" Y ?; U- w NRF24L01_CS_HIGH;2 Q3 J, K" [1 R7 Z return status; , B+ P( v' v/ D# `5 l: I }! w% I0 l8 T/ q7 T) \4 S9 k # [/ Q$ @5 Q9 z2 ^ uint8_t NRF24L01_Read_Buf(uint8_t reg , uint8_t *pBuf , uint8_t len)$ }, ^& t2 R" S+ [ {/ @- u; t c( l% Q uint8_t status , u8_ctr; 8 n4 w- C9 s7 e1 ?8 F- P- \ NRF24L01_CS_LOW;& f( O0 W+ z3 \ 4 v! h9 H+ N- Z: O* r7 {- w status = SPI3_PC10_PC11_PC12_Read_Write_Byte(reg);* @' ~+ ?' v9 f1 A- t1 x for(u8_ctr = 0 ; u8_ctr < len ; u8_ctr ++) pBuf[u8_ctr] = SPI3_PC10_PC11_PC12_Read_Write_Byte(0xff);+ K9 x8 Z l& F& k( ~: m. S 4 v5 s" y2 ]: ~; ]( e* h NRF24L01_CS_HIGH; . t w2 y1 j+ V5 t0 H return status; } 4 _6 [: d# l" B u' L uint8_t NRF24L01_Write_Reg(uint8_t reg , uint8_t value) { uint8_t status; 1 a6 g' u1 j+ k/ t5 g 3 E! G# v& s. Q, c' s NRF24L01_CS_LOW; 8 o) Z9 K% A5 P& {8 T0 s* v status = SPI3_PC10_PC11_PC12_Read_Write_Byte(reg);# w! q Q0 d0 y) h. x. z0 Y SPI3_PC10_PC11_PC12_Read_Write_Byte(value); NRF24L01_CS_HIGH;& D' P) G1 M* J+ e @' z! ]( \ ! `) T; p! Z) C: Q8 H( e return(status); , q' a/ {# B3 J/ B* } }# q$ o) r( ?% d7 N5 v J- B % q# y! s# C2 D; N uint8_t NRF24L01_Read_Reg(uint8_t reg)# X; | n! l9 x, o" [ { uint8_t reg_val; ! Z% c2 N' l/ a4 O! {+ `* D% J NRF24L01_CS_LOW;8 s. B6 n" `0 J x" [9 I SPI3_PC10_PC11_PC12_Read_Write_Byte(reg); reg_val = SPI3_PC10_PC11_PC12_Read_Write_Byte(0XFF); NRF24L01_CS_HIGH; 7 a9 {+ _0 o* _7 C8 [8 N return(reg_val); } 0 G+ Q4 \8 L" G" F NRF24L01的CS脚,CE脚,IRQ脚使用普通GPIO进行控制:
#define NRF24L01_1_CS_GPIO_PORT GPIOB #define NRF24L01_1_CS_GPIO_PIN GPIO_PIN_12 #define NRF24L01_1_CS_GPIO_CLK_ENABLE rcu_periph_clock_enable(RCU_GPIOB);1 k: i- D! K, |- ~* B #define NRF24L01_1_CS_HIGH GPIO_BOP(NRF24L01_1_CS_GPIO_PORT) = NRF24L01_1_CS_GPIO_PIN;/ j. T1 S. S# ~0 e: z& h( X2 K$ t #define NRF24L01_1_CS_LOW GPIO_BC(NRF24L01_1_CS_GPIO_PORT) = NRF24L01_1_CS_GPIO_PIN; - q; ?2 z; A! q9 z, {% P/ _+ L& N #define NRF24L01_1_CE_GPIO_PORT GPIOB #define NRF24L01_1_CE_GPIO_PIN GPIO_PIN_10 #define NRF24L01_1_CE_GPIO_CLK_ENABLE rcu_periph_clock_enable(RCU_GPIOB); #define NRF24L01_1_CE_HIGH GPIO_BOP(NRF24L01_1_CE_GPIO_PORT) = NRF24L01_1_CE_GPIO_PIN; #define NRF24L01_1_CE_LOW GPIO_BC(NRF24L01_1_CE_GPIO_PORT) = NRF24L01_1_CE_GPIO_PIN;, V" V; t5 {6 O 9 Y. o9 c' h X+ t' ~$ h #define NRF24L01_1_IRQ_GPIO_PORT GPIOB8 d) N- d7 y6 l/ f# ] #define NRF24L01_1_IRQ_GPIO_PIN GPIO_PIN_114 Y/ I {/ ?4 Z #define NRF24L01_1_IRQ_GPIO_CLK_ENABLE rcu_periph_clock_enable(RCU_GPIOB); #define NRF24L01_1_IRQ_READ gpio_input_bit_get(NRF24L01_1_IRQ_GPIO_PORT , NRF24L01_1_IRQ_GPIO_PIN)0 @* L9 i y' Z3 y5 M" U \; H - b4 o( q6 m+ b$ s: t 在lv_timer定时器回调函数中进行无线发送: static void my_timer1(lv_timer_t * timer) {. u& O; i7 V: a& L6 o4 g. S7 t 。。。 nrf_buf[0] = 0xaa;- {7 f: a H ?7 m e( { B: K nrf_buf[1] = 0xbb;. t$ \9 A, ^! b& ~( t( w nrf_buf[2] = 2;/ O9 q4 T7 Y+ K8 `7 Z3 d ' C1 l) p0 {7 D/ @, o1 g& ] nrf_buf[3] = (bme680fd.temperature >> 8) & 0xff; nrf_buf[4] = bme680fd.temperature & 0xff; ! k' g! C6 l$ r# V6 {) e8 Q nrf_buf[5] = (bme680fd.pressure >> 24) & 0xff; nrf_buf[6] = (bme680fd.pressure >> 16) & 0xff; nrf_buf[7] = (bme680fd.pressure >> 8) & 0xff;) T; {# O9 Z6 h& n$ K1 B/ O nrf_buf[8] = bme680fd.pressure & 0xff; nrf_buf[9] = (bme680fd.humidity >> 24) & 0xff; nrf_buf[10] = (bme680fd.humidity >> 16) & 0xff; nrf_buf[11] = (bme680fd.humidity >> 8) & 0xff;1 P# Y- H6 I% R% p# ?6 E) T% i S7 M nrf_buf[12] = bme680fd.humidity & 0xff; nrf_buf[30] = 0xcc;/ E9 R- K) S- p- m( q' m. E nrf_buf[31] = 0**; if(NRF24L01_TxPacket(nrf_buf) == TX_OK) { 8 w+ P+ v; ~1 E$ k+ z/ k" c printf("NRF24L01_TxPacket succeed.\n"); } else$ J: J' a4 s2 k5 W { printf("NRF24L01_TxPacket failed.\n"); }2 q9 G& Y) b" u9 ^$ l 。。。 }5 E# J# d% e T 演示效果,使用另外一块MCU板接上另一个NRF24L01模块进行轮询接收:7 r, ^. D$ V; C7 w4 E 8 k; N9 \3 E$ v2 r7 k# z2 w
: C0 D5 d1 Y: C4 C( ? # f! o9 c& p2 ^+ N4 j, b$ J% G$ X+ ] % d Z$ t: T0 m5 G+ f7 p# e5 Q |
STM32H743基于CubeMx5.0配置手册
STM32L562DK探索板——串口通讯测试成功
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
M24LR-discovery测试小结
STM32L562DK探索板——串口通讯的再测试
STM32L562DK探索板——串口通讯的测试
STM32L562DK探索板——运动传感器测试
STM32L562DK探索板——继续深入了解Audio Play的工作流程
STM32L562DK探索板——触摸菜单实验之触摸测试
微信公众号
手机版