{"id":1775,"date":"2025-09-29T00:00:00","date_gmt":"2025-09-28T15:00:00","guid":{"rendered":"https:\/\/twarelab.com\/?p=1775"},"modified":"2025-09-19T10:28:32","modified_gmt":"2025-09-19T01:28:32","slug":"stm32f4c-project-tutorial-step-2","status":"publish","type":"post","link":"https:\/\/twarelab.com\/en\/blog\/stm32f4c-project-tutorial-step-2\/","title":{"rendered":"[STM32F4]C++ \ud504\ub85c\uc81d\ud2b8 \ud29c\ud1a0\ub9ac\uc5bc &#8211; Step 2"},"content":{"rendered":"\n<p>\uc774\ubc88 \ub2e8\uacc4\uc5d0\uc11c\ub294 \ud504\ub85c\uc81d\ud2b8 \uc804\uccb4\uc5d0\uc11c \ub3d9\uc791\ud558\ub294 <strong>Task\uc640 Timer\ub97c \uad00\ub9ac\ud558\ub294 \uad6c\uc870<\/strong>\ub97c \uc124\uacc4\ud569\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 BasicFunctions\ub77c\ub294 \uad00\ub9ac \uac1d\uccb4\ub97c \ub9cc\ub4e4\uace0, \uc774 \uac1d\uccb4 \uc548\uc5d0\uc11c Task\uc640 Timer\ub97c \ud1b5\ud569\uc801\uc73c\ub85c \uc81c\uc5b4\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\uc131\ud569\ub2c8\ub2e4. \ub610\ud55c \uc608\uc81c\ub85c RUNLEDTask\ub97c \ucd94\uac00\ud558\uc5ec LED\uac00 1\ucd08 \uac04\uaca9\uc73c\ub85c \uc810\uba78(blinking)\ub418\ub294 \ub3d9\uc791\uc744 \ud655\uc778\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Task\uc640 Timer \uac1c\ub150<\/h2>\n\n\n\n<p><strong>Task \uac1d\uccb4<\/strong><\/p>\n\n\n\n<p>Task\ub294 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \ubc18\ubcf5\uc801\uc73c\ub85c \uc2e4\ud589\ub418\ub294 \ub2e8\uc704 \ub3d9\uc791\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c \ubaa8\ub4e0 Task\ub294 BaseTask\ub97c \uae30\ubc18 \ud074\ub798\uc2a4\ub85c \ub9cc\ub4e4\uc5b4\uc9d1\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class BaseTask {\nprotected:\n        BOOL bEnabled;\n        BOOL bModuleInitialized;\n        BOOL bFinished;\n        BaseTimer timer;\n        string name;\n\npublic:\n        BaseTask();\n\n        virtual ~BaseTask();\n\n        void setEnable(BOOL flag);\n        BOOL getEnable(void);\n\n        void setModuleInitialize(BOOL flag);\n        BOOL getModuleInitialized(void);\n\n        void setFinish(BOOL flag);\n        BOOL getFinish(void);\n\n        void setTimer(BaseTimer timer);\n        BaseTimer * getTimerHandle(void);\n\n        void registerTimer(TimerManager *pTM);\n\n        void setName(string name);\n        string getName(void);\n\n        void virtual run(void);\n};<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Task\ub294 <strong>\ud65c\uc131\ud654 \uc5ec\ubd80(bEnabled)<\/strong>, <strong>\ucd08\uae30\ud654 \uc0c1\ud0dc(bModuleInitialized)<\/strong>, <strong>\uc644\ub8cc \uc0c1\ud0dc(bFinished)<\/strong> \ub4f1\uc744 \uad00\ub9ac\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\ub610\ud55c, \ub0b4\ubd80\uc801\uc73c\ub85c BaseTimer \uac1d\uccb4\ub97c \ud3ec\ud568\ud558\uc5ec \uc2dc\uac04 \uae30\ubc18 \ub3d9\uc791\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li>registerTimer() \ud568\uc218\ub97c \ud1b5\ud574 TimerManager\uc5d0 \ub4f1\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p>\uc989, BaseTask\ub294 \ub2e8\uc21c\ud788 run()\uc744 \uc2e4\ud589\ud558\ub294 \uad6c\uc870\uac00 \uc544\ub2c8\ub77c, <strong>Timer\uc640 \uacb0\ud569\ub418\uc5b4 \uc870\uac74\uc774 \ucda9\uc871\ub420 \ub54c \ub3d9\uc791\ud558\ub294 \uad6c\uc870\ub97c \uac00\uc9c8 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/strong><\/p>\n\n\n\n<p><strong>Timer \uac1d\uccb4<\/strong><\/p>\n\n\n\n<p>Timer\ub294 \ud504\ub85c\uc81d\ud2b8 \ub0b4\uc5d0\uc11c <strong>\uc2dc\uac04 \uae30\ubc18 \ub3d9\uc791\uc744 \uc81c\uc5b4\ud558\uae30 \uc704\ud55c \ubc94\uc6a9 \uac1d\uccb4<\/strong>\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class BaseTimer {\nprotected:\n        BOOL bEnable;\n        BOOL bTrigger;\n        TIMEDEF timetype;\n        uint16_t timecriteria;\n        uint16_t timecount;\n        string name;\npublic:\n        BaseTimer();\n        BaseTimer(string name, BOOL flag, TIMEDEF type, uint16_t criteria, uint16_t count);\n        virtual ~BaseTimer();\n\n        void setName(string name);\n        string getName(void);\n\n        void setEnable(BOOL flag);\n        BOOL getEnable(void);\n\n        void setTrigger(BOOL flag);\n        BOOL getTrigger(void);\n\n        void setTimeType(TIMEDEF type);\n        TIMEDEF getTimeType(void);\n\n        void setTimeCriteria(uint16_t value);\n        uint16_t getTimeCriteria(void);\n\n        void setTimeCount(uint16_t value);\n        uint16_t getTimeCount(void);\n\n        uint16_t updateTimeCount(void);\n\n};<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>BaseTimer\ub294 <strong>\ud0c0\uc774\uba38 \ud65c\uc131\ud654 \uc5ec\ubd80(bEnable)<\/strong>, <strong>\uc870\uac74 \ucda9\uc871 \uc5ec\ubd80(bTrigger)<\/strong>, <strong>\uc2dc\uac04 \ud0c0\uc785(TIMEDEF, ms \ub2e8\uc704 \/ sec \ub2e8\uc704)<\/strong>, <strong>timeout \uc870\uac74(timecriteria)<\/strong> \ub4f1\uc744 \uc18d\uc131\uc73c\ub85c \uac00\uc9d1\ub2c8\ub2e4.<\/li>\n\n\n\n<li>Timer\uc758 \uc2dc\uac04 \uce74\uc6b4\ud2b8(timecount)\ub294 <strong>\ud65c\uc131\ud654\ub41c Timer2 interrupt\uc640 timertype\uc5d0 \uc758\ud574 \uc99d\uac00\ud558\ub294 \uad6c\uc870\ub85c \ub3d9\uc791\ud569\ub2c8\ub2e4.<\/strong><\/li>\n\n\n\n<li>timecount \uac12\uc774 timecriteria\uc5d0 \ub3c4\ub2ec\ud558\uba74 bTrigger \ud50c\ub798\uadf8\uac00 True\ub85c \ubc14\ub00c\uace0, \uc774\ub97c \ud1b5\ud574 \uc6d0\ud558\ub294 \uc870\uac74\uc5d0\uc11c \ub3d9\uc791\uc744 \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p>\uc989, Timer\ub294 Task \uc2e4\ud589 \uc8fc\uae30\ub97c \uc81c\uc5b4\ud558\ub294 \ub370 \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc9c0\ub9cc, \ud504\ub85c\uc81d\ud2b8 \uc804\ubc18\uc5d0\uc11c \ub2e4\uc591\ud55c \uc2dc\uac04 \uae30\ubc18 \uae30\ub2a5\uc744 \uad6c\ud604\ud560 \ub54c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. BasicFunctions \uac1d\uccb4<\/h2>\n\n\n\n<p>BasicFunctions\ub294 \ud504\ub85c\uc81d\ud2b8\uc758 <strong>\uc911\uc559 \uad00\ub9ac \uac1d\uccb4<\/strong>\ub85c, \ub0b4\ubd80\uc801\uc73c\ub85c \ub2e4\uc74c \ub450 \ub9e4\ub2c8\uc800\ub97c \ud3ec\ud568\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class BasicFunctions {\nprotected:\n        ConsoleTask * CTask;\n        uint16_t ms_count;\n        uint32_t sec_count;\n\n        TimerManager timerMGR;\n        TaskManager taskMGR;\n\npublic:\n        BasicFunctions();\n        BasicFunctions(ConsoleTask * pTask);\n        virtual ~BasicFunctions();\n\n        void TimeoutHandler(void);\n\n        TimerManager * getTimerManagerHandle(void);\n        TaskManager * getTaskManagerHandle(void);\n\n        void RegisterTask(BaseTask * pTask);\n\n        void PrintTasksAndTimers(void);\n\n        void run();\n\n};<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TimerManager<\/strong> : \ud504\ub85c\uc81d\ud2b8 \ub0b4 \ubaa8\ub4e0 Timer\ub97c \ub4f1\ub85d\ud558\uace0 \uad00\ub9ac<\/li>\n\n\n\n<li><strong>TaskManager<\/strong> : \ud504\ub85c\uc81d\ud2b8 \ub0b4 \ubaa8\ub4e0 Task\ub97c \ub4f1\ub85d\ud558\uace0 \uad00\ub9ac<\/li>\n<\/ul>\n\n\n\n<p>RegisterTask() \ud568\uc218\ub97c \uc774\uc6a9\ud574 Task\ub97c \ub4f1\ub85d\ud560 \uc218 \uc788\uc73c\uba70, Timer \ub4f1\ub85d\uc740 \uac01 Task\uc758 registerTimer() \ud568\uc218\ub97c \ud1b5\ud574 \ucc98\ub9ac\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc989, BasicFunctions\ub294 <strong>Task\uc640 Timer\ub97c \ud55c \uacf3\uc5d0\uc11c \uad00\ub9ac\ud558\ub294 \ucee8\ud2b8\ub864 \ud5c8\ube0c<\/strong> \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. \ud504\ub85c\uc81d\ud2b8 \uc124\uc815<\/h2>\n\n\n\n<p><strong>Tasks \ud3f4\ub354 \ucd94\uac00 \ubc0f \uc124\uc815<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tasks \ud3f4\ub354\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\ud504\ub85c\uc81d\ud2b8 \uc18d\uc131\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \uacbd\ub85c\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.\n<ul class=\"wp-block-list\">\n<li><strong>C\/C++ Build \u2192 Settings \u2192 MCU\/MPU G++ Compiler \u2192 Include paths<\/strong> \u2192 ..\/Tasks<\/li>\n\n\n\n<li><strong>C\/C++ General \u2192 Paths and Symbols \u2192 Source Location<\/strong> \u2192 Tasks \ud3f4\ub354<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>\uc774\uc81c BasicFunctions.cpp\uc640 BasicFunctions.h\ub97c Tasks \ud3f4\ub354\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. BasicFunctions \uac1d\uccb4 \uc0dd\uc131 \ubc0f \uc2e4\ud589<\/h2>\n\n\n\n<p><strong>\uac1d\uccb4 \uc120\uc5b8<\/strong><\/p>\n\n\n\n<p>main.cpp\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 BasicFunctions \uac1d\uccb4\ub97c \uc120\uc5b8\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/* Private includes ----------------------------------------------------------*\/\n\/* USER CODE BEGIN Includes *\/\n#include &lt;ConsoleTask.h>\n#include &lt;BasicFunctions.h>\n\n\/* USER CODE END Includes *\/\n\n\/* Private typedef -----------------------------------------------------------*\/\n\/* USER CODE BEGIN PTD *\/\n\n\/* USER CODE END PTD *\/\n\n\/* Private define ------------------------------------------------------------*\/\n\/* USER CODE BEGIN PD *\/\n\n\/* USER CODE END PD *\/\n\n\/* Private macro -------------------------------------------------------------*\/\n\/* USER CODE BEGIN PM *\/\n\n\/* USER CODE END PM *\/\n\n\/* Private variables ---------------------------------------------------------*\/\nI2C_HandleTypeDef hi2c3;\n\nRTC_HandleTypeDef hrtc;\n\n\/* USER CODE BEGIN PV *\/\n\nConsoleTask CTask;\n__attribute__ ((section(\".ccmram\"))) volatile uint8_t consoleBuf[2048];\n\nBasicFunctions basic;<\/pre>\n\n\n\n<p><strong>\ucd08\uae30\ud654 \ud568\uc218 \ucd94\uac00<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/* Private function prototypes -----------------------------------------------*\/\nvoid SystemClock_Config(void);\nstatic void MX_GPIO_Init(void);\nstatic void MX_DMA_Init(void);\nstatic void MX_TIM2_Init(void);\nstatic void MX_SPI1_Init(void);\nstatic void MX_USART6_UART_Init(void);\nstatic void MX_I2C3_Init(void);\nstatic void MX_RTC_Init(void);\n\/* USER CODE BEGIN PFP *\/\nvoid InitConsoleTask(void);\nvoid InitBasicFunctions();\n\n\/* USER CODE END PFP *\/\n...\n\n\/* USER CODE BEGIN 4 *\/\n\n\/*\n *\n *\/\nvoid InitConsoleTask(void)\n{\n          CTask = ConsoleTask(USART6, DMA2, LL_DMA_STREAM_6, DMA2, LL_DMA_STREAM_1);\n          CTask.setBufPtr((uint8_t *)consoleBuf);\n\n          CTask.uart.DMARxEnable();\n          LL_USART_EnableIT_IDLE(USART6);\n\n          CTask.PRINTF((char *)\"\\r\\n\\r\\n\");\n          CTask.PRINTF((char *)\"=====================================\\r\\n\");\n          CTask.PRINTF((char *)\"Hello. This is TW100PCTest Application\\r\\n\");\n          CTask.PRINTF((char *)\"\\r\\nBuild Date: %s, %s\\r\\n\", __DATE__, __TIME__);\n          CTask.PRINTF((char *)\"=====================================\\r\\n\");\n          CTask.flushTxBuf();\n}\n\n\/*\n *\n *\/\nvoid InitBasicFunctions()\n{\n        basic = BasicFunctions(&amp;CTask);\n\n        LL_TIM_EnableCounter(TIM2);\n        LL_TIM_EnableIT_UPDATE(TIM2);\n\n        CTask.PRINTF((char *)\"InitBasicFunctions\\r\\n\");\n        CTask.flushTxBuf();\n}\n\n\/* USER CODE END 4 *\/<\/pre>\n\n\n\n<p><strong>main() \ub0b4\uc5d0 \ucd94\uac00<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  \/* Initialize all configured peripherals *\/\n  MX_GPIO_Init();\n  MX_DMA_Init();\n  MX_TIM2_Init();\n  MX_SPI1_Init();\n  MX_USART6_UART_Init();\n  MX_I2C3_Init();\n  MX_RTC_Init();\n  \/* USER CODE BEGIN 2 *\/\n  InitConsoleTask();\n  InitBasicFunctions();\n  \/* USER CODE END 2 *\/\n\n  \/* Infinite loop *\/\n  \/* USER CODE BEGIN WHILE *\/\n  while (1)\n  {\n          CTask.run();\n          basic.run();\n    \/* USER CODE END WHILE *\/\n\n    \/* USER CODE BEGIN 3 *\/\n  }\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. RUNLEDTask \uc0dd\uc131 \ubc0f \ub4f1\ub85d<\/h2>\n\n\n\n<p>Task \uad6c\uc870\uac00 \uc900\ube44\ub418\uba74, \uc2e4\uc81c \ub3d9\uc791\uc744 \ud655\uc778\ud558\uae30 \uc704\ud574 <span class=\"highlight\">RUNLEDTask<\/span>\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p><strong>Common \ud3f4\ub354 \ucd94\uac00<\/strong><\/p>\n\n\n\n<p>Tasks\/Common \ud3f4\ub354\ub97c \uc0dd\uc131\ud558\uace0, RUNLEDTask.cpp, RUNLEDTask.h \ud30c\uc77c\uc744 \uc791\uc131\ud569\ub2c8\ub2e4.<br>\ud504\ub85c\uc81d\ud2b8 \uc18d\uc131\uc5d0\uc11c Include Path\uc5d0 ..\/Tasks\/Common\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p><strong>RUNLEDTask \uac1d\uccb4 \uc120\uc5b8 \ubc0f \ub4f1\ub85d<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/* Private includes ----------------------------------------------------------*\/\n\/* USER CODE BEGIN Includes *\/\n#include &lt;ConsoleTask.h>\n#include &lt;BasicFunctions.h>\n#include &lt;RUNLEDTask.h>\n\n\/* USER CODE END Includes *\/\n\n\/* Private typedef -----------------------------------------------------------*\/\n\/* USER CODE BEGIN PTD *\/\n\n\/* USER CODE END PTD *\/\n\n\/* Private define ------------------------------------------------------------*\/\n\/* USER CODE BEGIN PD *\/\n\n\/* USER CODE END PD *\/\n\n\/* Private macro -------------------------------------------------------------*\/\n\/* USER CODE BEGIN PM *\/\n\n\/* USER CODE END PM *\/\n\n\/* Private variables ---------------------------------------------------------*\/\nI2C_HandleTypeDef hi2c3;\n\nRTC_HandleTypeDef hrtc;\n\n\/* USER CODE BEGIN PV *\/\n\nConsoleTask CTask;\n__attribute__ ((section(\".ccmram\"))) volatile uint8_t consoleBuf[2048];\n\nBasicFunctions basic;\nRUNLEDTask runledTask;\n\n\/* USER CODE END PV *\/\n...\n\n\/* Private function prototypes -----------------------------------------------*\/\nvoid SystemClock_Config(void);\nstatic void MX_GPIO_Init(void);\nstatic void MX_DMA_Init(void);\nstatic void MX_TIM2_Init(void);\nstatic void MX_SPI1_Init(void);\nstatic void MX_USART6_UART_Init(void);\nstatic void MX_I2C3_Init(void);\nstatic void MX_RTC_Init(void);\n\/* USER CODE BEGIN PFP *\/\nvoid InitConsoleTask(void);\nvoid InitBasicFunctions();\nvoid InitRunLEDTask(void);\n\n\/* USER CODE END PFP *\/\n...\n\/*\n *\n *\/\nvoid InitBasicFunctions()\n{\n        basic = BasicFunctions(&amp;CTask);\n\n        LL_TIM_EnableCounter(TIM2);\n        LL_TIM_EnableIT_UPDATE(TIM2);\n\n        CTask.PRINTF((char *)\"InitBasicFunctions\\r\\n\");\n        CTask.flushTxBuf();\n}\n\n\/*\n *\n *\/\nvoid InitRunLEDTask(void)\n{\n        runledTask = RUNLEDTask(&amp;CTask);\n        runledTask.setEnable(True);\n        basic.RegisterTask(&amp;runledTask);\n        runledTask.registerTimer(basic.getTimerManagerHandle());\n}\n<\/pre>\n\n\n\n<p><strong>main()\uc5d0\uc11c \uc2e4\ud589<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  \/* Initialize all configured peripherals *\/\n  MX_GPIO_Init();\n  MX_DMA_Init();\n  MX_TIM2_Init();\n  MX_SPI1_Init();\n  MX_USART6_UART_Init();\n  MX_I2C3_Init();\n  MX_RTC_Init();\n  \/* USER CODE BEGIN 2 *\/\n  InitConsoleTask();\n  InitBasicFunctions();\n  InitRunLEDTask();\n  \/* USER CODE END 2 *\/\n\n  \/* Infinite loop *\/\n  \/* USER CODE BEGIN WHILE *\/\n  while (1)\n  {\n          CTask.run();\n          basic.run();\n    \/* USER CODE END WHILE *\/\n\n    \/* USER CODE BEGIN 3 *\/\n  }<\/pre>\n\n\n\n<p>\uc774\uc81c LED\uac00 1\ucd08 \uc8fc\uae30\ub85c \uae5c\ubc15\uc774\uba74\uc11c, Task\uc640 Timer \uad6c\uc870\uac00 \uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud558\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ub9c8\ubb34\ub9ac<\/h2>\n\n\n\n<p>\uc774\ubc88 \ub2e8\uacc4\uc5d0\uc11c\ub294 Task\uc640 Timer\uc758 \uad00\ub9ac \uad6c\uc870\ub97c \uc124\uacc4\ud558\uace0, BasicFunctions \uac1d\uccb4\ub97c \ud1b5\ud574 \uc774\ub97c \ud1b5\ud569\uc801\uc73c\ub85c \uc81c\uc5b4\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \ub610\ud55c, RUNLEDTask\ub97c \ub4f1\ub85d\ud558\uc5ec LED \uc810\uba78\uc744 \ud655\uc778\ud568\uc73c\ub85c\uc368 \uad6c\uc870\uac00 \uc62c\ubc14\ub974\uac8c \ub3d9\uc791\ud568\uc744 \uac80\uc99d\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\ub2e4\uc74c \ub2e8\uacc4\uc5d0\uc11c\ub294 \ub354 \ubcf5\uc7a1\ud55c Task\ub97c \ucd94\uac00\ud558\uace0, Console\uacfc \uc5f0\ub3d9\ud558\uc5ec \uc2dc\uc2a4\ud15c \ub3d9\uc791\uc744 \ud655\uc7a5\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc774\ubc88 \ub2e8\uacc4\uc5d0\uc11c\ub294 \ud504\ub85c\uc81d\ud2b8 \uc804\uccb4\uc5d0\uc11c \ub3d9\uc791\ud558\ub294 Task\uc640 Timer\ub97c \uad00\ub9ac\ud558\ub294 \uad6c\uc870\ub97c \uc124\uacc4\ud569\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 BasicFunctions\ub77c\ub294 \uad00\ub9ac \uac1d\uccb4\ub97c \ub9cc\ub4e4\uace0, \uc774 \uac1d\uccb4 \uc548\uc5d0\uc11c Task\uc640 Timer\ub97c \ud1b5\ud569\uc801\uc73c\ub85c \uc81c\uc5b4\ud560 \uc218 \uc788\ub3c4\ub85d \uad6c\uc131\ud569\ub2c8\ub2e4. \ub610\ud55c \uc608\uc81c\ub85c RUNLEDTask\ub97c \ucd94\uac00\ud558\uc5ec LED\uac00 1\ucd08 \uac04\uaca9\uc73c\ub85c \uc810\uba78(blinking)\ub418\ub294 \ub3d9\uc791\uc744 \ud655\uc778\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. 1. Task\uc640 Timer \uac1c\ub150 Task \uac1d\uccb4 Task\ub294 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \ubc18\ubcf5\uc801\uc73c\ub85c \uc2e4\ud589\ub418\ub294 \ub2e8\uc704 \ub3d9\uc791\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,13,12],"tags":[87,43,88,42],"class_list":["post-1775","post","type-post","status-publish","format-standard","hentry","category-blog","category-en","category-ko","tag-c","tag-cpp","tag-firmware","tag-stm32f4"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/twarelab.com\/en\/wp-json\/wp\/v2\/posts\/1775","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/twarelab.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/twarelab.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/twarelab.com\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/twarelab.com\/en\/wp-json\/wp\/v2\/comments?post=1775"}],"version-history":[{"count":5,"href":"https:\/\/twarelab.com\/en\/wp-json\/wp\/v2\/posts\/1775\/revisions"}],"predecessor-version":[{"id":1784,"href":"https:\/\/twarelab.com\/en\/wp-json\/wp\/v2\/posts\/1775\/revisions\/1784"}],"wp:attachment":[{"href":"https:\/\/twarelab.com\/en\/wp-json\/wp\/v2\/media?parent=1775"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/twarelab.com\/en\/wp-json\/wp\/v2\/categories?post=1775"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/twarelab.com\/en\/wp-json\/wp\/v2\/tags?post=1775"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}