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

【安富莱STemWin教程】第40章 BUTTON-按钮控件

[复制链接]
baiyongbin2009 发布时间:2015-2-28 11:00
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第40章 BUTTON-按钮控件

    从本期教程开始讲解STemWin支持的控件。现在STemWin支持的控件类似已经非常完善了。利用好这些控件,会让设计的人机界面更加人性化。本期教程先从按钮的设计开始跟大家讲解。
    40. 1 按钮控件介绍
    40. 2 官方WIDGET_SimpleButton实例
    40. 3 官方WIDGET_PhoneButton实例
    40. 4 对话框上使用按钮控件
    40. 5 总结
40.1 按钮控件介绍
    按钮控件默认的显示效果如下:
40.1.png
    开启皮肤后显示效果如下:
40.2.png
40.1.1 按钮支持的通知代码
    以下事件是按钮控件作为WM_NOTIFY_PARENT消息的一部分发送给其父窗口的:
消息
描述
WM_NOTIFICATION_CLICKED
按钮已被点击。
WM_NOTIFICATION_RELEASED
按钮已被释放。
WM_NOTIFICATION_MOVED_OUT
按钮已被点击,且指针已移出按钮并且没有释放。
40.1.2 按钮支持键盘反应
    如果控件具有输入焦点,则它将对下列各键做出反应:
按键
反应
GUI_KEY_ENTER
此类键按下后,按钮认为它被按下并立即释放,然后作出相应反应。
GUI_KEY_SPACE
此类键按下后,按钮状态改变为已按下。键释放后,按钮状态改变为未按下。

收藏 评论7 发布时间:2015-2-28 11:00

举报

7个回答
baiyongbin2009 回答时间:2015-2-28 11:01:57
40.2 官方WIDGET_SimpleButton实例
    这个例子就是实现一个简单的按键显示功能。这个例子的位置在:
40.3.png
源代码如下:
  1. #include "GUI.h"
  2. #include "BUTTON.h"

  3. /*******************************************************************
  4. *
  5. * static code
  6. *
  7. ********************************************************************
  8. */
  9. /*******************************************************************
  10. *
  11. * _DemoButton
  12. */
  13. static void _DemoButton(void) {
  14. BUTTON_Handle hButton;(1)

  15. GUI_SetFont(&GUI_Font8x16);
  16. GUI_DispStringHCenterAt("Click on button...", 160, 90);
  17. //
  18. // Create the button and set text
  19. //
  20. hButton = BUTTON_Create(110, 110, 100, 40, GUI_ID_OK, WM_CF_SHOW);(2)
  21. BUTTON_SetText(hButton, "Click me...");(3)
  22. //
  23. // Let window manager handle the button
  24. //
  25. while (GUI_WaitKey() != GUI_ID_OK); (4)
  26. //
  27. // Delete the button
  28. //
  29. BUTTON_Delete(hButton);(5)
  30. GUI_ClearRect(0, 50, 319, 239);
  31. GUI_Delay(1000);
  32. }

  33. /*********************************************************************
  34. *
  35. * Public code
  36. *
  37. **********************************************************************
  38. */
  39. /*********************************************************************
  40. *
  41. * MainTask
  42. */
  43. void MainTask(void) {
  44. GUI_Init();
  45. GUI_SetBkColor(GUI_BLACK);
  46. GUI_Clear();
  47. GUI_SetColor(GUI_WHITE);
  48. GUI_SetFont(&GUI_Font24_ASCII);
  49. GUI_DispStringHCenterAt("WIDGET_SimpleButton - Sample", 160, 5);
  50. while (1) {
  51. _DemoButton();
  52. }
  53. }
复制代码
1. 按钮句柄。
2. 创建一个按钮控件,最后一个参数WM_CF_SHOW表示创建后立即显示,其它参数大家看手册中的介绍即可。
3. 设置按钮上显示的文本。
4. 等待按钮被按下。
5. 删除创建的按钮。
显示效果如下:
40.4.png


baiyongbin2009 回答时间:2015-2-28 11:03:02
40.3 官方WIDGET_PhoneButton实例
    这个例子主要是在按钮上面显示图片,演示一种简单的来电话情景。这个例子所在模拟器中的位置:
40.5.png
源程序如下:
  1. #include "GUI.h"
  2. #include "BUTTON.h"

  3. /*******************************************************************
  4. *
  5. * static variables
  6. *
  7. ********************************************************************
  8. */
  9. /*******************************************************************
  10. *
  11. * Bitmap data, 3 phone logos
  12. */
  13. static const GUI_COLOR Colors[] = { 0x000000, 0xFFFFFF };

  14. static const GUI_LOGPALETTE Palette = { 2, 1, Colors };(1)

  15. static const unsigned char acPhone0[] = {
  16. ________, ________, ________, ________,
  17. ________, ________, ________, ________,
  18. ________, ________, ________, ________,
  19. ________, ________, ________, ________,
  20. ________, ________, ________, ________,
  21. ________, ________, ________, ________,
  22. ________, ________, ________, ________,
  23. ________, ________, ________, ________,
  24. ________, ________, ________, ________,
  25. ________, ________, ________, ________,
  26. ________, ________, ________, ________,
  27. _____XXX, XXXXXXXX, XXXXXXXX, XXX_____,
  28. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___,
  29. __XXXXXX, XXXXXXXX, XXXXXXXX, XXXXXX__,
  30. _XXXXXXX, X_______, _______X, XXXXXXX_,
  31. _XXXXXXX, X__XX___, ___XX__X, XXXXXXX_,
  32. _XXXXXXX, X__XX___, ___XX__X, XXXXXXX_,
  33. _XXXXXXX, X__XX___, ___XX__X, XXXXXXX_,
  34. ________, ___XX___, ___XX___, ________,
  35. _______X, XXXXXXXX, XXXXXXXX, X_______,
  36. ______XX, XXXXXXXX, XXXXXXXX, XX______,
  37. _____XXX, XXXX__X_, _X__XXXX, XXX_____,
  38. ____XXXX, XXXX__X_, _X__XXXX, XXXX____,
  39. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___,
  40. ___XXXXX, XXXX__X_, _X__XXXX, XXXXX___,
  41. ___XXXXX, XXXX__X_, _X__XXXX, XXXXX___,
  42. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___,
  43. ___XXXXX, XXXX__X_, _X__XXXX, XXXXX___,
  44. ___XXXXX, XXXX__X_, _X__XXXX, XXXXX___,
  45. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___,
  46. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___
  47. };

  48. static const unsigned char acPhone1[] = {
  49. ________, ________, ________, ________,
  50. ______XX, X_______, ________, ________,
  51. ____XXXX, XXXXX___, ________, ________,
  52. ____XXXX, XXXXXXX_, ________, ________,
  53. ___XXXXX, XXXXXXXX, X_______, ________,
  54. ___XXXXX, XXXXXXXX, XXX_____, ________,
  55. _____XXX, XXXX_XXX, XXXXX___, ________,
  56. _______X, XXXX___X, XXXXXXX_, ________,
  57. ________, _XX_____, _XXXXXXX, X_______,
  58. ________, ________, ___XXXXX, XXX_____,
  59. ________, ________, _____XXX, XXXXX___,
  60. ________, ________, _______X, XXXXXX__,
  61. ________, ________, ________, XXXXXXX_,
  62. ________, ________, ________, XXXXXXX_,
  63. ________, ________, _______X, XXXXXXXX,
  64. ________, ___XX___, ___XX__X, XXXXXXXX,
  65. ________, ___XX___, ___XX___, _XXXXXXX,
  66. ________, ___XX___, ___XX___, ___XXXX_,
  67. ________, ___XX___, ___XX___, _____XX_,
  68. _______X, XXXXXXXX, XXXXXXXX, X_______,
  69. ______XX, XXXXXXXX, XXXXXXXX, XX______,
  70. _____XXX, XXXX__X_, _X__XXXX, XXX_____,
  71. ____XXXX, XXXX__X_, _X__XXXX, XXXX____,
  72. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___,
  73. ___XXXXX, XXXX__X_, _X__XXXX, XXXXX___,
  74. ___XXXXX, XXXX__X_, _X__XXXX, XXXXX___,
  75. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___,
  76. ___XXXXX, XXXX__X_, _X__XXXX, XXXXX___,
  77. ___XXXXX, XXXX__X_, _X__XXXX, XXXXX___,
  78. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___,
  79. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___
  80. };

  81. static const unsigned char acPhone2[] = {
  82. ________, ________, ________, ________,
  83. ________, ________, _______X, XX______,
  84. ________, ________, ___XXXXX, XXXX____,
  85. ________, ________, _XXXXXXX, XXXX____,
  86. ________, _______X, XXXXXXXX, XXXXX___,
  87. ________, _____XXX, XXXXXXXX, XXXXX___,
  88. ________, ___XXXXX, XXX_XXXX, XXX_____,
  89. ________, _XXXXXXX, X___XXXX, X_______,
  90. _______X, XXXXXXX_, _____XX_, ________,
  91. _____XXX, XXXXX___, ________, ________,
  92. ___XXXXX, XXX_____, ________, ________,
  93. __XXXXXX, X_______, ________, ________,
  94. _XXXXXXX, ________, ________, ________,
  95. _XXXXXXX, ________, ________, ________,
  96. XXXXXXXX, X_______, ________, ________,
  97. XXXXXXXX, X__XX___, ___XX___, ________,
  98. XXXXXXX_, ___XX___, ___XX___, ________,
  99. _XXXX___, ___XX___, ___XX___, ________,
  100. _XX_____, ___XX___, ___XX___, ________,
  101. _______X, XXXXXXXX, XXXXXXXX, X_______,
  102. ______XX, XXXXXXXX, XXXXXXXX, XX______,
  103. _____XXX, XXXX__X_, _X__XXXX, XXX_____,
  104. ____XXXX, XXXX__X_, _X__XXXX, XXXX____,
  105. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___,
  106. ___XXXXX, XXXX__X_, _X__XXXX, XXXXX___,
  107. ___XXXXX, XXXX__X_, _X__XXXX, XXXXX___,
  108. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___,
  109. ___XXXXX, XXXX__X_, _X__XXXX, XXXXX___,
  110. ___XXXXX, XXXX__X_, _X__XXXX, XXXXX___,
  111. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___,
  112. ___XXXXX, XXXXXXXX, XXXXXXXX, XXXXX___
  113. };

  114. static const GUI_BITMAP bm_1bpp_0 = { 32, 31, 4, 1, acPhone0, &Palette}; (2)
  115. static const GUI_BITMAP bm_1bpp_1 = { 32, 31, 4, 1, acPhone1, &Palette};
  116. static const GUI_BITMAP bm_1bpp_2 = { 32, 31, 4, 1, acPhone2, &Palette};

  117. /*******************************************************************
  118. *
  119. * static code
  120. *
  121. ********************************************************************
  122. */
  123. /*******************************************************************
  124. *
  125. * _Wait
  126. */
  127. static int _Wait(int Delay) {(3)
  128. int EndTime;
  129. int r;

  130. r = 1;
  131. EndTime = GUI_GetTime() + Delay;
  132. while (GUI_GetTime() < EndTime) {
  133. GUI_Exec();
  134. if (GUI_GetKey() == GUI_ID_OK) {
  135. r = 0;
  136. break;
  137. }
  138. }
  139. return r;
  140. }

  141. /*******************************************************************
  142. *
  143. * _DemoButton
  144. */
  145. static void _DemoButton(void) {
  146. BUTTON_Handle hButton;

  147. GUI_SetFont(&GUI_Font8x16);
  148. GUI_DispStringHCenterAt("Click on phone button...", 160,80);
  149. GUI_Delay(500);
  150. //
  151. // Create the button and modify its attributes
  152. //
  153. hButton = BUTTON_Create(142, 100, 36, 40, GUI_ID_OK, WM_CF_SHOW);(4)
  154. BUTTON_SetBkColor (hButton, 1, GUI_RED);
  155. //
  156. // Loop until button is pressed
  157. //
  158. while (1) {
  159. BUTTON_SetBitmapEx(hButton, 0, &bm_1bpp_1, 2, 4); (5)
  160. BUTTON_SetBitmapEx(hButton, 1, &bm_1bpp_1, 2, 4);
  161. if (!_Wait(50)) break;
  162. BUTTON_SetBitmapEx(hButton, 0, &bm_1bpp_0, 2, 4);
  163. BUTTON_SetBitmapEx(hButton, 1, &bm_1bpp_0, 2, 4);
  164. if (!_Wait(45)) break;
  165. BUTTON_SetBitmapEx(hButton, 0, &bm_1bpp_2, 2, 4);
  166. BUTTON_SetBitmapEx(hButton, 1, &bm_1bpp_2, 2, 4);
  167. if (!_Wait(50)) break;
  168. BUTTON_SetBitmapEx(hButton, 0, &bm_1bpp_0, 2, 4);
  169. BUTTON_SetBitmapEx(hButton, 1, &bm_1bpp_0, 2, 4);
  170. if (!_Wait(45)) break;
  171. }
  172. BUTTON_SetBitmapEx(hButton, 0, &bm_1bpp_1, 2, 4);
  173. BUTTON_SetBitmapEx(hButton, 1, &bm_1bpp_1, 2, 4);
  174. GUI_ClearRect(0, 80, 319, 120);
  175. GUI_DispStringHCenterAt("You have answered the telephone", 160, 145);
  176. GUI_Delay(2000);
  177. //
  178. // Delete button object
  179. //
  180. BUTTON_Delete(hButton);
  181. GUI_ClearRect(0, 50, 319, 239);
  182. GUI_Delay(400);
  183. }

  184. /*********************************************************************
  185. *
  186. * Public code
  187. *
  188. **********************************************************************
  189. */
  190. /*********************************************************************
  191. *
  192. * MainTask
  193. */
  194. void MainTask(void) {
  195. GUI_Init();
  196. GUI_SetBkColor(GUI_BLACK);
  197. GUI_Clear();
  198. GUI_SetColor(GUI_WHITE);
  199. GUI_SetFont(&GUI_Font24_ASCII);
  200. GUI_DispStringHCenterAt("WIDGET_PhoneButton - Sample", 160, 5);
  201. while (1) {
  202. _DemoButton();
  203. }
  204. }
复制代码
1. 图片数据的调色板。
2. 用于应用函数调用的GUI_BITMAP格式图片数据。
3. 按键时间等待函数,如果超过了设置的等待时间,按钮还没有按下,那么返回1,如果在设置的时间内按下了,返回0.
4. 按钮按下时的背景颜色。
5. 设置按钮按下或者常态时使用的图片。
显示效果如下:
40.6.png


baiyongbin2009 回答时间:2015-2-28 11:04:22
40.4 对话框上使用按钮控件
    通过uCGUIBulder建立一个如下的界面(分辨率480*272):
40.7.png
    同时使能BUTTON0和BUTTON1的三个通知代码消息:
40.8.png
这里我们仅使用按钮的CLICKED消息,通过这两个按钮实现对话框中背景颜色的改变。源代码如下(可以直接的复制到开发板或者模拟器上面运行):
  1. #include <stddef.h>
  2. #include "GUI.h"
  3. #include "DIALOG.h"

  4. #include "WM.h"
  5. #include "BUTTON.h"
  6. #include "CHECKBOX.h"
  7. #include "DROPDOWN.h"
  8. #include "EDIT.h"
  9. #include "FRAMEWIN.h"
  10. #include "LISTBOX.h"
  11. #include "MULTIEDIT.h"
  12. #include "RADIO.h"
  13. #include "SLIDER.h"
  14. #include "TEXT.h"
  15. #include "PROGBAR.h"
  16. #include "SCROLLBAR.h"
  17. #include "LISTVIEW.h"

  18. /*********************************************************************
  19. *
  20. * static data
  21. *
  22. **********************************************************************
  23. */
  24. GUI_COLOR _acColor[3] = {GUI_BLUE,GUI_RED,GUI_YELLOW}; (1)
  25. static char BackColor;

  26. /*********************************************************************
  27. *
  28. * Dialog resource
  29. *
  30. * This table conatins the info required to create the dialog.
  31. * It has been created by ucGUIbuilder.
  32. */

  33. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  34. { FRAMEWIN_CreateIndirect, "armfly", 0, 0, 0, 480,272,FRAMEWIN_CF_MOVEABLE,0},
  35. { BUTTON_CreateIndirect, "BUTTON0", GUI_ID_BUTTON0, 52, 93, 110,30, 0,0},
  36. { BUTTON_CreateIndirect, "BUTTON1", GUI_ID_BUTTON1, 289,90, 117,33, 0,0}
  37. };

  38. /*****************************************************************
  39. ** FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
  40. ** Function: to initialize the Dialog items
  41. **
  42. ** call this function in _cbCallback --> WM_PAINT
  43. *****************************************************************/

  44. void PaintDialog(WM_MESSAGE * pMsg)(2)
  45. {
  46. WM_HWIN hWin = pMsg->hWin;
  47. GUI_SetBkColor(_acColor[BackColor]);
  48. GUI_Clear();
  49. }

  50. /*****************************************************************
  51. ** FunctionName:void InitDialog(WM_MESSAGE * pMsg)
  52. ** Function: to initialize the Dialog items
  53. **
  54. ** call this function in _cbCallback --> WM_INIT_DIALOG
  55. *****************************************************************/

  56. void InitDialog(WM_MESSAGE * pMsg)
  57. {
  58. WM_HWIN hWin = pMsg->hWin;
  59. //
  60. //FRAMEWIN
  61. //
  62. FRAMEWIN_SetFont(hWin,&GUI_Font24B_ASCII);
  63. FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
  64. FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
  65. FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
  66. FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
  67. FRAMEWIN_SetTitleHeight(hWin,30);
  68. //
  69. //GUI_ID_BUTTON0
  70. //
  71. BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&GUI_Font24B_ASCII); (3)
  72. //
  73. //GUI_ID_BUTTON1
  74. //
  75. BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON1),&GUI_Font24B_ASCII);

  76. /* 默认颜色取*/
  77. BackColor = 0;
  78. }

  79. /*********************************************************************
  80. *
  81. * Dialog callback routine
  82. */
  83. static void _cbCallback(WM_MESSAGE * pMsg)
  84. {
  85. int NCode, Id;
  86. WM_HWIN hWin = pMsg->hWin;
  87. switch (pMsg->MsgId)
  88. {
  89. case WM_PAINT:
  90. PaintDialog(pMsg);
  91. break;
  92. case WM_INIT_DIALOG:
  93. InitDialog(pMsg);
  94. break;
  95. case WM_KEY:
  96. switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
  97. {
  98. case GUI_KEY_ESCAPE:
  99. GUI_EndDialog(hWin, 1);
  100. break;
  101. case GUI_KEY_ENTER:
  102. GUI_EndDialog(hWin, 0);
  103. break;
  104. }
  105. break;
  106. case WM_NOTIFY_PARENT:
  107. Id = WM_GetId(pMsg->hWinSrc);
  108. NCode = pMsg->Data.v;
  109. switch (Id)
  110. {
  111. case GUI_ID_OK:
  112. if(NCode==WM_NOTIFICATION_RELEASED)
  113. GUI_EndDialog(hWin, 0);
  114. break;
  115. case GUI_ID_CANCEL:
  116. if(NCode==WM_NOTIFICATION_RELEASED)
  117. GUI_EndDialog(hWin, 0);
  118. break;
  119. case GUI_ID_BUTTON0:
  120. switch(NCode)
  121. {
  122. case WM_NOTIFICATION_CLICKED:(4)
  123. BackColor++;
  124. if (BackColor == 3)
  125. {
  126. BackColor = 0;
  127. }
  128. WM_InvalidateWindow(hWin);
  129. break;
  130. case WM_NOTIFICATION_RELEASED:

  131. break;
  132. case WM_NOTIFICATION_MOVED_OUT:

  133. break;
  134. }
  135. break;
  136. case GUI_ID_BUTTON1:
  137. switch(NCode)
  138. {
  139. case WM_NOTIFICATION_CLICKED:(5)
  140. BackColor--;
  141. if (BackColor < 0)
  142. {
  143. BackColor = 2;
  144. }
  145. WM_InvalidateWindow(hWin);
  146. break;
  147. case WM_NOTIFICATION_RELEASED:

  148. break;
  149. case WM_NOTIFICATION_MOVED_OUT:

  150. break;
  151. }
  152. break;

  153. }
  154. break;
  155. default:
  156. WM_DefaultProc(pMsg);
  157. }
  158. }

  159. /*********************************************************************
  160. *
  161. * MainTask
  162. *
  163. **********************************************************************
  164. */
  165. void MainTask(void)
  166. {
  167. GUI_Init();
  168. WM_SetDesktopColor(GUI_WHITE); /* Automacally update desktop window */
  169. WM_SetCreateFlags(WM_CF_MEMDEV); /* Use memory devices on all windows to avoid flicker */
  170. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  171. FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  172. PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  173. BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
  174. CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  175. DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  176. SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  177. SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  178. HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  179. RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  180. GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);(6)
  181. }
复制代码
1. 对话框用户区可选的三种背景颜色。
2. 对话框回调函数中的重绘消息要执行的函数。
3. 设置按钮的字体。在uCGUIBulder中可以在这里设置:
40.9.png
4. 设置按钮按下后要处理的消息。
5. 同上,处理按钮按下后要处理的消息。
6. 创建阻塞式对话框。
这个程序的实际显示效果如下(480*272分辨率):
40.10.png
40.5 总结
    本期教程主要是跟大家讲解了按钮控件的使用,希望大家可以把本期教程中讲的三个例子都跑跑,然后自己设计一个相关的例子进行试验学习。教程中只是使用了部分的按钮API,其它的API大家都可以试试。

子曰小玖 回答时间:2015-2-28 12:45:20

好贴,顶上去,都学习下
wamcncn 回答时间:2015-2-28 13:09:58
标记下,学习
埃斯提爱慕 回答时间:2015-3-1 15:01:56
提示: 作者被禁止或删除 内容自动屏蔽
caiyuhui74748 回答时间:2015-8-18 11:50:22
很详细,mark              

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版