你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32的GUI库使用

[复制链接]
STMCU小助手 发布时间:2022-1-20 20:51
1. 实验平台使用百为的STM32F103开发板
2. 例程目录\百为stm32开发板光盘\stm32_gui_lib\Project\Embedded_GUI_Example\EWARM
3. 直接编译遇到一个问题
  1. Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp unsigned int __iar_builtin_REV16(unsigned int)" 9 ?7 B+ I' p/ r9 f% K7 w
  2. (declared at line 197 of "D:\IAR Systems\ E:\MCU\STM32\百为stm32开发板光盘\stm32_gui_lib\Libraries\CMSIS\CM3\CoreSupport\core_cm3.h 1124
复制代码

) S  K; z+ T' b* C2 @  Z
4. 解决办法如下,勾选Use CMSIS
- ^+ Z' ]" T& a/ L8 z! h- ^8 ^
1300009-20180105215814659-1282136341.jpg
+ ?: k8 ]- P6 @. O$ r( E6 D* N
5. 去掉 $PROJ_DIR$\..\..\..\Libraries\CMSIS\CM3\CoreSupport,编译通过。

) k- o) d6 t* T. l3 P% |2 e
1300009-20180105215934815-115611197.jpg

" e- S( M4 i% @
6. 打开工程,分为GUI_HAL和底层有关的,GUI_Library是上层的鼠标,文字,图像等处理,其实看起来蛮简单的。 JoyHal.c是处理板子上面的一个方向按键, 

# w% E) q& C% m, ^: H
1300009-20180105220651284-411192902.jpg
2 ~$ [6 Q( ]6 x9 L# r) F
7. 看下主函数
  1. int main(void)" z; C, @* c; p4 ]7 x# L
  2. {
    4 M% s$ m( N% `2 U
  3.   RCC_ClocksTypeDef RCC_Clocks;
      Z, [9 @* o/ t" V3 }

  4. 7 {* f% K6 b2 Z& C' K0 a
  5.   /* Set the Vector Table base location at 0x08000000 */
    0 f4 y! I* \& L7 Z* A
  6.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
    & L, j; ~8 O* x* s" P% z
  7.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);' x+ }8 p1 H; D! Q0 \# X9 m+ a
  8. ; s: L0 T* @; D' Z# y2 q( P% W' H4 r
  9.   /* Setup SysTick Timer for 10 msec interrupts  */1 }* `6 T5 N# K8 `
  10.   RCC_GetClocksFreq(&RCC_Clocks);- W' k( R7 @# U7 A$ n2 h$ N
  11.   if (SysTick_Config(RCC_Clocks.SYSCLK_Frequency / 100))
    & r  A7 D0 O+ e+ y
  12.   {
    - j3 V  M& ]0 u, T
  13.     /* Capture error */
    : i8 z7 N7 z% x% g* H& O- y- L
  14.     while (1);8 r1 V3 y" q+ v' v* c! r
  15.   }
    . U9 r- v3 v6 I
  16.   /* configure Systick priority */
    1 p; r9 t) E' t# |" R$ Z
  17.   NVIC_SetPriority(SysTick_IRQn, 0x0B);' U1 n$ }# T0 h1 K
  18. ' W2 G2 z- Q7 Z
  19.   /* Set HW structure parameters */
    & L+ k/ H1 V, W1 J( y4 F9 Z
  20.   HWConfig_SetHardwareParams();# ~" J" m, }3 I

  21. ( n+ q( [9 i' V" a/ Y6 v" ~" M" j* K
  22. * d& f3 B. ~% G4 |4 }6 O
  23.   /* If the LCD Panel has a resolution of 320x240 this command is not needed, it's set by default */& u6 {# c8 U- ^9 f
  24.   /* Set_LCD_Resolution( 320, 240 ); */8 ~' j: l$ v, W

  25. . w/ Y6 O" @- P
  26.   /* Initialize the LCD */
    & q1 E; o) [9 n, ~# k- H
  27.   GL_LCD_Init();& J/ Q+ Z6 G. p1 H1 h

  28. & G9 P- h, i( p# K0 A6 w- m& m
  29.   GL_Clear(GL_White);# D% ?5 V" D0 P3 Y
  30. 4 M! A/ @5 g; Q
  31.   InputInterface_Init();
    / I4 t2 M8 v6 X

  32. + o" {7 {  t# I- |  ]6 U3 O
  33.   ShowLoadingLogo();; Q/ Z% m2 r1 B$ ?- E
  34. 3 P, V$ T4 R+ b. d$ L
  35. #if TOUCH_SCREEN_CAPABILITY
    + D, w: W$ q6 [2 X5 F
  36.   /* Check if Calibration has been done*/# j. [! C% d$ o, L
  37.   TS_CheckCalibration();
    ; `2 x% P1 ?2 @: H4 R, K
  38. #endif
    6 E/ i, L1 Q, L  e, F! f
  39. , j* X, s- \: P
  40.   /*Initialize cursor*/3 E, H7 ^8 M$ Y# e- H- W& ]- o* H
  41.   GL_Clear(White);
    ) M. d% X' @( f+ E
  42.   CursorInit(GL_NULL);
    5 z6 k  L7 u" `' s( Y- @/ B
  43. 6 o+ L9 m8 z' M
  44.   /* Menu Initialisation*/
    # X5 x( N& x9 p/ N4 q4 v6 n  h
  45.   Show_HomeScreen();
    9 I  b2 k6 |( o' e0 @; v1 b
  46.   CursorShow(195, 80);
    % W, A* j- K" x- s8 O( l1 A

  47. 1 n+ v! z, ]5 d) f' u) e
  48.   /* Infinite main loop ------------------------------------------------------*/* e- t% `3 Q$ J5 T; I4 Y
  49.   while (1)
    / I( s. M) w! R# V
  50.   {
    6 n/ W! x7 b) Q

  51. * |5 t3 _7 W  I
  52. #if defined(USE_STM3210C_EVAL) || defined(USE_STM32100E_EVAL)) t5 m) X! r2 z& d4 c- Z
  53.     /* Catching touch events */3 l* |' c* Y! B, T# {; {
  54.     if ( TS_IsCalibrationDone() == SET )( f" H$ k. V8 A4 S
  55. #endif5 y+ s6 Y& x5 P* y
  56.     {
    + x  ^" ~# q/ t% T4 C- ~1 t# a
  57.       ProcessInputData();/ R/ J* k7 A4 E6 d9 H. _1 D
  58.     }5 T0 G% c* J6 o# M% _0 P
  59. - T  L. k% f1 z9 D
  60.     /* Time out calculate for power saving mode */
    0 D& P9 P+ G! ~" |+ r. O; A* I
  61.     TimeOutCalculate();5 R! f% J  z: e( ^  L1 E
  62. 9 x1 E$ D4 k( Y2 O8 S4 x! y
  63.     CatchInputEvents();
    " [/ ?! [9 ]3 g3 G: \
  64.   }8 i; ]0 {! C2 u8 j8 J
  65. }
复制代码

% a2 Z+ \& Z# q& r, j: E( ?
8. 方向按键的原理图,程序对应的就是JoyHal.c,joystick翻译成中文就是操纵杆。
/ _/ R) P; ~* \. \% h! w3 n
1300009-20180105223113237-105517816.jpg
9 A" h, i9 ]* |$ R4 w/ J2 C! Y
9. 看下实际效果,主要用操纵杆移动鼠标,不知道为啥触摸屏没用。可能是板子跳线帽不对。看了一下cursor.c这个文件,里面只有读操纵杆的函数,估计触摸屏本来就没用。

- W4 I/ _5 d7 k8 S
1300009-20180106120137893-1231867203.jpg

1 o" D, T( ^# t# G
10. LCD接口是FSMC接口,FSMC本来是存储器的接口,也可以用来驱动LCD。
+ u" d  q7 V5 J9 U
1300009-20180106120434534-1900730831.jpg

! V! u3 p: C& N" I$ ~, |- B2 K8 t
11. LCD引脚配置
  1. void LCD_CtrlLinesConfig(void)
    1 o7 b: |; G! e- T- n
  2. {7 ?7 z% b: }0 w9 x) o
  3.   GPIO_InitTypeDef GPIO_InitStructure;' W0 \% i" w: T. o$ P5 X' q& |
  4.   /* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
    * Q3 C8 G7 H) Z( _' N! B/ K0 [
  5.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);5 J; N2 H4 D; e. U/ @; w) ^5 S
  6.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
    ( H) e) A  p% O, h
  7.                          RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |; S  r3 X& h$ C2 j; ?' g
  8.                          RCC_APB2Periph_AFIO, ENABLE);
    " M6 r0 f. V$ _
  9.   /* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),
    + b* W, ~& B4 l/ r
  10.      PD.10(D15), PD.14(D0), PD.15(D1) as alternate function push pull */
    , f+ L8 a/ R5 W8 }: O& b% b9 K
  11.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |& s6 y/ E& {% F% L( F* P
  12.                                 GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |3 B0 f/ q9 F' b6 w) y
  13.                                 GPIO_Pin_15;
      d8 L0 j1 T, ^  L7 X1 r
  14.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 n* ~8 s, s" G2 m
  15.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    1 F0 T7 A6 x% P/ e) b
  16.   GPIO_Init(GPIOD, &GPIO_InitStructure);
    & s+ H; y* ]9 O; s* J
  17.   /* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
    ) _( q  B. R& \" F! {$ V
  18.      PE.14(D11), PE.15(D12) as alternate function push pull */
    1 `1 e# ]& U! L
  19.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
    # s* O* \' B& W. d
  20.                                 GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
    0 M0 _6 Z5 m1 R# ], z* {
  21.                                 GPIO_Pin_15;
    $ b% S; ~  r! I- ?9 `9 I/ D4 J
  22.   GPIO_Init(GPIOE, &GPIO_InitStructure);
    ' r) X5 q: g2 u* r# r% W
  23.   /* Set PF.00(A0 (RS)) as alternate function push pull */( m8 e" h& {! v4 D
  24.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    / v9 z5 i) y4 S0 {1 Y7 P# o/ {  H
  25.   GPIO_Init(GPIOF, &GPIO_InitStructure);. ]3 J) Y( Q, l7 U6 F
  26.   /* Set PG.12(NE4 (LCD/CS)) as alternate function push pull - CE3(LCD /CS) */1 L5 Z8 L6 X5 X( r
  27.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    7 O! f% \6 Y) w
  28.   GPIO_Init(GPIOG, &GPIO_InitStructure);! V* e! x% J2 k" o
  29. }
复制代码

$ W4 [/ ^; I# z4 r3 V9 ?8 @
12. FSMC配置
  1. void LCD_FSMCConfig(void)+ ?% i: E# n5 j2 ]
  2. {6 m" i! G/ m, P4 R" a) F* G
  3.   FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
    / X5 n& H. k0 e
  4.   FSMC_NORSRAMTimingInitTypeDef  p;8 k  k$ }! N3 ^/ n; U
  5. /*-- FSMC Configuration ------------------------------------------------------*/
    3 _. \% h6 H/ c; m
  6. /*----------------------- SRAM Bank 4 ----------------------------------------*/
    - ^/ d2 m  Z5 _8 B' K' D$ L
  7.   /* FSMC_Bank1_NORSRAM4 configuration */' B( m* e" G+ |/ M) w7 V, T& G
  8.   p.FSMC_AddressSetupTime = 1;
      E7 F. w/ N$ `( i( \( o
  9.   p.FSMC_AddressHoldTime = 0;
    8 s! _1 D& B! n# K" Q/ w
  10.   p.FSMC_DataSetupTime = 2;
    2 {3 g  D% }0 b# ^: _6 b$ w: i
  11.   p.FSMC_BusTurnAroundDuration = 0;
    9 r5 Q0 \6 v: s: {9 d* \8 O
  12.   p.FSMC_CLKDivision = 0;. _" s0 Q6 s) {- `& W
  13.   p.FSMC_DataLatency = 0;
    * f+ O. Y0 K- _$ f4 [1 r+ t- {# @
  14.   p.FSMC_AccessMode = FSMC_AccessMode_A;
    & K( O% {$ G+ X, @; w! |" n+ u, {
  15.   /* Color LCD configuration ------------------------------------# S9 x7 \2 m4 q9 f3 B
  16.      LCD configured as follow:
    3 {/ r6 o" g5 o& y
  17.         - Data/Address MUX = Disable0 N9 R2 W) {  B; r  t. K; V
  18.         - Memory Type = SRAM) t2 a9 A  ]2 n$ X) `4 M
  19.         - Data Width = 16bit& h% h% x3 G/ z, S; }# _; i
  20.         - Write Operation = Enable( ^' D" h: a) K, k; z
  21.         - Extended Mode = Enable
      y0 D" ]: m) T' z' _) ~3 V" L
  22.         - Asynchronous Wait = Disable */
    & E2 I1 s. [7 P" K, M' ?
  23.   FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;; x9 U7 M" J+ W& N
  24.   FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
    9 }1 Q& V& O/ N6 W) l  ?
  25.   FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;0 {1 B! t2 k% t! Z- a2 f
  26.   FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
    , |+ x6 s% W; d7 i  B  ]! P
  27.   FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
    3 ]' V4 B5 m- b/ J
  28.   FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
    " e/ e% s6 Y  p- C
  29.   FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    ) j- o. m. R0 D
  30.   FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
    . @# {; b1 G9 w7 }! z
  31.   FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;5 ~/ K. }  a. }& r  \4 |
  32.   FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;* m' y# f8 J1 _" |' X( o
  33.   FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
      q& x* _, w* j/ }  _, f0 r
  34.   FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
    . l3 F* f' e) x/ ~2 C5 N) _* e
  35.   FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
    . `4 l$ ~& L' B. [( `$ J% P9 ^
  36.   FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;7 U7 l/ y' j/ S
  37.   FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;: Z3 K& i( ]% t
  38.   FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
    8 P. r+ W" j& K$ {' W6 x# ~7 P
  39.   /* BANK 4 (of NOR/SRAM Bank 1~4) is enabled */6 N* O3 [6 V8 ~+ q: @% @
  40.   FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);4 d0 J" ?' W2 @/ c# J. ~$ d
  41. }
复制代码

/ E0 I0 a6 i3 I1 N- N
13. 画按钮的函数
  1. void GL_DrawButtonBMP(uint16_t maxX, uint16_t minX, uint16_t maxY, uint16_t minY, uint8_t* ptrBitmap)
    5 h) h" Z2 r" l  [. K( V; N
  2. {, [" q2 |5 H# f: U" M9 D$ ~1 Z. e
  3.   GL_SetDisplayWindow(maxY, maxX, maxY - minY, maxX - minX);
    ( h' S1 N) |9 l, \. i" x
  4.   GL_DrawBMP(ptrBitmap);3 _* B- R: }1 \' |3 b. {
  5.   GL_SetDisplayWindow(LCD_Height - 1, LCD_Width - 1, LCD_Height, LCD_Width);( j$ a1 c0 r5 d0 E5 x2 V2 H3 f9 B
  6. }
复制代码
4 u: o' d# z0 c+ u0 }
14. 总结起来,这个库其实功能简单,用起来也不复杂的。

0 n! j. c* _7 S; Y0 ?; p# ~* {
赞 收藏 评论0 发布时间:2022-1-20 20:51

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版