硬汉嵌入式论坛

 找回密码
 立即注册
查看: 11888|回复: 9
收起左侧

[其它] 请高手帮忙验证MDK5.0 CMSIS-RTOS 的Graphics(图形模块)配置文件GUI_X_RTE.c存在缺

[复制链接]

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2014-3-3 11:26:45 | 显示全部楼层 |阅读模式
armfly_post.jpg

请高手帮忙验证MDK5.0 CMSIS-RTOS 的Graphics(图形模块)配置文件GUI_X_RTE.c存在缺陷

按坛主的帖子《用MDK5.0建立一个CMSIS-RTOS RTX+emWin的工程(用MDK自带的Manage Run-Time Environment)》建立相关工程非常顺利,
但运行emwin的guidemo却发现停止在启动界面,进度条维持在0%不走,排除了存储需求问题后,通过跟踪发现此问题是GUI_Delay导致的,
GUI_Delay实际上会进入死循环

为了排除是由于我的应用导致的干扰问题,我用keil自带的模板建立了工程,所有模块及配置全部来自keil,并写了一个实例来证明我的想法,
结果经过仿真,问题依然存在,为了充分肯定我的结论,请论坛的兄弟尤其是坛主再帮忙验证一下,现贴出的我程序以及我的配置
我的验证结果是程序依然在GUI_Delay进入死循环,走不到i=i+1


#include "RTE_Components.h"
#include "cmsis_os.h"
#include "GUI.h"

/*********************************************************************
*
*       Main
*/
extern volatile GUI_TIMER_TIME OS_TimeMS;


/*********************************************************************
*
*       GUI Tick (executed each ms)
*/

static void GUI_Tick (void const *argument) {
  OS_TimeMS++;
}

osTimerDef(GUI_Timer, GUI_Tick);
osTimerId  GUI_TimerId;

int main (void) {
  int i = 0;
  GUI_TimerId = osTimerCreate(osTimer(GUI_Timer), osTimerPeriodic, NULL);
  osTimerStart(GUI_TimerId, 1);
  GUI_Delay(10);   
  i = i+1;
  //MainTask();
  //for (;;);
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2014-3-3 11:59:52 | 显示全部楼层
我这跑了下面两个简单的DEMO,没问题啊。
  1. /*
  2. *********************************************************************************************************
  3. *                                      
  4. *    模块名称 : GUI界面主函数
  5. *    文件名称 : MainTask.c
  6. *    版    本 : V1.0
  7. *    说    明 : 本实验主要是演示填充的多边形的绘制,比较简单,不过多的讲解了
  8. *
  9. *    修改记录 :
  10. *        版本号    日期          作者                 说明
  11. *        v1.0    2013-04-17    Eric2013      ST固件库版本 V1.0.2版本。
  12. *
  13. *********************************************************************************************************
  14. */
  15. #include "includes.h"
  16. #include "MainTask.h"
  17. /*******************************************************************
  18. *
  19. *       Static variables
  20. *
  21. ********************************************************************
  22. */
  23. static const GUI_POINT _aPointArrow[] = {
  24.   {  0,   0},
  25.   {-40, -30},
  26.   {-10, -20},
  27.   {-10, -70},
  28.   { 10, -70},
  29.   { 10, -20},
  30.   { 40, -30},
  31. };
  32. static const GUI_POINT _aPointStar[] = {
  33.   {  0, -36},
  34.   {  8,  -8},
  35.   { 36,   0},
  36.   {  8,   8},
  37.   {  0,  36},
  38.   { -8,   8},
  39.   {-36,   0},
  40.   { -8,  -8}
  41. };
  42. static const GUI_POINT _aPointHexagon[] = {
  43.   {  0, -30},
  44.   { 26, -15},
  45.   { 26,  15},
  46.   {  0,  30},
  47.   {-26,  15},
  48.   {-26, -15},
  49. };
  50. /*******************************************************************
  51. *
  52. *       Static code
  53. *
  54. ********************************************************************
  55. */
  56. /*******************************************************************
  57. *
  58. *       _DrawPolygons
  59.   Draws polygons of different shapes and colors
  60. */
  61. static void _DrawPolygons(void) {
  62.   int y = 90;
  63.   /* clear display */
  64.   /* 设置了颜色以后需要加清屏指令才有效 */
  65.   GUI_SetBkColor(GUI_BLACK);
  66.   GUI_Clear();
  67.   /* display text */
  68.   GUI_SetColor(GUI_WHITE);
  69.   GUI_SetFont(&GUI_Font24_ASCII);
  70.   GUI_SetTextAlign(GUI_TA_HCENTER);
  71.   GUI_DispStringAt("DrawPolygon - Sample", 160, 5);
  72.   GUI_SetFont(&GUI_Font8x16);
  73.   GUI_DispStringAt("using", 5, 40);
  74.   GUI_DispStringAt("GUI_FillPolygon", 5, 55);
  75.   GUI_SetTextAlign(GUI_TA_HCENTER);
  76.   GUI_DispStringAt("Polygons of arbitrary shape\\nin any color", 160, y + 90);
  77.   GUI_Delay(500);
  78.   /* draw filled polygons */
  79.   while (1) {
  80.     GUI_ClearRect(100, y, 220, y + 85);
  81.     GUI_SetColor(GUI_BLUE);
  82.     GUI_FillPolygon (&_aPointArrow[0], 7, 160, y + 80);
  83.     GUI_Delay(1000);
  84.     GUI_ClearRect(100, y, 220, y + 85);
  85.     GUI_SetColor(GUI_RED);
  86.     GUI_FillPolygon (&_aPointStar[0], 8, 160, y + 45);
  87.     GUI_Delay(1000);
  88.     GUI_ClearRect(100, y, 220, y + 85);
  89.     GUI_SetColor(GUI_GREEN);
  90.     GUI_FillPolygon(&_aPointHexagon[0], 6, 160, y + 45);
  91.     GUI_Delay(1000);
  92.   }
  93. }
  94. /*********************************************************************
  95. *
  96. *       Public code
  97. *
  98. **********************************************************************
  99. */
  100. /*********************************************************************
  101. *
  102. *       MainTask
  103. */
  104. void MainTask(void) {
  105.   GUI_Init();
  106.   _DrawPolygons();
  107.   while (1);
  108. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2014-3-3 12:01:08 | 显示全部楼层
这个也没有问题。
  1. /*
  2. *********************************************************************************************************
  3. *                                      
  4. *    模块名称 : GUI界面主函数
  5. *    文件名称 : MainTask.c
  6. *    版    本 : V1.0
  7. *    说    明 : 这个例子比较简单,主要是学习绘制用水平颜色梯度填充的矩形
  8. *    修改记录 :
  9. *        版本号    日期          作者                 说明
  10. *        v1.0    2013-10-11    Eric2013      ST固件库版本 V1.0.2版本。
  11. *
  12. *********************************************************************************************************
  13. */
  14. #include "bsp.h"
  15. #include "MainTask.h"
  16. void MainTask(void)
  17. {
  18.     GUI_Init();
  19.     GUI_SetBkColor(GUI_RED);
  20.     GUI_Clear();
  21.     GUI_CURSOR_Show();
  22.     while(1)
  23.     {
  24.         GUI_Delay(10);
  25.     }
  26. }
复制代码
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2014-3-4 17:00:11 | 显示全部楼层
问坛主用的是什么版本,是最新下载的5.10吗
keil_version.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2014-3-4 17:03:39 | 显示全部楼层

回 nlcxwqaz 的帖子

nlcxwqaz:问坛主用的是什么版本,是最新下载的5.10吗

 (2014-03-04 17:00) 
我用的是5.0,不是5.1,用5.1编译会有错误的,兼容不好
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2014-3-4 17:04:41 | 显示全部楼层
另外请坛主分享一下试验中使用的两个配置文件:RTX_Conf_CM.c和GUI_X_RTE.c
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2014-3-4 17:31:23 | 显示全部楼层
另外,坛主用我贴的配置验证了我的程序吗?是否能跑到i=i+1,这个程序就是验证在不使用GUI_init的情况下GUI_delay的可用性,原理上应该可以说得通
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2014-3-4 17:51:35 | 显示全部楼层
我先贴一下我的配置吧:
/*********************************************************************
*                SEGGER Microcontroller GmbH & Co. KG                *
*        Solutions for real time microcontroller applications        *
**********************************************************************
*                                                                    *
*        (c) 1996 - 2013  SEGGER Microcontroller GmbH & Co. KG       *
*                                                                    *
*        Internet: www.segger.com    Support:  support@segger.com    *
*                                                                    *
**********************************************************************

** emWin V5.22 - Graphical user interface for embedded applications **
All  Intellectual Property rights  in the Software belongs to  SEGGER.
emWin is protected by  international copyright laws.  Knowledge of the
source code may not be used to write a similar product.  This file may
only be used in accordance with the following terms:

The software has been licensed to  ARM LIMITED whose registered office
is situated at  110 Fulbourn Road,  Cambridge CB1 9NJ,  England solely
for  the  purposes  of  creating  libraries  for  ARM7, ARM9, Cortex-M
series,  and   Cortex-R4   processor-based  devices,  sublicensed  and
distributed as part of the  MDK-ARM  Professional  under the terms and
conditions  of  the   End  User  License  supplied  with  the  MDK-ARM
Professional.
Full source code is available at: www.segger.com

We appreciate your understanding and fairness.
----------------------------------------------------------------------
File        : GUI_X_RTE.c
Purpose     : Config / System dependent externals for GUI
---------------------------END-OF-HEADER------------------------------
*/

#include "RTE_Components.h"
#include "cmsis_os.h"
#include "GUI.h"


/*********************************************************************
*
*       Global data
*/
volatile GUI_TIMER_TIME OS_TimeMS;


/*********************************************************************
*
*       GUI Tick (executed each ms)
*/

static void GUI_Tick (void const *argument) {
  OS_TimeMS++;
}

/*********************************************************************
*
*      Timing:
*                 GUI_X_GetTime()
*                 GUI_X_Delay(int)

  Some timing dependent routines require a GetTime
  and delay function. Default time unit (tick), normally is
  1 ms.
*/


GUI_TIMER_TIME GUI_X_GetTime(void) {
  return OS_TimeMS;
}



void GUI_X_Delay(int ms) {
  osDelay(ms);
}

/*********************************************************************
*
*       GUI_X_Init()
*
* Note:
*     GUI_X_Init() is called from GUI_Init is a possibility to init
*     some hardware which needs to be up and running before the GUI.
*     If not required, leave this routine blank.

*/



osTimerDef(GUI_Timer, GUI_Tick);
osTimerId  GUI_TimerId;

#ifdef RTE_Graphics_Touchscreen
extern void GUI_TOUCH_Initialize(void);
extern void GUI_TOUCH_Exec(void);
static void GUI_TOUCH_Tick(void const *argument) { GUI_TOUCH_Exec(); };
osTimerDef (GUI_TOUCH_Timer, GUI_TOUCH_Tick);
osTimerId   GUI_TOUCH_TimerId;
#endif

#ifdef RTE_Graphics_Joystick
extern void GUI_JOYSTICK_Initialize(void);
extern void GUI_JOYSTICK_Exec(void);
static void GUI_JOYSTICK_Tick(void const *argument) { GUI_JOYSTICK_Exec(); };
osTimerDef (GUI_JOYSTICK_Timer, GUI_JOYSTICK_Tick);
osTimerId   GUI_JOYSTICK_TimerId;
#endif

void GUI_X_Init(void) {
  GUI_TimerId = osTimerCreate(osTimer(GUI_Timer), osTimerPeriodic, NULL);
  osTimerStart(GUI_TimerId, 1);
#ifdef RTE_Graphics_Touchscreen
  GUI_TOUCH_Initialize();
  GUI_TOUCH_TimerId = osTimerCreate(osTimer(GUI_TOUCH_Timer), osTimerPeriodic, NULL);
  osTimerStart(GUI_TOUCH_TimerId, 20);
#endif
#ifdef RTE_Graphics_Joystick
  GUI_JOYSTICK_Initialize();
  GUI_JOYSTICK_TimerId = osTimerCreate(osTimer(GUI_JOYSTICK_Timer), osTimerPeriodic, NULL);
  osTimerStart(GUI_JOYSTICK_TimerId, 50);
#endif
}



/*********************************************************************
*
*       GUI_X_ExecIdle
*
* Note:
*  Called if WM is in idle state
*/

void GUI_X_ExecIdle(void) {
  osDelay(1);
}

/*********************************************************************
*
*      Logging: OS dependent

Note:
  Logging is used in higher debug levels only. The typical target
  build does not use logging and does therefor not require any of
  the logging routines below. For a release build without logging
  the routines below may be eliminated to save some space.
  (If the linker is not function aware and eliminates unreferenced
  functions automatically)

*/

void GUI_X_Log     (const char *s) { GUI_USE_PARA(s); }
void GUI_X_Warn    (const char *s) { GUI_USE_PARA(s); }
void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }

/*********************************************************************
*
*      Multitasking:
*
*                 GUI_X_InitOS()
*                 GUI_X_GetTaskId()
*                 GUI_X_Lock()
*                 GUI_X_Unlock()
*
* Note:
*   The following routines are required only if emWin is used in a
*   true multi task environment, which means you have more than one
*   thread using the emWin API.
*   In this case the
*                       #define GUI_OS 1
*  needs to be in GUIConf.h
*/

osMutexDef(GUI_Mutex);
osMutexId  GUI_MutexId;

void GUI_X_InitOS(void)    { GUI_MutexId = osMutexCreate(osMutex(GUI_Mutex)); }
void GUI_X_Unlock(void)    { osMutexRelease(GUI_MutexId); }
void GUI_X_Lock(void)      { osMutexWait   (GUI_MutexId, osWaitForever); }
U32  GUI_X_GetTaskId(void) { return ((U32)osThreadGetId()); }

/*********************************************************************
*
*      Event driving (optional with multitasking)
*
*                 GUI_X_WaitEvent()
*                 GUI_X_WaitEventTimed()
*                 GUI_X_SignalEvent()
*/

osThreadId GUI_ThreadId;

void GUI_X_WaitEvent(void) {
  GUI_ThreadId = osThreadGetId();
  osSignalWait(0x00000001, osWaitForever);
}

void GUI_X_WaitEventTimed(int Period) {
  GUI_ThreadId = osThreadGetId();
  osSignalWait(0x00000001, Period);
}

void GUI_X_SignalEvent(void) {
  if (GUI_ThreadId) {
    osSignalSet(GUI_ThreadId, 0x00000001);
  }
}

/*************************** End of file ****************************/
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2014-3-4 17:53:35 | 显示全部楼层
上面这个是GUI_X_RTE.c,我再贴一下RTX_Conf_CM.c
/*----------------------------------------------------------------------------
*      RL-ARM - RTX
*----------------------------------------------------------------------------
*      Name:    RTX_Conf_CM.C
*      Purpose: Configuration of CMSIS RTX Kernel for Cortex-M
*      Rev.:    V4.73
*----------------------------------------------------------------------------
*
* Copyright (c) 1999-2009 KEIL, 2009-2013 ARM Germany GmbH
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*  - Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
*  - Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
*  - Neither the name of ARM  nor the names of its contributors may be used
*    to endorse or promote products derived from this software without
*    specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*---------------------------------------------------------------------------*/

#include "cmsis_os.h"


/*----------------------------------------------------------------------------
*      RTX User configuration part BEGIN
*---------------------------------------------------------------------------*/

//-------- <<< Use Configuration Wizard in Context Menu >>> -----------------
//
// <h>Thread Configuration
// =======================
//
//   <o>Number of concurrent running threads <0-250>
//   <i> Defines max. number of threads that will run at the same time.
//   <i> Default: 6
#ifndef OS_TASKCNT
#define OS_TASKCNT     3
#endif

//   <o>Default Thread stack size [bytes] <64-4096:8><#/4>
//   <i> Defines default stack size for threads with osThreadDef stacksz = 0
//   <i> Default: 200
#ifndef OS_STKSIZE
//#define OS_STKSIZE     50
#define OS_STKSIZE     2048
#endif

//   <o>Main Thread stack size [bytes] <64-32768:8><#/4>
//   <i> Defines stack size for main thread.
//   <i> Default: 200
#ifndef OS_MAINSTKSIZE
//#define OS_MAINSTKSIZE 50
#define OS_MAINSTKSIZE 2048
#endif

//   <o>Number of threads with user-provided stack size <0-250>
//   <i> Defines the number of threads with user-provided stack size.
//   <i> Default: 0
#ifndef OS_PRIVCNT
#define OS_PRIVCNT     1
#endif

//   <o>Total stack size [bytes] for threads with user-provided stack size <0-1048576:8><#/4>
//   <i> Defines the combined stack size for threads with user-provided stack size.
//   <i> Default: 0
#ifndef OS_PRIVSTKSIZE
#define OS_PRIVSTKSIZE 2048
#endif

// <q>Check for stack overflow
// <i> Includes the stack checking code for stack overflow.
// <i> Note that additional code reduces the Kernel performance.
#ifndef OS_STKCHECK
#define OS_STKCHECK    1
#endif

// <o&gtrocessor mode for thread execution
//   <0=> Unprivileged mode
//   <1=> Privileged mode
// <i> Default: Privileged mode
#ifndef OS_RUNPRIV
#define OS_RUNPRIV     1
#endif

// </h>

// <h>RTX Kernel Timer Tick Configuration
// ======================================
// <q> Use Cortex-M SysTick timer as RTX Kernel Timer
// <i> Use the Cortex-M SysTick timer as a time-base for RTX.
#ifndef OS_SYSTICK
#define OS_SYSTICK     1
#endif
//
//   <o>Timer clock value [Hz] <1-1000000000>
//   <i> Defines the timer clock value.
//   <i> Default: 12000000  (12MHz)
#ifndef OS_CLOCK
#define OS_CLOCK       72000000
#endif

//   <o>Timer tick value [us] <1-1000000>
//   <i> Defines the timer tick value.
//   <i> Default: 1000  (1ms)
#ifndef OS_TICK
#define OS_TICK        1000
#endif

// </h>

// <h>System Configuration
// =======================
//
// <e>Round-Robin Thread switching
// ===============================
//
// <i> Enables Round-Robin Thread switching.
#ifndef OS_ROBIN
#define OS_ROBIN       1
#endif

//   <o>Round-Robin Timeout [ticks] <1-1000>
//   <i> Defines how long a thread will execute before a thread switch.
//   <i> Default: 5
#ifndef OS_ROBINTOUT
#define OS_ROBINTOUT   5
#endif

// </e>

// <e>User Timers
// ==============
//   <i> Enables user Timers
#ifndef OS_TIMERS
#define OS_TIMERS      1
#endif

//   <o>Timer Thread Priority
//                        <1=> Low
//     <2=> Below Normal  <3=> Normal  <4=> Above Normal
//                        <5=> High
//                        <6=> Realtime (highest)
//   <i> Defines priority for Timer Thread
//   <i> Default: High
#ifndef OS_TIMERPRIO
#define OS_TIMERPRIO   5
#endif

//   <o>Timer Thread stack size [bytes] <64-4096:8><#/4>
//   <i> Defines stack size for Timer thread.
//   <i> Default: 200
#ifndef OS_TIMERSTKSZ
#define OS_TIMERSTKSZ  50
#endif

//   <o>Timer Callback Queue size <1-32>
//   <i> Number of concurrent active timer callback functions.
//   <i> Default: 4
#ifndef OS_TIMERCBQS
#define OS_TIMERCBQS   4
#endif

// </e>

//   <o>ISR FIFO Queue size<4=>   4 entries  <8=>   8 entries
//                         <12=> 12 entries  <16=> 16 entries
//                         <24=> 24 entries  <32=> 32 entries
//                         <48=> 48 entries  <64=> 64 entries
//                         <96=> 96 entries
//   <i> ISR functions store requests to this buffer,
//   <i> when they are called from the interrupt handler.
//   <i> Default: 16 entries
#ifndef OS_FIFOSZ
#define OS_FIFOSZ      16
#endif

// </h>

//------------- <<< end of configuration section >>> -----------------------

// Standard library system mutexes
// ===============================
//  Define max. number system mutexes that are used to protect
//  the arm standard runtime library. For microlib they are not used.
#ifndef OS_MUTEXCNT
#define OS_MUTEXCNT    8
#endif

/*----------------------------------------------------------------------------
*      RTX User configuration part END
*---------------------------------------------------------------------------*/

//#define OS_TRV          ((uint32_t)(((double)OS_CLOCK*(double)OS_TICK)/1E6)-1)
#define OS_TRV          ((uint32_t)(((double)OS_CLOCK*(double)OS_TICK)/1E6)-1)

/*----------------------------------------------------------------------------
*      Global Functions
*---------------------------------------------------------------------------*/

/*--------------------------- os_idle_demon ---------------------------------*/

void os_idle_demon (void) {
  /* The idle demon is a system thread, running when no other thread is      */
  /* ready to run.                                                           */

  for (;;) {
    /* HERE: include optional user code to be executed when no thread runs.*/
  }
}


/*--------------------------- os_error --------------------------------------*/

/* OS Error Codes */
#define OS_ERROR_STACK_OVF      1
#define OS_ERROR_FIFO_OVF       2
#define OS_ERROR_MBX_OVF        3

extern osThreadId svcThreadGetId (void);

void os_error (uint32_t error_code) {
  /* This function is called when a runtime error is detected.  */
  /* Parameter 'error_code' holds the runtime error code.       */

  /* HERE: include optional code to be executed on runtime error. */
  switch (error_code) {
    case OS_ERROR_STACK_OVF:
      /* Stack overflow detected for the currently running task. */
      /* Thread can be identified by calling svcThreadGetId().   */
      break;
    case OS_ERROR_FIFO_OVF:
      /* ISR FIFO Queue buffer overflow detected. */
      break;
    case OS_ERROR_MBX_OVF:
      /* Mailbox overflow detected. */
      break;
  }
  for (;;);
}


/*----------------------------------------------------------------------------
*      RTX Configuration Functions
*---------------------------------------------------------------------------*/

#include "RTX_CM_lib.h"

/*----------------------------------------------------------------------------
* end of file
*---------------------------------------------------------------------------*/
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2014-3-4 18:28:32 | 显示全部楼层
我把我试验代码的工程文件也传一下

Blinky_test.rar (98 KB, 下载次数: 117)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 22:11 , Processed in 0.347093 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表