From c6a1e7c00cd2946cef7716b205026a907136778b Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Sun, 12 Jul 2026 18:41:28 +0800
Subject: [PATCH] Add ex1.servo-sg90
---
ex1.servo-sg90/Board/miscdev.h | 169 +++
ex1.servo-sg90/MDK-ARM/ISKBoard.uvoptx | 681 ++++++++++++
ex1.servo-sg90/Core/Src/main.c | 199 +++
ex1.servo-sg90/Board/buzzer.c | 191 +++
ex1.servo-sg90/.vscode/stm32flash.bat | 21
ex1.servo-sg90/MDK-ARM/ISKBoard.uvprojx | 899 ++++++++++++++++
ex1.servo-sg90/.vscode/stm32flash.exe | 0
ex1.servo-sg90/Board/servo_sg90.h | 62 +
ex1.servo-sg90/ISKBoard.ioc | 221 ++++
ex1.servo-sg90/Board/miscdev.c | 406 +++++++
ex1.servo-sg90/.vscode/tasks.json | 65 +
ex1.servo-sg90/.gitignore | 47
ex1.servo-sg90/do_clean.bat | 32
ex1.servo-sg90/Board/servo_sg90.c | 124 ++
ex1.servo-sg90/Board/buzzer.h | 37
ex1.servo-sg90/CMakeLists.txt | 72 +
ex1.servo-sg90/Board/CMakeLists.txt | 28
17 files changed, 3,254 insertions(+), 0 deletions(-)
diff --git a/ex1.servo-sg90/.gitignore b/ex1.servo-sg90/.gitignore
new file mode 100644
index 0000000..42d5d2e
--- /dev/null
+++ b/ex1.servo-sg90/.gitignore
@@ -0,0 +1,47 @@
+# ===== .vscode: 只保留下面三个文件 =====
+.vscode/*
+!.vscode/stm32flash.bat
+!.vscode/stm32flash.exe
+!.vscode/tasks.json
+
+# ===== Keil MD: 只保留下面两个文件 =====
+MDK-ARM/*
+!MDK-ARM/ISKBoard.uvoptx
+!MDK-ARM/ISKBoard.uvprojx
+
+# ===== STM32CubeIDE: 忽略下面文件 =====
+.project
+
+# ===== 只保留这两个文件不忽略 =====
+# main.c
+Core/*
+!Core/Src/
+Core/Src/*
+!Core/Src/main.c
+
+# ===== 忽略 CMake 相关生成文件 =====
+.clangd
+.mxproject
+CMakePresets.json
+cmake/
+.settings/
+
+# ===== 忽略启动文件、链接脚本 =====
+*.ld
+startup_stm32*.s
+
+# ===== 忽略厂商 SDK(如果之后 Drivers/ 出现的话)=====
+Drivers/
+Middlewares/
+
+# ===== 忽略编译产物 =====
+build/
+Debug/
+Release/
+*.o
+*.d
+*.a
+*.elf
+*.bin
+*.hex
+*.map
diff --git a/ex1.servo-sg90/.vscode/stm32flash.bat b/ex1.servo-sg90/.vscode/stm32flash.bat
new file mode 100644
index 0000000..0bcacc9
--- /dev/null
+++ b/ex1.servo-sg90/.vscode/stm32flash.bat
@@ -0,0 +1,21 @@
+@echo off
+setlocal
+
+set OBJCOPY=%GCC_BIN%\arm-none-eabi-objcopy.exe
+set PORT=%1
+
+echo ==^ Converting ELF to BIN...
+%OBJCOPY% -O binary %ELF% %BIN%
+if errorlevel 1 (
+ echo objcopy failed!
+ exit b 1
+)
+
+echo ==^ Flashing via %PORT% ...
+%FLASH_EXE% -w %BIN% -v -g 0x0 -b 115200 %PORT%
+if errorlevel 1 (
+ echo stm32flash failed!
+ exit b 1
+)
+
+echo ==^ Done.
\ No newline at end of file
diff --git a/ex1.servo-sg90/.vscode/stm32flash.exe b/ex1.servo-sg90/.vscode/stm32flash.exe
new file mode 100644
index 0000000..a50272f
--- /dev/null
+++ b/ex1.servo-sg90/.vscode/stm32flash.exe
Binary files differ
diff --git a/ex1.servo-sg90/.vscode/tasks.json b/ex1.servo-sg90/.vscode/tasks.json
new file mode 100644
index 0000000..c8d0ec6
--- /dev/null
+++ b/ex1.servo-sg90/.vscode/tasks.json
@@ -0,0 +1,65 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "STM32: Flash via ST-Link(SWD)",
+ "type": "shell",
+ "command": "D:\\Program Files\\ST\\STM32CubeProgrammer\\bin\\STM32_Programmer_CLI.exe",
+ "args": [
+ "-c port=SWD",
+ "-e all",
+ "-w",
+ "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
+ "0x08000000",
+ "-v",
+ "-rst"
+ ],
+ "group": {
+ "kind": "build",
+ "isDefault": false
+ },
+ "problemMatcher": [],
+ "presentation": {
+ "reveal": "always",
+ "panel": "shared",
+ "clear": true
+ }
+ },
+ {
+ "label": "STM32: Flash via stm32flash(UART)",
+ "type": "shell",
+ "command": "${workspaceFolder}/.vscode/stm32flash.bat",
+ "args": [
+ "${input:comPort}"
+ ],
+ "options": {
+ "env": {
+ "PATH": "${env:PATH}",
+ "SystemRoot": "${env:SystemRoot}",
+ "GCC_BIN": "${env:LOCALAPPDATA}\\stm32cube\\bundles\\gnu-tools-for-stm32\\14.3.1+st.2\\bin",
+ "ELF": "${workspaceFolder}\\build\\Release\\ISKBoard.elf",
+ "BIN": "${workspaceFolder}\\build\\Release\\ISKBoard.bin",
+ "FLASH_EXE": "${workspaceFolder}\\.vscode\\stm32flash.exe"
+ }
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": false
+ },
+ "problemMatcher": [],
+ "presentation": {
+ "reveal": "always",
+ "panel": "shared",
+ "clear": true
+ }
+ }
+ ],
+ "inputs": [
+ {
+ "id": "comPort",
+ "type": "promptString",
+ "description": "!!!请确保开发板进入烧录模式,并输入串口号!!!",
+ "default": "COM22"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/ex1.servo-sg90/Board/CMakeLists.txt b/ex1.servo-sg90/Board/CMakeLists.txt
new file mode 100644
index 0000000..c35aeef
--- /dev/null
+++ b/ex1.servo-sg90/Board/CMakeLists.txt
@@ -0,0 +1,28 @@
+cmake_minimum_required(VERSION 3.16)
+
+# 取当前文件夹名,并转成小写作为库名
+get_filename_component(MODULE_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
+string(TOLOWER ${MODULE_NAME} MODULE_NAME_LOWER)
+
+project(${MODULE_NAME_LOWER} C)
+
+# 收集当前目录源码
+file(GLOB MODULE_SRC
+ "${CMAKE_CURRENT_SOURCE_DIR}/*.c"
+)
+
+# 创建静态库
+add_library(${MODULE_NAME_LOWER} STATIC
+ ${MODULE_SRC}
+)
+
+# 头文件搜索路径
+target_include_directories(${MODULE_NAME_LOWER}
+ PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+target_link_libraries(${MODULE_NAME_LOWER}
+ PUBLIC
+ stm32cubemx
+)
\ No newline at end of file
diff --git a/ex1.servo-sg90/Board/buzzer.c b/ex1.servo-sg90/Board/buzzer.c
new file mode 100644
index 0000000..f39e80c
--- /dev/null
+++ b/ex1.servo-sg90/Board/buzzer.c
@@ -0,0 +1,191 @@
+/**********************************************************************
+* Copyright: (C)2024 LingYun IoT System Studio
+* Author: GuoWenxue<guowenxue@gmail.com>
+* Description: ISKBoard buzzer/beeper driver and music play
+*
+* ChangeLog:
+* Version Date Author Description
+* V1.0.0 2024.08.29 GuoWenxue Release initial version
+***********************************************************************/
+
+#include "tim.h"
+#include "buzzer.h"
+
+#define mdelay(ms) HAL_Delay(ms)
+#define ARRAY_SIZE(song) (sizeof(song)/sizeof(song[0]))
+
+/* 音符频率定义(Hz) */
+#define NOTE_C4 524
+#define NOTE_D4 588
+#define NOTE_E4 660
+#define NOTE_F4 698
+#define NOTE_G4 784
+#define NOTE_A4 880
+#define NOTE_B4 988
+#define NOTE_C5 1046
+#define NOTE_D5 1174
+#define NOTE_E5 1318
+#define NOTE_F5 1396
+#define NOTE_G5 1568
+#define NOTE_A5 1760
+#define NOTE_B5 1976
+#define NOTE_C6 2093
+#define REST 0
+
+#define BEAT 400 /* 一拍时长(ms),可自行调整节奏快慢 */
+
+/* 《小星星》简谱:
+ * 1 1 5 5 6 6 5 - 4 4 3 3 2 2 1
+ * 5 5 4 4 3 3 2 - 5 5 4 4 3 3 2
+ * 1 1 5 5 6 6 5 - 4 4 3 3 2 2 1
+ * (C=1, D=2, E=3, F=4, G=5, A=6, B=7)
+ */
+const Note_t twinkle[] =
+{
+ /* Twinkle twinkle little star */
+ {NOTE_C4, BEAT}, {NOTE_C4, BEAT}, {NOTE_G4, BEAT}, {NOTE_G4, BEAT},
+ {NOTE_A4, BEAT}, {NOTE_A4, BEAT}, {NOTE_G4, BEAT * 2},
+
+ /* How I wonder what you are */
+ {NOTE_F4, BEAT}, {NOTE_F4, BEAT}, {NOTE_E4, BEAT}, {NOTE_E4, BEAT},
+ {NOTE_D4, BEAT}, {NOTE_D4, BEAT}, {NOTE_C4, BEAT * 2},
+
+ /* Up above the world so high */
+ {NOTE_G4, BEAT}, {NOTE_G4, BEAT}, {NOTE_F4, BEAT}, {NOTE_F4, BEAT},
+ {NOTE_E4, BEAT}, {NOTE_E4, BEAT}, {NOTE_D4, BEAT * 2},
+
+ /* Like a diamond in the sky */
+ {NOTE_G4, BEAT}, {NOTE_G4, BEAT}, {NOTE_F4, BEAT}, {NOTE_F4, BEAT},
+ {NOTE_E4, BEAT}, {NOTE_E4, BEAT}, {NOTE_D4, BEAT * 2},
+
+ /* Twinkle twinkle little star (repeat) */
+ {NOTE_C4, BEAT}, {NOTE_C4, BEAT}, {NOTE_G4, BEAT}, {NOTE_G4, BEAT},
+ {NOTE_A4, BEAT}, {NOTE_A4, BEAT}, {NOTE_G4, BEAT * 2},
+
+ /* How I wonder what you are (repeat) */
+ {NOTE_F4, BEAT}, {NOTE_F4, BEAT}, {NOTE_E4, BEAT}, {NOTE_E4, BEAT},
+ {NOTE_D4, BEAT}, {NOTE_D4, BEAT}, {NOTE_C4, BEAT * 2},
+};
+const uint32_t twinkle_count = ARRAY_SIZE(twinkle);
+
+/* 《祝你生日快乐》(Happy Birthday to You)
+ * 该曲旋律/歌词经美国法院2015-2016年裁定确认为公有领域作品,可放心使用。
+ * 简谱: 5 5 6 5 1' 7 | 5 5 6 5 2' 1' | 5 5 5' 3' 1' 7 6 | 4' 4' 3' 1' 2' 1'
+ */
+const Note_t happy_birthday[] =
+{
+ /* Happy Birthday to you */
+ {NOTE_G4, BEAT / 2}, {NOTE_G4, BEAT / 2}, {NOTE_A4, BEAT}, {NOTE_G4, BEAT},
+ {NOTE_C5, BEAT}, {NOTE_B4, BEAT * 2},
+
+ /* Happy Birthday to you */
+ {NOTE_G4, BEAT / 2}, {NOTE_G4, BEAT / 2}, {NOTE_A4, BEAT}, {NOTE_G4, BEAT},
+ {NOTE_D5, BEAT}, {NOTE_C5, BEAT * 2},
+
+ /* Happy Birthday dear friend */
+ {NOTE_G4, BEAT / 2}, {NOTE_G4, BEAT / 2}, {NOTE_G5, BEAT}, {NOTE_E5, BEAT},
+ {NOTE_C5, BEAT}, {NOTE_B4, BEAT}, {NOTE_A4, BEAT * 2},
+
+ /* Happy Birthday to you */
+ {NOTE_F5, BEAT / 2}, {NOTE_F5, BEAT / 2}, {NOTE_E5, BEAT}, {NOTE_C5, BEAT},
+ {NOTE_D5, BEAT}, {NOTE_C5, BEAT * 2},
+
+ /* 结尾留白 */
+ {REST, BEAT * 2},
+};
+const uint32_t happy_birthday_count = ARRAY_SIZE(happy_birthday);
+
+/* 《Jingle Bells》(铃儿响叮当)
+ * 1857年James Lord Pierpont创作,早已进入公有领域。
+ * (下面是常见的简化版本,节奏为大致还原,供播放测试使用)
+ */
+const Note_t jingle_bells[] =
+{
+ /* Jingle bells, jingle bells, jingle all the way */
+ {NOTE_E4, BEAT}, {NOTE_E4, BEAT}, {NOTE_E4, BEAT * 2},
+ {NOTE_E4, BEAT}, {NOTE_E4, BEAT}, {NOTE_E4, BEAT * 2},
+ {NOTE_E4, BEAT}, {NOTE_G4, BEAT}, {NOTE_C4, BEAT}, {NOTE_D4, BEAT},
+ {NOTE_E4, BEAT * 4},
+
+ /* Oh what fun it is to ride in a one-horse open sleigh */
+ {NOTE_F4, BEAT}, {NOTE_F4, BEAT}, {NOTE_F4, BEAT}, {NOTE_F4, BEAT},
+ {NOTE_F4, BEAT}, {NOTE_E4, BEAT}, {NOTE_E4, BEAT}, {NOTE_E4, BEAT / 2}, {NOTE_E4, BEAT / 2},
+ {NOTE_E4, BEAT}, {NOTE_D4, BEAT}, {NOTE_D4, BEAT}, {NOTE_E4, BEAT},
+ {NOTE_D4, BEAT * 2}, {NOTE_G4, BEAT * 2},
+
+ /* 结尾留白 */
+ {REST, BEAT * 2},
+};
+const uint32_t jingle_bells_count = ARRAY_SIZE(jingle_bells);
+
+/*
+ *+----------------------------+
+ *| PWM buzzer API |
+ *+----------------------------+
+ */
+
+/**
+ * @brief 设置蜂鸣器发声频率(占空比固定50%)
+ */
+static inline void Buzzer_SetFreq(uint32_t freq)
+{
+ /* TIM1 初始化 PSC = 79,计数时钟 = 80MHz/80 = 1MHz */
+ uint32_t arr = 1000000U / freq - 1U;
+ __HAL_TIM_SET_AUTORELOAD(&htim1, arr);
+ __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, arr / 2U);
+ __HAL_TIM_SET_COUNTER(&htim1, 0);
+}
+
+/**
+ * @brief 让蜂鸣器响 $times 次,每次间隔 $interval 毫秒
+ */
+void beep_start(uint16_t times, uint16_t interval)
+{
+ Buzzer_SetFreq(2700);
+
+ while( times-- )
+ {
+ /* Start buzzer */
+ HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
+
+ mdelay(interval);
+
+ /* Stop buzzer */
+ HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4);
+
+ mdelay(interval);
+ }
+}
+
+/**
+ * @brief 播放单个音符
+ */
+static void Buzzer_PlayNote(uint32_t freq, uint32_t duration_ms)
+{
+ if (freq == 0)
+ {
+ HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4);
+ mdelay(duration_ms);
+ return;
+ }
+
+ Buzzer_SetFreq(freq);
+
+ HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
+ mdelay(duration_ms - 30);
+
+ HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4);
+
+ mdelay(30);
+}
+
+/**
+ * @brief 播放歌曲
+ */
+void Play_Song(const Note_t *song, uint32_t note_count)
+{
+ for (uint32_t i = 0; i < note_count; i++)
+ {
+ Buzzer_PlayNote(song[i].freq, song[i].duration);
+ }
+}
diff --git a/ex1.servo-sg90/Board/buzzer.h b/ex1.servo-sg90/Board/buzzer.h
new file mode 100644
index 0000000..549c1a0
--- /dev/null
+++ b/ex1.servo-sg90/Board/buzzer.h
@@ -0,0 +1,37 @@
+/**********************************************************************
+* Copyright: (C)2024 LingYun IoT System Studio
+* Author: GuoWenxue<guowenxue@gmail.com>
+* Description: ISKBoard buzzer/beeper driver and music play
+*
+* ChangeLog:
+* Version Date Author Description
+* V1.0.0 2024.08.29 GuoWenxue Release initial version
+***********************************************************************/
+
+#ifndef __BUZZER_H
+#define __BUZZER_H
+
+typedef struct
+{
+ uint32_t freq; /* 音符频率,0表示休止 */
+ uint32_t duration; /* 持续时间(ms) */
+} Note_t;
+
+/**
+ * @brief 让蜂鸣器响 $times 次,每次间隔 $interval 毫秒
+ */
+extern void beep_start(uint16_t times, uint16_t interval);
+
+/**
+ * @brief 播放歌曲
+ */
+extern void Play_Song(const Note_t *song, uint32_t note_count);
+
+extern const Note_t twinkle[];
+extern const uint32_t twinkle_count;
+extern const Note_t happy_birthday[];
+extern const uint32_t happy_birthday_count;
+extern const Note_t jingle_bells[];
+extern const uint32_t jingle_bells_count;
+
+#endif
diff --git a/ex1.servo-sg90/Board/miscdev.c b/ex1.servo-sg90/Board/miscdev.c
new file mode 100644
index 0000000..986afbc
--- /dev/null
+++ b/ex1.servo-sg90/Board/miscdev.c
@@ -0,0 +1,406 @@
+/**********************************************************************
+* Copyright: (C)2024 LingYun IoT System Studio
+* Author: GuoWenxue<guowenxue@gmail.com>
+* Description: ISKBoard Hardware Abstract Layer driver
+*
+* ChangeLog:
+* Version Date Author Description
+* V1.0.0 2024.08.29 GuoWenxue Release initial version
+***********************************************************************/
+
+#include "miscdev.h"
+
+/*
+ *+----------------------+
+ *| STM32 GPIO API |
+ *+----------------------+
+ */
+
+void gpio_clk_enable(GPIO_TypeDef *port)
+{
+ if (port == GPIOA) __HAL_RCC_GPIOA_CLK_ENABLE();
+ else if (port == GPIOB) __HAL_RCC_GPIOB_CLK_ENABLE();
+ else if (port == GPIOC) __HAL_RCC_GPIOC_CLK_ENABLE();
+ else if (port == GPIOD) __HAL_RCC_GPIOD_CLK_ENABLE();
+#ifdef GPIOE
+ else if (port == GPIOE) __HAL_RCC_GPIOE_CLK_ENABLE();
+#endif
+#ifdef GPIOF
+ else if (port == GPIOF) __HAL_RCC_GPIOF_CLK_ENABLE();
+#endif
+#ifdef GPIOG
+ else if (port == GPIOG) __HAL_RCC_GPIOG_CLK_ENABLE();
+#endif
+#ifdef GPIOH
+ else if (port == GPIOH) __HAL_RCC_GPIOH_CLK_ENABLE();
+#endif
+}
+
+
+/*
+ *+----------------------+
+ *| GPIO Led/Relay API |
+ *+----------------------+
+ */
+
+/* ISKBoard 有一个继电器 */
+gpio_t relay = { "Relay", GPIOD, GPIO_PIN_2, 1 };
+
+/* ISKBoard 有三个Led灯 */
+gpio_t leds[LedMax] =
+{
+ { "RedLed", GPIOC, GPIO_PIN_9, 0 },
+ { "GreenLed", GPIOC, GPIO_PIN_6, 0 },
+ { "BlueLed", GPIOB, GPIO_PIN_2, 0 },
+};
+
+/**
+ * @brief 继电器初始化:配置继电器控制引脚对应的GPIO
+ */
+void init_relay(void)
+{
+ /* set default output level to inactive */
+ HAL_GPIO_WritePin(relay.group, relay.pin, !relay.active);
+
+ return;
+}
+
+/**
+ * @brief 控制继电器的开关状态
+ * @param status: ON 或 OFF
+ */
+void turn_relay(int status)
+{
+ GPIO_PinState level;
+
+ level = status==OFF ? !relay.active : relay.active;
+ HAL_GPIO_WritePin(relay.group, relay.pin, level);
+}
+
+/**
+ * @brief LED初始化:配置各LED对应的GPIO状态。
+ */
+void init_led(void)
+{
+ int which;
+
+ /* Initial all leds GPIO */
+ for(which=0; which<LedMax; which++)
+ {
+ /* set default output level to inactive */
+ HAL_GPIO_WritePin(leds[which].group, leds[which].pin, !leds[which].active);
+ }
+
+ return;
+}
+
+/**
+ * @brief 控制指定LED的开关状态
+ * @param which: LED编号(参考 lednum_t,如 Led_R/Led_G/Led_B)
+ * @param status: ON 或 OFF
+ */
+void turn_led(int which, int status)
+{
+ GPIO_PinState level;
+
+ if( which >= LedMax )
+ return ;
+
+ level = status==ON ? leds[which].active : !leds[which].active;
+ HAL_GPIO_WritePin(leds[which].group, leds[which].pin, level);
+}
+
+/**
+ * @brief 翻转指定LED当前状态(亮变灭,灭变亮)
+ * @param which: LED编号(参考 lednum_t)
+ */
+void toggle_led(int which)
+{
+ if( which >= LedMax )
+ return ;
+
+ HAL_GPIO_TogglePin(leds[which].group, leds[which].pin);
+}
+
+/**
+ * @brief 阻塞式闪烁指定LED一次(亮interval毫秒,灭interval毫秒)
+ * @param which: LED编号(参考 lednum_t)
+ * @param interval: 亮灭各自持续时间(ms)
+ */
+void blink_led(int which, uint32_t interval)
+{
+ turn_led(which, ON);
+ mdelay(interval);
+
+ turn_led(which, OFF);
+ mdelay(interval);
+}
+
+/**
+ * @brief 绿灯"滴-答"双闪心跳灯:模拟真实心跳节奏(两次快闪 + 一段停顿).
+ */
+void heartbeat_led(void)
+{
+ /* 亮100ms(滴) -> 灭100ms -> 亮100ms(答) -> 灭700ms(停顿) -> 循环 */
+ static const uint32_t hb_duration[4] = {100, 100, 100, 700};
+ static const uint8_t hb_status[4] = {ON, OFF, ON, OFF};
+
+ static uint8_t state = 0;
+ static uint32_t last_tick = 0;
+ static uint8_t first_run = 1;
+
+ uint32_t now = HAL_GetTick();
+
+ if (first_run)
+ {
+ turn_led(Led_G, hb_status[state]);
+ last_tick = now;
+ first_run = 0;
+ }
+
+ if (now - last_tick >= hb_duration[state])
+ {
+ state = (state + 1) % 4;
+ turn_led(Led_G, hb_status[state]);
+ last_tick = now;
+ }
+}
+
+/*
+ *+----------------------+
+ *| GPIO Key API |
+ *+----------------------+
+ */
+ /* 全局按键状态位图定义,初始为0(所有按键都未按下) */
+int g_keys_status = 0;
+
+/**
+ * @brief GPIO外部中断统一回调函数(HAL库弱函数重写),
+ * 按键触发的EXTI中断都会进入这里,根据引脚号区分是哪个按键按下
+ * @param GPIO_Pin: 触发中断的引脚号(如 GPIO_PIN_12/13/14)
+ */
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+ if( GPIO_PIN_12 == GPIO_Pin ) /* Key1 */
+ {
+ g_keys_status |= KEY1_PRESSED;
+ }
+ else if( GPIO_PIN_13 == GPIO_Pin ) /* Key2 */
+ {
+ g_keys_status |= KEY2_PRESSED;
+ }
+ else if( GPIO_PIN_14 == GPIO_Pin ) /* Key3 */
+ {
+ g_keys_status |= KEY3_PRESSED;
+ }
+}
+
+/*
+ *+----------------------+
+ *| printf API |
+ *+----------------------+
+ */
+
+/* gcc 编译器的 printf 将会调用 __io_putchar() 函数,实现最终的字符打印
+ * keil编译器的 printf 将会调用 fputc() 函数,实现最终的字符打印
+ * 这里我们定义一个宏 PUTCHAR_PROTOTYPE 来兼容两个编译器所需要的函数原型
+ *
+ * 注意:
+ * 1. Keil5 工程需要勾选:Options for Target -> Target -> Use MicroLIB
+ * 2. Keil5 的编译器 armclang(AC6) 会定义 __GNUC__ 宏,而旧版 armcc(AC5) 则不会
+ */
+#if defined(__ARMCC_VERSION) /* */
+#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
+#elif defined(__GNUC__) /* GCC */
+#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
+#endif
+
+PUTCHAR_PROTOTYPE
+{
+ /* 调用STM32 HAL库的串口发送函数,将printf要打印的这个字符通过串口发送出去 */
+ HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
+ return ch;
+}
+
+/*
+ *+----------------------------+
+ *| ADC noisy & lux sensor API |
+ *+----------------------------+
+ */
+
+#include "adc.h"
+
+/**
+ * @brief 读取指定通道的ADC值
+ * @param channel: 通道号,例如 ADC_CHANNEL_15 / ADC_CHANNEL_16
+ * @param value: 读取结果输出指针
+ * @retval 0 成功, -1 失败
+ */
+int adc_read_channel(uint32_t channel, uint32_t *value)
+{
+ ADC_ChannelConfTypeDef sConfig = {0};
+ uint32_t timeout = 0xffffff;
+
+ /* 咪头(麦克风)输出的是交流信号,叠加在某个直流偏置上。 当声音信号处于波形过零点附近时,
+ * 2.5 个采样周期极短,ADC 输入阻抗在如此短的时间内无法对麦克风输出的高阻信号完成充电,
+ * 信号还没稳定就完成了采样,所以这里修改采样时间为 247.5 Cycles。 */
+ sConfig.Channel = channel;
+ sConfig.Rank = ADC_REGULAR_RANK_1;
+ sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
+ sConfig.SingleDiff = ADC_SINGLE_ENDED;
+ sConfig.OffsetNumber = ADC_OFFSET_NONE;
+ sConfig.Offset = 0;
+
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ return -1;
+ }
+
+ HAL_ADC_Start(&hadc1);
+
+ if (HAL_ADC_PollForConversion(&hadc1, timeout) != HAL_OK)
+ {
+ HAL_ADC_Stop(&hadc1);
+ return -1;
+ }
+
+ *value = HAL_ADC_GetValue(&hadc1);
+ HAL_ADC_Stop(&hadc1);
+
+ return 0;
+}
+
+/**
+ * @brief 在指定时间窗口内对麦克风多次采样,返回峰峰值作为响度
+ * @param noisy: 响度输出(峰峰值,范围 0~4095)
+ * @param window_ms: 采样时间窗口,建议 50~100ms(覆盖完整音节)
+ * @retval 0表示成功,-1 表示失败
+ */
+int adc_read_noisy_peak(uint32_t *noisy, uint32_t window_ms)
+{
+ uint32_t val;
+ uint32_t max_val = 0;
+ uint32_t min_val = 0xFFFFFFFF;
+ uint32_t deadline = HAL_GetTick() + window_ms;
+
+ while (HAL_GetTick() < deadline)
+ {
+ if (adc_read_channel(ADC_CHANNEL_16, &val) != 0)
+ return -1;
+
+ if (val > max_val) max_val = val;
+ if (val < min_val) min_val = val;
+ }
+
+ /* 峰峰值消除直流偏置影响,更真实反映响度 */
+ *noisy = (max_val > min_val) ? (max_val - min_val) : 0;
+ return 0;
+}
+
+/* ------------------- Lux 滤波相关参数 ------------------- */
+#define LUX_SAMPLE_COUNT 10 /* 每次采集的原始样本数 */
+#define LUX_TRIM_COUNT 2 /* 排序后,头尾各丢弃的样本数 */
+
+/**
+ * @brief 简单冒泡排序(数据量很小,不追求性能)
+ */
+static void sort_u32(uint32_t *arr, int n)
+{
+ for (int i = 0; i < n - 1; i++)
+ {
+ for (int j = 0; j < n - 1 - i; j++)
+ {
+ if (arr[j] > arr[j + 1])
+ {
+ uint32_t tmp = arr[j];
+ arr[j] = arr[j + 1];
+ arr[j + 1] = tmp;
+ }
+ }
+ }
+}
+
+/**
+ * @brief 多次采样光照度ADC值,排序后去掉两端的离群样本,再取平均
+ * @param lux: 输出参数,滤波后的光照度值
+ * @retval 0 成功, -1 失败
+ */
+static int adc_read_lux_filtered(uint32_t *lux)
+{
+ uint32_t samples[LUX_SAMPLE_COUNT];
+ uint32_t sum = 0;
+ int valid_count;
+
+ /* 多次采样光照度ADC值 */
+ for (int i = 0; i < LUX_SAMPLE_COUNT; i++)
+ {
+ if (adc_read_channel(ADC_CHANNEL_15, &samples[i]) != 0)
+ return -1;
+ }
+
+ /* 将多次采样的数据排序 */
+ sort_u32(samples, LUX_SAMPLE_COUNT);
+
+ /* 丢弃排序后头尾各 LUX_TRIM_COUNT 个可能的离群值 */
+ valid_count = LUX_SAMPLE_COUNT - 2 * LUX_TRIM_COUNT;
+ if (valid_count <= 0)
+ {
+ /* 参数配置不合理时兜底,避免除0 */
+ valid_count = LUX_SAMPLE_COUNT;
+ for (int i = 0; i < LUX_SAMPLE_COUNT; i++)
+ sum += samples[i];
+ }
+ else
+ {
+ for (int i = LUX_TRIM_COUNT; i < LUX_SAMPLE_COUNT - LUX_TRIM_COUNT; i++)
+ sum += samples[i];
+ }
+
+ *lux = sum / valid_count;
+
+ return 0;
+}
+
+ /**
+ * @brief 采集光照度与噪声值
+ * @param lux: 输出参数,采集到的光照度值
+ * @param noisy: 输出参数,采集到的噪声值
+ * @return 0表示成功,-1 表示失败
+ */
+int adc_sample_lux_noisy(uint32_t *lux, uint32_t *noisy)
+{
+ if (adc_read_lux_filtered(lux) != 0)
+ return -1;
+
+ if (adc_read_noisy_peak(noisy, 50) != 0)
+ return -2;
+
+ return 0;
+}
+
+/*
+ *+----------------------------+
+ *| Timer delay API |
+ *+----------------------------+
+ */
+#include "tim.h"
+
+/**
+ * @brief 微秒级延时,最大支持 60000us,更长延时可以使用 HAL_Delay()
+ * @param us: 延时时长(微秒)
+ */
+void udelay(uint16_t us)
+{
+ uint16_t differ = 60000-us;
+
+ HAL_TIM_Base_Start(&htim6);
+
+ __HAL_TIM_SET_COUNTER(&htim6, differ);
+
+ while( differ < 60000 )
+ {
+ differ=__HAL_TIM_GET_COUNTER(&htim6);
+ }
+
+ HAL_TIM_Base_Stop(&htim6);
+}
diff --git a/ex1.servo-sg90/Board/miscdev.h b/ex1.servo-sg90/Board/miscdev.h
new file mode 100644
index 0000000..6ecb62b
--- /dev/null
+++ b/ex1.servo-sg90/Board/miscdev.h
@@ -0,0 +1,169 @@
+/**********************************************************************
+* Copyright: (C)2024 LingYun IoT System Studio
+* Author: GuoWenxue<guowenxue@gmail.com>
+* Description: ISKBoard Hardware Abstract Layer driver
+*
+* ChangeLog:
+* Version Date Author Description
+* V1.0.0 2024.08.29 GuoWenxue Release initial version
+***********************************************************************/
+
+#ifndef __MISCDEV_H
+#define __MISCDEV_H
+
+#include <stdio.h>
+
+#include "stm32l4xx_hal.h"
+#include "usart.h"
+#include "buzzer.h"
+
+/* 定义ON/OFF两个宏,这样在代码中使用比 1/0 更具有可读性 */
+#define OFF 0
+#define ON 1
+
+/*
+ *+----------------------+
+ *| STM32 GPIO API |
+ *+----------------------+
+ */
+
+
+/* 定义一个gpio的结构体,用来描述这个引脚的相关信息 */
+typedef struct gpio_s
+{
+ const char *name;
+ GPIO_TypeDef *group;
+ uint16_t pin;
+ int active; /* 1 for active high, 0 for active low */
+} gpio_t;
+
+extern void gpio_clk_enable(GPIO_TypeDef *port);
+
+/*
+ *+----------------------+
+ *| GPIO Relay API |
+ *+----------------------+
+ */
+
+/**
+ * @brief 继电器初始化:配置继电器控制引脚对应的GPIO
+ */
+extern void init_relay(void);
+
+/**
+ * @brief 控制继电器的开关状态
+ * @param status: ON 或 OFF
+ */
+extern void turn_relay(int status);
+
+/*
+ *+----------------------+
+ *| GPIO Led API |
+ *+----------------------+
+ */
+
+/* 定义了一个枚举,分别表示RGB三个灯的索引:
+ * 枚举的第1个成员,如果没赋值则其值为0,后面的成员值永远是前面成员的值加1.
+ */
+typedef enum
+{
+ Led_R, /* 其值为0 */
+ Led_G, /* 其值为1 */
+ Led_B, /* 其值为2 */
+ LedMax,/* 其值为3,刚好是Led的总数 */
+} lednum_t;
+
+/**
+ * @brief LED初始化:配置各LED对应的GPIO状态。
+ */
+extern void init_led(void);
+
+/**
+ * @brief 控制指定LED的开关状态
+ * @param which: LED编号(参考 lednum_t,如 Led_R/Led_G/Led_B)
+ * @param status: ON 或 OFF
+ */
+extern void turn_led(int which, int status);
+
+/**
+ * @brief 翻转指定LED当前状态(亮变灭,灭变亮)
+ * @param which: LED编号(参考 lednum_t)
+ */
+extern void toggle_led(int which);
+
+/**
+ * @brief 阻塞式闪烁指定LED一次(亮interval毫秒,灭interval毫秒)
+ * @param which: LED编号(参考 lednum_t)
+ * @param interval: 亮灭各自持续时间(ms)
+ */
+extern void blink_led(int which, uint32_t interval);
+
+/**
+ * @brief 绿灯"滴-答"双闪心跳灯:模拟真实心跳节奏(两次快闪 + 一段停顿).
+ */
+extern void heartbeat_led(void);
+
+/*
+ *+----------------------+
+ *| GPIO Led API |
+ *+----------------------+
+ */
+
+/* 定义了一个枚举,分别表示RGB三个灯的索引:
+ * 枚举的第1个成员,如果没赋值则其值为0,后面的成员值永远是前面成员的值加1.
+ */
+typedef enum
+{
+ Key1, /* 其值为0 */
+ Key2, /* 其值为1 */
+ Key3, /* 其值为2 */
+ KeyMax,/* 其值为3,刚好是Key的总数 */
+} keynum_t;
+
+/* 按键状态位掩码:对应 g_keys_status 中的第 Key1/Key2/Key3 位被按下 */
+#define KEY1_PRESSED (1<<Key1)
+#define KEY2_PRESSED (1<<Key2)
+#define KEY3_PRESSED (1<<Key3)
+
+/* 全局按键状态位图,每一位代表当前按键是否处于"已按下"状态,由中断逻辑置位 */
+extern int g_keys_status;
+
+/* 判断指定按键当前是否处于按下状态 */
+#define key_pressed(key) (g_keys_status & (1<<key) )
+
+/* 清除指定按键的按下标志 */
+#define key_clear(key) (g_keys_status &= ~(1<<key) )
+
+/*
+ *+----------------------------+
+ *| ADC noisy & lux sensor API |
+ *+----------------------------+
+ */
+
+ /**
+ * @brief 采集光照度与噪声值
+ * @param lux: 输出参数,采集到的光照度值
+ * @param noisy: 输出参数,采集到的噪声值
+ * @return 0表示成功,-1 表示失败
+ */
+extern int adc_sample_lux_noisy(uint32_t *lux, uint32_t *noisy);
+
+/*
+ *+----------------------------+
+ *| Timer delay API |
+ *+----------------------------+
+ */
+
+/**
+ * @brief 微秒级延时,最大支持 60000us,更长延时可以使用 HAL_Delay()
+ * @param us: 延时时长(微秒)
+ */
+extern void udelay(uint16_t us);
+
+/**
+ * @brief 毫秒秒级延时,直接使用 HAL_Delay(),方便代码可读性
+ * @param ms: 延时时长(毫秒)
+ */
+#define mdelay(ms) HAL_Delay(ms)
+
+#endif /* __MISCDEV_H */
diff --git a/ex1.servo-sg90/Board/servo_sg90.c b/ex1.servo-sg90/Board/servo_sg90.c
new file mode 100644
index 0000000..79e64bc
--- /dev/null
+++ b/ex1.servo-sg90/Board/servo_sg90.c
@@ -0,0 +1,124 @@
+/**********************************************************************
+* Copyright: (C)2024 LingYun IoT System Studio
+* Author: GuoWenxue<guowenxue@gmail.com>
+* Description: SG90 Servo Motor Driver for ISKBoard
+*
+* ChangeLog:
+* Version Date Author Description
+* V1.0.0 2024.08.29 GuoWenxue Release initial version
+***********************************************************************/
+
+/**
+ * SG90 舵机控制(0° ~ 180°) : https://detail.tmall.com/item.htm?id=615779197448
+ * - 正极(红色) <-> 5V
+ * - 负极(棕色) <-> GND
+ * - 信号(黄色) <-> PA1(PWM/TIM2_CH2)
+ *
+ * 舵机控制原理:
+ * - 舵机的控制需要一个 PWM 信号,频率一般为 50Hz (周期 20ms)
+ * - 脉宽范围约为 0.5ms ~ 2.5ms。以 180° 角为例,对应的控制关系为:
+ * 角度 脉宽
+ * 0° 500 µs
+ * 45° 700 µs
+ * 90° 1500 µs
+ * 135° 2000 µs
+ * 180° 2500 µs
+ * - 角度与脉宽的线性关系公式为:pulse = 500 + angle * 2000 / 180
+ *
+ * STM32CubeMX 定时器 TIM 参数配置:
+ * 预分频(htim.Init.Prescaler) = SYS_CLK-1 -> 定时器时钟 1 MHz (1 µs/tick)
+ * 自动重装(htim.Init.Period) = 20000-1 -> PWM 周期 20 ms (20000 µs)
+ * htim.Init.AutoReloadPreload = Enable
+ * 脉宽范围(sConfigOC.Pulse) = 1500 -> 默认 90° (1500 µs)
+ */
+
+#include "stm32l4xx_hal.h"
+#include "miscdev.h"
+#include "servo_sg90.h"
+#include "tim.h"
+
+/* SG90 舵机控制连接单片机引脚: PA1/TIM2_CH2 */
+#define SERVO_TIMER &htim2
+#define SERVO_CHANNEL TIM_CHANNEL_2
+
+/**
+ * @brief 初始化舵机, 启动 TIM PWM 输出。
+ */
+void Servo_Init(void)
+{
+ /* 启动前先设定一个明确的初始角度,避免上电盲目抖动 */
+ Servo_SetAngle(SERVO_DEFAULT_ANG);
+
+ HAL_TIM_PWM_Start(SERVO_TIMER, SERVO_CHANNEL);
+}
+
+/**
+ * @brief 设置舵机角度
+ * @param angle 可传 0 ~ 180,但超出钳位值范围自动钳位
+ */
+void Servo_SetAngle(int angle)
+{
+ int pulse;
+
+ angle = CLAMP_ANGLE(angle);
+
+ /* 脉宽线性公式:利用 32 位 int 计算,彻底免除溢出隐患 */
+ pulse = SERVO_MIN_PULSE + (angle * (SERVO_MAX_PULSE - SERVO_MIN_PULSE)) / SERVO_MAX_ANGLE;
+
+ __HAL_TIM_SET_COMPARE(SERVO_TIMER, SERVO_CHANNEL, (uint16_t)pulse);
+}
+
+/**
+ * @brief 直接停止 PWM 输出, 立即停止舵机。
+ */
+void Servo_Stop(void)
+{
+ HAL_TIM_PWM_Stop(SERVO_TIMER, SERVO_CHANNEL);
+}
+
+/**
+ * @brief 转到安全角度后,再停止舵机
+ * @param safe_angle 停止前舵机转到的角度 (超出钳位值范围设置默认角度)
+ */
+void Servo_SafeStop(int safe_angle)
+{
+ /* 超出钳位值范围设置默认角度 */
+ if (safe_angle <= SERVO_MIN_ANGLE || safe_angle > SERVO_MAX_ANGLE) {
+ safe_angle = SERVO_DEFAULT_ANG;
+ }
+
+ Servo_SetAngle(safe_angle);
+
+ /* SG90 空载约 100 ms/60°,转 180° 约需 300ms */
+ mdelay(1000);
+
+ Servo_Stop();
+}
+
+/**
+ * @brief 舵机测试函数
+ */
+void Servo_Test(void)
+{
+ printf("Servo Start\r\n");
+ Servo_Init();
+ mdelay(2000);
+
+ Servo_SetAngle(0);
+ mdelay(2000);
+
+ Servo_SetAngle(90);
+ mdelay(2000);
+
+ Servo_SetAngle(180);
+ mdelay(2000);
+
+ Servo_SetAngle(90);
+ mdelay(2000);
+
+ Servo_SetAngle(0);
+ mdelay(2000);
+
+ printf("Servo Stop\r\n");
+ Servo_SafeStop(SERVO_DEFAULT_ANG);
+}
diff --git a/ex1.servo-sg90/Board/servo_sg90.h b/ex1.servo-sg90/Board/servo_sg90.h
new file mode 100644
index 0000000..90e11be
--- /dev/null
+++ b/ex1.servo-sg90/Board/servo_sg90.h
@@ -0,0 +1,62 @@
+/**********************************************************************
+* Copyright: (C)2024 LingYun IoT System Studio
+* Author: GuoWenxue<guowenxue@gmail.com>
+* Description: SG90 Servo Motor Driver for ISKBoard
+*
+* ChangeLog:
+* Version Date Author Description
+* V1.0.0 2024.08.29 GuoWenxue Release initial version
+***********************************************************************/
+
+#ifndef __SERVO_SG90_H
+#define __SERVO_SG90_H
+
+/* SG90 的物理行程一般标称 0°~180°,但实际齿轮限位比这个略窄(大概 170°~185°)
+ * 如果你让它往超过物理极限的角度硬顶:
+ * 1. 电机持续出力试图转到不存在的位置
+ * 2. 内部齿轮卡死 -> 长时间堵转
+ * 3. 大电流持续流过线圈 -> 发热、烧线圈、融塑料齿轮
+ * 钳位角度到 1°~180°(更保守 5°~175°)就给机械留了一点余量,避免顶死。
+ */
+
+/* 舵机参数宏定义,方便后期微调 */
+#define SERVO_MIN_ANGLE 5 // 钳位最小角度
+#define SERVO_MAX_ANGLE 175 // 钳位最大角度
+#define SERVO_MIN_PULSE 500 // 0度对应的脉宽(us)
+#define SERVO_MAX_PULSE 2500 // 180度对应的脉宽(us)
+#define SERVO_DEFAULT_ANG 90 // 90度上电瞬间不容易堵转、卡死、发热
+
+/* 通用角度钳位宏 */
+#define CLAMP_ANGLE(angle) \
+ (((angle) < SERVO_MIN_ANGLE) ? SERVO_MIN_ANGLE : \
+ ((angle) > SERVO_MAX_ANGLE) ? SERVO_MAX_ANGLE : \
+ (angle))
+
+/**
+ * @brief 初始化舵机, 启动 TIM PWM 输出。
+ */
+void Servo_Init(void);
+
+/**
+ * @brief 设置舵机角度
+ * @param angle 可传 0 ~ 180,但超出钳位值范围自动钳位
+ */
+void Servo_SetAngle(int angle);
+
+/**
+ * @brief 直接停止 PWM 输出, 立即停止舵机
+ */
+void Servo_Stop(void);
+
+/**
+ * @brief 转到安全角度后,再停止舵机
+ * @param safe_angle 停止前舵机转到的角度 (超出钳位值范围设置默认角度)
+ */
+void Servo_SafeStop(int safe_angle);
+
+/**
+ * @brief 舵机测试函数
+ */
+void Servo_Test(void);
+
+#endif
diff --git a/ex1.servo-sg90/CMakeLists.txt b/ex1.servo-sg90/CMakeLists.txt
new file mode 100644
index 0000000..6832159
--- /dev/null
+++ b/ex1.servo-sg90/CMakeLists.txt
@@ -0,0 +1,72 @@
+cmake_minimum_required(VERSION 3.22)
+
+#
+# This file is generated only once,
+# and is not re-generated if converter is called multiple times.
+#
+# User is free to modify the file as much as necessary
+#
+
+# Setup compiler settings
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+set(CMAKE_C_EXTENSIONS ON)
+
+
+# Define the build type
+if(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE "Debug")
+endif()
+
+# Set the project name
+set(CMAKE_PROJECT_NAME ISKBoard)
+
+# Enable compile command to ease indexing with e.g. clangd
+set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
+
+# Core project settings
+project(${CMAKE_PROJECT_NAME})
+message("Build type: " ${CMAKE_BUILD_TYPE})
+
+# Enable CMake support for ASM and C languages
+enable_language(C ASM)
+
+# Create an executable object type
+add_executable(${CMAKE_PROJECT_NAME})
+
+# Add STM32CubeMX generated sources
+add_subdirectory(cmake/stm32cubemx)
+
+# Add our custom module subdirectories here
+add_subdirectory(Board)
+
+# Link directories setup
+target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE
+ # Add user defined library search paths
+)
+
+# Add sources to executable
+target_sources(${CMAKE_PROJECT_NAME} PRIVATE
+ # Add user sources here
+)
+
+# Add include paths
+target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
+ # Add user defined include paths
+)
+
+# Add project symbols (macros)
+target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
+ # Add user defined symbols
+)
+
+# Remove wrong libob.a library dependency when using cpp files
+list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_LIBRARIES ob)
+
+# Add linked libraries
+target_link_libraries(${CMAKE_PROJECT_NAME}
+ stm32cubemx
+ board
+
+ # Add user defined libraries
+)
diff --git a/ex1.servo-sg90/Core/Src/main.c b/ex1.servo-sg90/Core/Src/main.c
new file mode 100644
index 0000000..143ccdf
--- /dev/null
+++ b/ex1.servo-sg90/Core/Src/main.c
@@ -0,0 +1,199 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2026 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "adc.h"
+#include "tim.h"
+#include "usart.h"
+#include "gpio.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "miscdev.h"
+#include "servo_sg90.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+#define THRESHOLD_LUX 5
+#define THRESHOLD_NOISY 1000
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+
+ /* USER CODE BEGIN 1 */
+
+ /* USER CODE END 1 */
+
+ /* MCU Configuration--------------------------------------------------------*/
+
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ /* USER CODE BEGIN Init */
+
+ /* USER CODE END Init */
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ /* USER CODE BEGIN SysInit */
+
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_USART1_UART_Init();
+ MX_ADC1_Init();
+ MX_TIM6_Init();
+ MX_TIM1_Init();
+ MX_TIM2_Init();
+ /* USER CODE BEGIN 2 */
+ init_led();
+ beep_start(2, 300);
+
+ printf("ISKBoard: SG90 Servo Demo.\r\n");
+ /* USER CODE END 2 */
+
+ /* Infinite loop */
+ /* USER CODE BEGIN WHILE */
+ while (1)
+ {
+ Servo_Test();
+ /* USER CODE END WHILE */
+
+ /* USER CODE BEGIN 3 */
+ }
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+
+ /** Configure the main internal regulator output voltage
+ */
+ if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /** Initializes the RCC Oscillators according to the specified parameters
+ * in the RCC_OscInitTypeDef structure.
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ RCC_OscInitStruct.PLL.PLLM = 1;
+ RCC_OscInitStruct.PLL.PLLN = 20;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
+ RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
+ RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /** Initializes the CPU, AHB and APB buses clocks
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/* USER CODE BEGIN 4 */
+
+/* USER CODE END 4 */
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ /* USER CODE BEGIN Error_Handler_Debug */
+ /* User can add his own implementation to report the HAL error return state */
+ __disable_irq();
+ while (1)
+ {
+ }
+ /* USER CODE END Error_Handler_Debug */
+}
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
diff --git a/ex1.servo-sg90/ISKBoard.ioc b/ex1.servo-sg90/ISKBoard.ioc
new file mode 100644
index 0000000..3e28b53
--- /dev/null
+++ b/ex1.servo-sg90/ISKBoard.ioc
@@ -0,0 +1,221 @@
+#MicroXplorer Configuration settings - do not modify
+ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_15
+ADC1.CommonPathInternal=null|null|null|null
+ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag,master,NbrOfConversion,CommonPathInternal
+ADC1.NbrOfConversion=1
+ADC1.NbrOfConversionFlag=1
+ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE
+ADC1.Rank-0\#ChannelRegularConversion=1
+ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5
+ADC1.master=1
+CAD.formats=
+CAD.pinconfig=
+CAD.provider=
+File.Version=6
+GPIO.groupedBy=Group By Peripherals
+KeepUserPlacement=false
+Mcu.CPN=STM32L431RCT6
+Mcu.Family=STM32L4
+Mcu.IP0=ADC1
+Mcu.IP1=NVIC
+Mcu.IP2=RCC
+Mcu.IP3=SYS
+Mcu.IP4=TIM1
+Mcu.IP5=TIM2
+Mcu.IP6=TIM6
+Mcu.IP7=USART1
+Mcu.IPNb=8
+Mcu.Name=STM32L431R(B-C)Tx
+Mcu.Package=LQFP64
+Mcu.Pin0=PC14-OSC32_IN (PC14)
+Mcu.Pin1=PC15-OSC32_OUT (PC15)
+Mcu.Pin10=PB14
+Mcu.Pin11=PC6
+Mcu.Pin12=PC9
+Mcu.Pin13=PA9
+Mcu.Pin14=PA10
+Mcu.Pin15=PA11
+Mcu.Pin16=PD2
+Mcu.Pin17=VP_SYS_VS_Systick
+Mcu.Pin18=VP_TIM6_VS_ClockSourceINT
+Mcu.Pin2=PH0-OSC_IN (PH0)
+Mcu.Pin3=PH1-OSC_OUT (PH1)
+Mcu.Pin4=PA1
+Mcu.Pin5=PB0
+Mcu.Pin6=PB1
+Mcu.Pin7=PB2
+Mcu.Pin8=PB12
+Mcu.Pin9=PB13
+Mcu.PinsNb=19
+Mcu.ThirdPartyNb=0
+Mcu.UserConstants=
+Mcu.UserName=STM32L431RCTx
+MxCube.Version=6.18.0
+MxDb.Version=DB.6.0.180
+NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.EXTI15_10_IRQn=true\:2\:0\:true\:false\:true\:true\:true\:true
+NVIC.ForceEnableDMAVector=true
+NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
+NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.SysTick_IRQn=true\:1\:0\:true\:false\:true\:false\:true\:false
+NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+PA1.Signal=S_TIM2_CH2
+PA10.Mode=Asynchronous
+PA10.Signal=USART1_RX
+PA11.GPIOParameters=GPIO_PuPd
+PA11.GPIO_PuPd=GPIO_PULLDOWN
+PA11.Locked=true
+PA11.Signal=S_TIM1_CH4
+PA9.Mode=Asynchronous
+PA9.Signal=USART1_TX
+PB0.Signal=ADCx_IN15
+PB1.Signal=ADCx_IN16
+PB12.GPIOParameters=GPIO_ModeDefaultEXTI
+PB12.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING
+PB12.Locked=true
+PB12.Signal=GPXTI12
+PB13.GPIOParameters=GPIO_ModeDefaultEXTI
+PB13.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING
+PB13.Locked=true
+PB13.Signal=GPXTI13
+PB14.GPIOParameters=GPIO_ModeDefaultEXTI
+PB14.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING
+PB14.Locked=true
+PB14.Signal=GPXTI14
+PB2.Locked=true
+PB2.Signal=GPIO_Output
+PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator
+PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN
+PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator
+PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT
+PC6.Locked=true
+PC6.Signal=GPIO_Output
+PC9.Locked=true
+PC9.Signal=GPIO_Output
+PD2.Locked=true
+PD2.Signal=GPIO_Output
+PH0-OSC_IN\ (PH0).Mode=HSE-External-Oscillator
+PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN
+PH1-OSC_OUT\ (PH1).Mode=HSE-External-Oscillator
+PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT
+PinOutPanel.RotationAngle=0
+ProjectManager.AskForMigrate=true
+ProjectManager.BackupPrevious=false
+ProjectManager.CompilerLinker=GCC
+ProjectManager.CompilerOptimize=6
+ProjectManager.ComputerToolchain=false
+ProjectManager.CoupleFile=true
+ProjectManager.CustomerFirmwarePackage=
+ProjectManager.DefaultFWLocation=true
+ProjectManager.DeletePrevious=true
+ProjectManager.DeviceId=STM32L431RCTx
+ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.18.2
+ProjectManager.FreePins=false
+ProjectManager.FreePinsContext=
+ProjectManager.HalAssertFull=false
+ProjectManager.HeapSize=0x200
+ProjectManager.KeepUserCode=true
+ProjectManager.LastFirmware=true
+ProjectManager.LibraryCopy=1
+ProjectManager.MainLocation=Core/Src
+ProjectManager.NoMain=false
+ProjectManager.PreviousToolchain=
+ProjectManager.ProjectBuild=false
+ProjectManager.ProjectFileName=ISKBoard.ioc
+ProjectManager.ProjectName=ISKBoard
+ProjectManager.ProjectStructure=
+ProjectManager.RegisterCallBack=
+ProjectManager.StackSize=0x400
+ProjectManager.TargetToolchain=CMake
+ProjectManager.ToolChainLocation=
+ProjectManager.UAScriptAfterPath=
+ProjectManager.UAScriptBeforePath=
+ProjectManager.UnderRoot=false
+ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_TIM6_Init-TIM6-false-HAL-true,6-MX_TIM1_Init-TIM1-false-HAL-true
+RCC.ADCFreq_Value=32000000
+RCC.AHBFreq_Value=80000000
+RCC.APB1Freq_Value=80000000
+RCC.APB1TimFreq_Value=80000000
+RCC.APB2Freq_Value=80000000
+RCC.APB2TimFreq_Value=80000000
+RCC.CortexFreq_Value=80000000
+RCC.FCLKCortexFreq_Value=80000000
+RCC.FamilyName=M
+RCC.HCLKFreq_Value=80000000
+RCC.HSE_VALUE=8000000
+RCC.HSI48_VALUE=48000000
+RCC.HSI_VALUE=16000000
+RCC.I2C1Freq_Value=80000000
+RCC.I2C2Freq_Value=80000000
+RCC.I2C3Freq_Value=80000000
+RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value
+RCC.LPTIM1Freq_Value=80000000
+RCC.LPTIM2Freq_Value=80000000
+RCC.LPUART1Freq_Value=80000000
+RCC.LSCOPinFreq_Value=32000
+RCC.LSI_VALUE=32000
+RCC.MCO1PinFreq_Value=80000000
+RCC.MSI_VALUE=4000000
+RCC.PLLN=20
+RCC.PLLPoutputFreq_Value=22857142.85714286
+RCC.PLLQoutputFreq_Value=80000000
+RCC.PLLRCLKFreq_Value=80000000
+RCC.PLLSAI1PoutputFreq_Value=9142857.142857144
+RCC.PLLSAI1QoutputFreq_Value=32000000
+RCC.PLLSAI1RoutputFreq_Value=32000000
+RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
+RCC.PWRFreq_Value=80000000
+RCC.RNGFreq_Value=32000000
+RCC.SAI1Freq_Value=9142857.142857144
+RCC.SDMMCFreq_Value=32000000
+RCC.SWPMI1Freq_Value=80000000
+RCC.SYSCLKFreq_VALUE=80000000
+RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
+RCC.USART1Freq_Value=80000000
+RCC.USART2Freq_Value=80000000
+RCC.USART3Freq_Value=80000000
+RCC.VCOInputFreq_Value=8000000
+RCC.VCOOutputFreq_Value=160000000
+RCC.VCOSAI1OutputFreq_Value=64000000
+SH.ADCx_IN15.0=ADC1_IN15,IN15-Single-Ended
+SH.ADCx_IN15.ConfNb=1
+SH.ADCx_IN16.0=ADC1_IN16,IN16-Single-Ended
+SH.ADCx_IN16.ConfNb=1
+SH.GPXTI12.0=GPIO_EXTI12
+SH.GPXTI12.ConfNb=1
+SH.GPXTI13.0=GPIO_EXTI13
+SH.GPXTI13.ConfNb=1
+SH.GPXTI14.0=GPIO_EXTI14
+SH.GPXTI14.ConfNb=1
+SH.S_TIM1_CH4.0=TIM1_CH4,PWM Generation4 CH4
+SH.S_TIM1_CH4.ConfNb=1
+SH.S_TIM2_CH2.0=TIM2_CH2,PWM Generation2 CH2
+SH.S_TIM2_CH2.ConfNb=1
+TIM1.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
+TIM1.IPParameters=Channel-PWM Generation4 CH4,Prescaler,RepetitionCounter,Period,Pulse-PWM Generation4 CH4
+TIM1.Period=370-1
+TIM1.Prescaler=80-1
+TIM1.Pulse-PWM\ Generation4\ CH4=185
+TIM1.RepetitionCounter=0
+TIM2.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
+TIM2.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
+TIM2.IPParameters=Channel-PWM Generation2 CH2,Prescaler,Period,AutoReloadPreload,Pulse-PWM Generation2 CH2
+TIM2.Period=20000-1
+TIM2.Prescaler=80-1
+TIM2.Pulse-PWM\ Generation2\ CH2=1500
+TIM6.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE
+TIM6.IPParameters=Prescaler,Period,AutoReloadPreload
+TIM6.Period=1
+TIM6.Prescaler=80-1
+USART1.IPParameters=VirtualMode-Asynchronous
+USART1.VirtualMode-Asynchronous=VM_ASYNC
+VP_SYS_VS_Systick.Mode=SysTick
+VP_SYS_VS_Systick.Signal=SYS_VS_Systick
+VP_TIM6_VS_ClockSourceINT.Mode=Enable_Timer
+VP_TIM6_VS_ClockSourceINT.Signal=TIM6_VS_ClockSourceINT
+board=custom
diff --git a/ex1.servo-sg90/MDK-ARM/ISKBoard.uvoptx b/ex1.servo-sg90/MDK-ARM/ISKBoard.uvoptx
new file mode 100644
index 0000000..f94a563
--- /dev/null
+++ b/ex1.servo-sg90/MDK-ARM/ISKBoard.uvoptx
@@ -0,0 +1,681 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
+
+ <SchemaVersion>1.0</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Extensions>
+ <cExt>*.c</cExt>
+ <aExt>*.s*; *.src; *.a*</aExt>
+ <oExt>*.obj; *.o</oExt>
+ <lExt>*.lib</lExt>
+ <tExt>*.txt; *.h; *.inc; *.md</tExt>
+ <pExt>*.plm</pExt>
+ <CppX>*.cpp</CppX>
+ <nMigrate>0</nMigrate>
+ </Extensions>
+
+ <DaveTm>
+ <dwLowDateTime>0</dwLowDateTime>
+ <dwHighDateTime>0</dwHighDateTime>
+ </DaveTm>
+
+ <Target>
+ <TargetName>ISKBoard</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <TargetOption>
+ <CLKADS>8000000</CLKADS>
+ <OPTTT>
+ <gFlags>1</gFlags>
+ <BeepAtEnd>1</BeepAtEnd>
+ <RunSim>0</RunSim>
+ <RunTarget>1</RunTarget>
+ <RunAbUc>0</RunAbUc>
+ </OPTTT>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <FlashByte>65535</FlashByte>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ </OPTHX>
+ <OPTLEX>
+ <PageWidth>79</PageWidth>
+ <PageLength>66</PageLength>
+ <TabStop>8</TabStop>
+ <ListingPath></ListingPath>
+ </OPTLEX>
+ <ListingPage>
+ <CreateCListing>1</CreateCListing>
+ <CreateAListing>1</CreateAListing>
+ <CreateLListing>1</CreateLListing>
+ <CreateIListing>0</CreateIListing>
+ <AsmCond>1</AsmCond>
+ <AsmSymb>1</AsmSymb>
+ <AsmXref>0</AsmXref>
+ <CCond>1</CCond>
+ <CCode>0</CCode>
+ <CListInc>0</CListInc>
+ <CSymb>0</CSymb>
+ <LinkerCodeListing>0</LinkerCodeListing>
+ </ListingPage>
+ <OPTXL>
+ <LMap>1</LMap>
+ <LComments>1</LComments>
+ <LGenerateSymbols>1</LGenerateSymbols>
+ <LLibSym>1</LLibSym>
+ <LLines>1</LLines>
+ <LLocSym>1</LLocSym>
+ <LPubSym>1</LPubSym>
+ <LXref>0</LXref>
+ <LExpSel>0</LExpSel>
+ </OPTXL>
+ <OPTFL>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <IsCurrentTarget>1</IsCurrentTarget>
+ </OPTFL>
+ <CpuCode>18</CpuCode>
+ <DebugOpt>
+ <uSim>0</uSim>
+ <uTrg>1</uTrg>
+ <sLdApp>1</sLdApp>
+ <sGomain>1</sGomain>
+ <sRbreak>1</sRbreak>
+ <sRwatch>1</sRwatch>
+ <sRmem>1</sRmem>
+ <sRfunc>1</sRfunc>
+ <sRbox>1</sRbox>
+ <tLdApp>1</tLdApp>
+ <tGomain>1</tGomain>
+ <tRbreak>1</tRbreak>
+ <tRwatch>1</tRwatch>
+ <tRmem>1</tRmem>
+ <tRfunc>1</tRfunc>
+ <tRbox>1</tRbox>
+ <tRtrace>1</tRtrace>
+ <sRSysVw>1</sRSysVw>
+ <tRSysVw>1</tRSysVw>
+ <sRunDeb>0</sRunDeb>
+ <sLrtime>0</sLrtime>
+ <bEvRecOn>1</bEvRecOn>
+ <bSchkAxf>0</bSchkAxf>
+ <bTchkAxf>0</bTchkAxf>
+ <nTsel>6</nTsel>
+ <sDll></sDll>
+ <sDllPa></sDllPa>
+ <sDlgDll></sDlgDll>
+ <sDlgPa></sDlgPa>
+ <sIfile></sIfile>
+ <tDll></tDll>
+ <tDllPa></tDllPa>
+ <tDlgDll></tDlgDll>
+ <tDlgPa></tDlgPa>
+ <tIfile></tIfile>
+ <pMon>STLink\ST-LINKIII-KEIL_SWO.dll</pMon>
+ </DebugOpt>
+ <TargetDriverDllRegistry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>ARMRTXEVENTFLAGS</Key>
+ <Name>-L70 -Z18 -C0 -M0 -T1</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>DLGTARM</Key>
+ <Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>ARMDBGFLAGS</Key>
+ <Name></Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>DLGUARM</Key>
+ <Name>(105=-1,-1,-1,-1,0)</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>UL2CM3</Key>
+ <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0STM32L4xx_256 -FS08000000 -FL040000 -FP0($$Device:STM32L431RCTx$CMSIS\Flash\STM32L4xx_256.FLM))</Name>
+ </SetRegEntry>
+ <SetRegEntry>
+ <Number>0</Number>
+ <Key>ST-LINKIII-KEIL_SWO</Key>
+ <Name>-U53FF69064885495006370487 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256.FLM -FS08000000 -FL040000 -FP0($$Device:STM32L431RCTx$CMSIS\Flash\STM32L4xx_256.FLM)</Name>
+ </SetRegEntry>
+ </TargetDriverDllRegistry>
+ <Breakpoint>
+ <Bp>
+ <Number>0</Number>
+ <Type>0</Type>
+ <LineNumber>95</LineNumber>
+ <EnabledFlag>1</EnabledFlag>
+ <Address>0</Address>
+ <ByteObject>0</ByteObject>
+ <HtxType>0</HtxType>
+ <ManyObjects>0</ManyObjects>
+ <SizeOfObject>0</SizeOfObject>
+ <BreakByAccess>0</BreakByAccess>
+ <BreakIfRCount>0</BreakIfRCount>
+ <Filename>../Core/Src/main.c</Filename>
+ <ExecCommand></ExecCommand>
+ <Expression></Expression>
+ </Bp>
+ <Bp>
+ <Number>1</Number>
+ <Type>0</Type>
+ <LineNumber>97</LineNumber>
+ <EnabledFlag>1</EnabledFlag>
+ <Address>0</Address>
+ <ByteObject>0</ByteObject>
+ <HtxType>0</HtxType>
+ <ManyObjects>0</ManyObjects>
+ <SizeOfObject>0</SizeOfObject>
+ <BreakByAccess>0</BreakByAccess>
+ <BreakIfRCount>0</BreakIfRCount>
+ <Filename>../Core/Src/main.c</Filename>
+ <ExecCommand></ExecCommand>
+ <Expression></Expression>
+ </Bp>
+ </Breakpoint>
+ <Tracepoint>
+ <THDelay>0</THDelay>
+ </Tracepoint>
+ <DebugFlag>
+ <trace>0</trace>
+ <periodic>1</periodic>
+ <aLwin>1</aLwin>
+ <aCover>0</aCover>
+ <aSer1>0</aSer1>
+ <aSer2>0</aSer2>
+ <aPa>0</aPa>
+ <viewmode>1</viewmode>
+ <vrSel>0</vrSel>
+ <aSym>0</aSym>
+ <aTbox>0</aTbox>
+ <AscS1>0</AscS1>
+ <AscS2>0</AscS2>
+ <AscS3>0</AscS3>
+ <aSer3>0</aSer3>
+ <eProf>0</eProf>
+ <aLa>0</aLa>
+ <aPa1>0</aPa1>
+ <AscS4>0</AscS4>
+ <aSer4>0</aSer4>
+ <StkLoc>1</StkLoc>
+ <TrcWin>0</TrcWin>
+ <newCpu>0</newCpu>
+ <uProt>0</uProt>
+ </DebugFlag>
+ <LintExecutable></LintExecutable>
+ <LintConfigFile></LintConfigFile>
+ <bLintAuto>0</bLintAuto>
+ <bAutoGenD>0</bAutoGenD>
+ <LntExFlags>0</LntExFlags>
+ <pMisraName></pMisraName>
+ <pszMrule></pszMrule>
+ <pSingCmds></pSingCmds>
+ <pMultCmds></pMultCmds>
+ <pMisraNamep></pMisraNamep>
+ <pszMrulep></pszMrulep>
+ <pSingCmdsp></pSingCmdsp>
+ <pMultCmdsp></pMultCmdsp>
+ <DebugDescription>
+ <Enable>1</Enable>
+ <EnableFlashSeq>0</EnableFlashSeq>
+ <EnableLog>0</EnableLog>
+ <Protocol>2</Protocol>
+ <DbgClock>10000000</DbgClock>
+ </DebugDescription>
+ </TargetOption>
+ </Target>
+
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>1</GroupNumber>
+ <FileNumber>1</FileNumber>
+ <FileType>2</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>startup_stm32l431xx.s</PathWithFileName>
+ <FilenameWithoutPath>startup_stm32l431xx.s</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Application/User/Core</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>2</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/main.c</PathWithFileName>
+ <FilenameWithoutPath>main.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>3</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/gpio.c</PathWithFileName>
+ <FilenameWithoutPath>gpio.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>4</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/adc.c</PathWithFileName>
+ <FilenameWithoutPath>adc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>5</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/tim.c</PathWithFileName>
+ <FilenameWithoutPath>tim.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>6</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/usart.c</PathWithFileName>
+ <FilenameWithoutPath>usart.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>7</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32l4xx_it.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_it.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>2</GroupNumber>
+ <FileNumber>8</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/stm32l4xx_hal_msp.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_msp.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/STM32L4xx_HAL_Driver</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>9</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_adc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>10</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_adc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>11</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>12</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_rcc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>13</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_rcc_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>14</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_flash.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>15</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_flash_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>16</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_flash_ramfunc.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>17</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_gpio.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>18</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_i2c.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>19</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_i2c_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>20</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_dma.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>21</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_dma_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>22</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_pwr.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>23</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_pwr_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>24</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_cortex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>25</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_exti.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>26</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_tim.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>27</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_tim_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>28</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_uart.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>3</GroupNumber>
+ <FileNumber>29</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c</PathWithFileName>
+ <FilenameWithoutPath>stm32l4xx_hal_uart_ex.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Drivers/CMSIS</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>4</GroupNumber>
+ <FileNumber>30</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>../Core/Src/system_stm32l4xx.c</PathWithFileName>
+ <FilenameWithoutPath>system_stm32l4xx.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>Board</GroupName>
+ <tvExp>1</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>0</RteFlg>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>31</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\Board\miscdev.c</PathWithFileName>
+ <FilenameWithoutPath>miscdev.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>32</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\Board\buzzer.c</PathWithFileName>
+ <FilenameWithoutPath>buzzer.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ <File>
+ <GroupNumber>5</GroupNumber>
+ <FileNumber>33</FileNumber>
+ <FileType>1</FileType>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <bDave2>0</bDave2>
+ <PathWithFileName>..\Board\servo_sg90.c</PathWithFileName>
+ <FilenameWithoutPath>servo_sg90.c</FilenameWithoutPath>
+ <RteFlg>0</RteFlg>
+ <bShared>0</bShared>
+ </File>
+ </Group>
+
+ <Group>
+ <GroupName>::CMSIS</GroupName>
+ <tvExp>0</tvExp>
+ <tvExpOptDlg>0</tvExpOptDlg>
+ <cbSel>0</cbSel>
+ <RteFlg>1</RteFlg>
+ </Group>
+
+</ProjectOpt>
diff --git a/ex1.servo-sg90/MDK-ARM/ISKBoard.uvprojx b/ex1.servo-sg90/MDK-ARM/ISKBoard.uvprojx
new file mode 100644
index 0000000..0293d2a
--- /dev/null
+++ b/ex1.servo-sg90/MDK-ARM/ISKBoard.uvprojx
@@ -0,0 +1,899 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
+
+ <SchemaVersion>2.1</SchemaVersion>
+
+ <Header>### uVision Project, (C) Keil Software</Header>
+
+ <Targets>
+ <Target>
+ <TargetName>ISKBoard</TargetName>
+ <ToolsetNumber>0x4</ToolsetNumber>
+ <ToolsetName>ARM-ADS</ToolsetName>
+ <pCCUsed>6150000::V6.15::ARMCLANG</pCCUsed>
+ <uAC6>1</uAC6>
+ <TargetOption>
+ <TargetCommonOption>
+ <Device>STM32L431RCTx</Device>
+ <Vendor>STMicroelectronics</Vendor>
+ <PackID>Keil.STM32L4xx_DFP.2.5.0</PackID>
+ <PackURL>http://www.keil.com/pack/</PackURL>
+ <Cpu>IRAM(0x20000000-0x2000BFFF) IRAM2(0x10000000-0x10003FFF) IROM(0x8000000-0x803FFFF) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4") TZ</Cpu>
+ <FlashUtilSpec></FlashUtilSpec>
+ <StartupFile></StartupFile>
+ <FlashDriverDll></FlashDriverDll>
+ <DeviceId>0</DeviceId>
+ <RegisterFile></RegisterFile>
+ <MemoryEnv></MemoryEnv>
+ <Cmp></Cmp>
+ <Asm></Asm>
+ <Linker></Linker>
+ <OHString></OHString>
+ <InfinionOptionDll></InfinionOptionDll>
+ <SLE66CMisc></SLE66CMisc>
+ <SLE66AMisc></SLE66AMisc>
+ <SLE66LinkerMisc></SLE66LinkerMisc>
+ <SFDFile>$$Device:STM32L431RCTx$CMSIS\SVD\STM32L4x1.svd</SFDFile>
+ <bCustSvd>0</bCustSvd>
+ <UseEnv>0</UseEnv>
+ <BinPath></BinPath>
+ <IncludePath></IncludePath>
+ <LibPath></LibPath>
+ <RegisterFilePath></RegisterFilePath>
+ <DBRegisterFilePath></DBRegisterFilePath>
+ <TargetStatus>
+ <Error>0</Error>
+ <ExitCodeStop>0</ExitCodeStop>
+ <ButtonStop>0</ButtonStop>
+ <NotGenerated>0</NotGenerated>
+ <InvalidFlash>1</InvalidFlash>
+ </TargetStatus>
+ <OutputDirectory>ISKBoard\</OutputDirectory>
+ <OutputName>ISKBoard</OutputName>
+ <CreateExecutable>1</CreateExecutable>
+ <CreateLib>0</CreateLib>
+ <CreateHexFile>1</CreateHexFile>
+ <DebugInformation>1</DebugInformation>
+ <BrowseInformation>1</BrowseInformation>
+ <ListingPath></ListingPath>
+ <HexFormatSelection>1</HexFormatSelection>
+ <Merge32K>0</Merge32K>
+ <CreateBatchFile>0</CreateBatchFile>
+ <BeforeCompile>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopU1X>0</nStopU1X>
+ <nStopU2X>0</nStopU2X>
+ </BeforeCompile>
+ <BeforeMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>0</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopB1X>0</nStopB1X>
+ <nStopB2X>0</nStopB2X>
+ </BeforeMake>
+ <AfterMake>
+ <RunUserProg1>0</RunUserProg1>
+ <RunUserProg2>1</RunUserProg2>
+ <UserProg1Name></UserProg1Name>
+ <UserProg2Name></UserProg2Name>
+ <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+ <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+ <nStopA1X>0</nStopA1X>
+ <nStopA2X>0</nStopA2X>
+ </AfterMake>
+ <SelectedForBatchBuild>1</SelectedForBatchBuild>
+ <SVCSIdString></SVCSIdString>
+ </TargetCommonOption>
+ <CommonProperty>
+ <UseCPPCompiler>0</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>0</AlwaysBuild>
+ <GenerateAssemblyFile>0</GenerateAssemblyFile>
+ <AssembleAssemblyFile>0</AssembleAssemblyFile>
+ <PublicsOnly>0</PublicsOnly>
+ <StopOnExitCode>3</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>0</ComprImg>
+ </CommonProperty>
+ <DllOption>
+ <SimDllName>SARMCM3.DLL</SimDllName>
+ <SimDllArguments>-REMAP -MPU</SimDllArguments>
+ <SimDlgDll>DCM.DLL</SimDlgDll>
+ <SimDlgDllArguments>-pCM4</SimDlgDllArguments>
+ <TargetDllName>SARMCM3.DLL</TargetDllName>
+ <TargetDllArguments>-MPU</TargetDllArguments>
+ <TargetDlgDll>TCM.DLL</TargetDlgDll>
+ <TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
+ </DllOption>
+ <DebugOption>
+ <OPTHX>
+ <HexSelection>1</HexSelection>
+ <HexRangeLowAddress>0</HexRangeLowAddress>
+ <HexRangeHighAddress>0</HexRangeHighAddress>
+ <HexOffset>0</HexOffset>
+ <Oh166RecLen>16</Oh166RecLen>
+ </OPTHX>
+ </DebugOption>
+ <Utilities>
+ <Flash1>
+ <UseTargetDll>1</UseTargetDll>
+ <UseExternalTool>0</UseExternalTool>
+ <RunIndependent>0</RunIndependent>
+ <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+ <Capability>1</Capability>
+ <DriverSelection>4101</DriverSelection>
+ </Flash1>
+ <bUseTDR>1</bUseTDR>
+ <Flash2>BIN\UL2V8M.DLL</Flash2>
+ <Flash3>"" ()</Flash3>
+ <Flash4></Flash4>
+ <pFcarmOut></pFcarmOut>
+ <pFcarmGrp></pFcarmGrp>
+ <pFcArmRoot></pFcArmRoot>
+ <FcArmLst>0</FcArmLst>
+ </Utilities>
+ <TargetArmAds>
+ <ArmAdsMisc>
+ <GenerateListings>0</GenerateListings>
+ <asHll>1</asHll>
+ <asAsm>1</asAsm>
+ <asMacX>1</asMacX>
+ <asSyms>1</asSyms>
+ <asFals>1</asFals>
+ <asDbgD>1</asDbgD>
+ <asForm>1</asForm>
+ <ldLst>0</ldLst>
+ <ldmm>1</ldmm>
+ <ldXref>1</ldXref>
+ <BigEnd>0</BigEnd>
+ <AdsALst>1</AdsALst>
+ <AdsACrf>1</AdsACrf>
+ <AdsANop>0</AdsANop>
+ <AdsANot>0</AdsANot>
+ <AdsLLst>1</AdsLLst>
+ <AdsLmap>1</AdsLmap>
+ <AdsLcgr>1</AdsLcgr>
+ <AdsLsym>1</AdsLsym>
+ <AdsLszi>1</AdsLszi>
+ <AdsLtoi>1</AdsLtoi>
+ <AdsLsun>1</AdsLsun>
+ <AdsLven>1</AdsLven>
+ <AdsLsxf>1</AdsLsxf>
+ <RvctClst>0</RvctClst>
+ <GenPPlst>0</GenPPlst>
+ <AdsCpuType>"Cortex-M4"</AdsCpuType>
+ <RvctDeviceName></RvctDeviceName>
+ <mOS>0</mOS>
+ <uocRom>0</uocRom>
+ <uocRam>0</uocRam>
+ <hadIROM>1</hadIROM>
+ <hadIRAM>1</hadIRAM>
+ <hadXRAM>0</hadXRAM>
+ <uocXRam>0</uocXRam>
+ <RvdsVP>2</RvdsVP>
+ <RvdsMve>0</RvdsMve>
+ <RvdsCdeCp>0</RvdsCdeCp>
+ <hadIRAM2>1</hadIRAM2>
+ <hadIROM2>0</hadIROM2>
+ <StupSel>8</StupSel>
+ <useUlib>1</useUlib>
+ <EndSel>0</EndSel>
+ <uLtcg>0</uLtcg>
+ <nSecure>0</nSecure>
+ <RoSelD>3</RoSelD>
+ <RwSelD>4</RwSelD>
+ <CodeSel>0</CodeSel>
+ <OptFeed>0</OptFeed>
+ <NoZi1>0</NoZi1>
+ <NoZi2>0</NoZi2>
+ <NoZi3>0</NoZi3>
+ <NoZi4>0</NoZi4>
+ <NoZi5>0</NoZi5>
+ <Ro1Chk>0</Ro1Chk>
+ <Ro2Chk>0</Ro2Chk>
+ <Ro3Chk>0</Ro3Chk>
+ <Ir1Chk>1</Ir1Chk>
+ <Ir2Chk>0</Ir2Chk>
+ <Ra1Chk>0</Ra1Chk>
+ <Ra2Chk>0</Ra2Chk>
+ <Ra3Chk>0</Ra3Chk>
+ <Im1Chk>1</Im1Chk>
+ <Im2Chk>1</Im2Chk>
+ <OnChipMemories>
+ <Ocm1>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm1>
+ <Ocm2>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm2>
+ <Ocm3>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm3>
+ <Ocm4>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm4>
+ <Ocm5>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm5>
+ <Ocm6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </Ocm6>
+ <IRAM>
+ <Type>0</Type>
+ <StartAddress>0x20000000</StartAddress>
+ <Size>0xc000</Size>
+ </IRAM>
+ <IROM>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x40000</Size>
+ </IROM>
+ <XRAM>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </XRAM>
+ <OCR_RVCT1>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT1>
+ <OCR_RVCT2>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT2>
+ <OCR_RVCT3>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT3>
+ <OCR_RVCT4>
+ <Type>1</Type>
+ <StartAddress>0x8000000</StartAddress>
+ <Size>0x40000</Size>
+ </OCR_RVCT4>
+ <OCR_RVCT5>
+ <Type>1</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT5>
+ <OCR_RVCT6>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT6>
+ <OCR_RVCT7>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT7>
+ <OCR_RVCT8>
+ <Type>0</Type>
+ <StartAddress>0x0</StartAddress>
+ <Size>0x0</Size>
+ </OCR_RVCT8>
+ <OCR_RVCT9>
+ <Type>0</Type>
+ <StartAddress>0x20000000</StartAddress>
+ <Size>0xc000</Size>
+ </OCR_RVCT9>
+ <OCR_RVCT10>
+ <Type>0</Type>
+ <StartAddress>0x10000000</StartAddress>
+ <Size>0x4000</Size>
+ </OCR_RVCT10>
+ </OnChipMemories>
+ <RvctStartVector></RvctStartVector>
+ </ArmAdsMisc>
+ <Cads>
+ <interw>1</interw>
+ <Optim>4</Optim>
+ <oTime>0</oTime>
+ <SplitLS>0</SplitLS>
+ <OneElfS>1</OneElfS>
+ <Strict>0</Strict>
+ <EnumInt>0</EnumInt>
+ <PlainCh>0</PlainCh>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <wLevel>3</wLevel>
+ <uThumb>0</uThumb>
+ <uSurpInc>0</uSurpInc>
+ <uC99>1</uC99>
+ <uGnu>0</uGnu>
+ <useXO>0</useXO>
+ <v6Lang>3</v6Lang>
+ <v6LangP>3</v6LangP>
+ <vShortEn>1</vShortEn>
+ <vShortWch>1</vShortWch>
+ <v6Lto>0</v6Lto>
+ <v6WtE>0</v6WtE>
+ <v6Rtti>0</v6Rtti>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define>USE_HAL_DRIVER,STM32L431xx</Define>
+ <Undefine></Undefine>
+ <IncludePath>../Core/Inc;../Drivers/STM32L4xx_HAL_Driver/Inc;../Drivers/STM32L4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32L4xx/Include;../Drivers/CMSIS/Include;../Board</IncludePath>
+ </VariousControls>
+ </Cads>
+ <Aads>
+ <interw>1</interw>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <thumb>0</thumb>
+ <SplitLS>0</SplitLS>
+ <SwStkChk>0</SwStkChk>
+ <NoWarn>0</NoWarn>
+ <uSurpInc>0</uSurpInc>
+ <useXO>0</useXO>
+ <ClangAsOpt>1</ClangAsOpt>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Aads>
+ <LDads>
+ <umfTarg>1</umfTarg>
+ <Ropi>0</Ropi>
+ <Rwpi>0</Rwpi>
+ <noStLib>0</noStLib>
+ <RepFail>1</RepFail>
+ <useFile>0</useFile>
+ <TextAddressRange></TextAddressRange>
+ <DataAddressRange></DataAddressRange>
+ <pXoBase></pXoBase>
+ <ScatterFile></ScatterFile>
+ <IncludeLibs></IncludeLibs>
+ <IncludeLibsPath></IncludeLibsPath>
+ <Misc></Misc>
+ <LinkerInputFile></LinkerInputFile>
+ <DisabledWarnings></DisabledWarnings>
+ </LDads>
+ </TargetArmAds>
+ </TargetOption>
+ <Groups>
+ <Group>
+ <GroupName>Application/MDK-ARM</GroupName>
+ <Files>
+ <File>
+ <FileName>startup_stm32l431xx.s</FileName>
+ <FileType>2</FileType>
+ <FilePath>startup_stm32l431xx.s</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Application/User/Core</GroupName>
+ <Files>
+ <File>
+ <FileName>main.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/main.c</FilePath>
+ </File>
+ <File>
+ <FileName>gpio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/gpio.c</FilePath>
+ </File>
+ <File>
+ <FileName>adc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/adc.c</FilePath>
+ <FileOption>
+ <CommonProperty>
+ <UseCPPCompiler>2</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>2</AlwaysBuild>
+ <GenerateAssemblyFile>2</GenerateAssemblyFile>
+ <AssembleAssemblyFile>2</AssembleAssemblyFile>
+ <PublicsOnly>2</PublicsOnly>
+ <StopOnExitCode>11</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>1</ComprImg>
+ </CommonProperty>
+ <FileArmAds>
+ <Cads>
+ <interw>2</interw>
+ <Optim>0</Optim>
+ <oTime>2</oTime>
+ <SplitLS>2</SplitLS>
+ <OneElfS>2</OneElfS>
+ <Strict>2</Strict>
+ <EnumInt>2</EnumInt>
+ <PlainCh>2</PlainCh>
+ <Ropi>2</Ropi>
+ <Rwpi>2</Rwpi>
+ <wLevel>0</wLevel>
+ <uThumb>2</uThumb>
+ <uSurpInc>2</uSurpInc>
+ <uC99>2</uC99>
+ <uGnu>2</uGnu>
+ <useXO>2</useXO>
+ <v6Lang>0</v6Lang>
+ <v6LangP>0</v6LangP>
+ <vShortEn>2</vShortEn>
+ <vShortWch>2</vShortWch>
+ <v6Lto>2</v6Lto>
+ <v6WtE>2</v6WtE>
+ <v6Rtti>2</v6Rtti>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Cads>
+ </FileArmAds>
+ </FileOption>
+ </File>
+ <File>
+ <FileName>tim.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/tim.c</FilePath>
+ <FileOption>
+ <CommonProperty>
+ <UseCPPCompiler>2</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>2</AlwaysBuild>
+ <GenerateAssemblyFile>2</GenerateAssemblyFile>
+ <AssembleAssemblyFile>2</AssembleAssemblyFile>
+ <PublicsOnly>2</PublicsOnly>
+ <StopOnExitCode>11</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>1</ComprImg>
+ </CommonProperty>
+ <FileArmAds>
+ <Cads>
+ <interw>2</interw>
+ <Optim>0</Optim>
+ <oTime>2</oTime>
+ <SplitLS>2</SplitLS>
+ <OneElfS>2</OneElfS>
+ <Strict>2</Strict>
+ <EnumInt>2</EnumInt>
+ <PlainCh>2</PlainCh>
+ <Ropi>2</Ropi>
+ <Rwpi>2</Rwpi>
+ <wLevel>0</wLevel>
+ <uThumb>2</uThumb>
+ <uSurpInc>2</uSurpInc>
+ <uC99>2</uC99>
+ <uGnu>2</uGnu>
+ <useXO>2</useXO>
+ <v6Lang>0</v6Lang>
+ <v6LangP>0</v6LangP>
+ <vShortEn>2</vShortEn>
+ <vShortWch>2</vShortWch>
+ <v6Lto>2</v6Lto>
+ <v6WtE>2</v6WtE>
+ <v6Rtti>2</v6Rtti>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Cads>
+ </FileArmAds>
+ </FileOption>
+ </File>
+ <File>
+ <FileName>usart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/usart.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_it.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32l4xx_it.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_msp.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/stm32l4xx_hal_msp.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/STM32L4xx_HAL_Driver</GroupName>
+ <Files>
+ <File>
+ <FileName>stm32l4xx_hal_adc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c</FilePath>
+ <FileOption>
+ <CommonProperty>
+ <UseCPPCompiler>2</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>2</AlwaysBuild>
+ <GenerateAssemblyFile>2</GenerateAssemblyFile>
+ <AssembleAssemblyFile>2</AssembleAssemblyFile>
+ <PublicsOnly>2</PublicsOnly>
+ <StopOnExitCode>11</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>1</ComprImg>
+ </CommonProperty>
+ <FileArmAds>
+ <Cads>
+ <interw>2</interw>
+ <Optim>0</Optim>
+ <oTime>2</oTime>
+ <SplitLS>2</SplitLS>
+ <OneElfS>2</OneElfS>
+ <Strict>2</Strict>
+ <EnumInt>2</EnumInt>
+ <PlainCh>2</PlainCh>
+ <Ropi>2</Ropi>
+ <Rwpi>2</Rwpi>
+ <wLevel>0</wLevel>
+ <uThumb>2</uThumb>
+ <uSurpInc>2</uSurpInc>
+ <uC99>2</uC99>
+ <uGnu>2</uGnu>
+ <useXO>2</useXO>
+ <v6Lang>0</v6Lang>
+ <v6LangP>0</v6LangP>
+ <vShortEn>2</vShortEn>
+ <vShortWch>2</vShortWch>
+ <v6Lto>2</v6Lto>
+ <v6WtE>2</v6WtE>
+ <v6Rtti>2</v6Rtti>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Cads>
+ </FileArmAds>
+ </FileOption>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_adc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c</FilePath>
+ <FileOption>
+ <CommonProperty>
+ <UseCPPCompiler>2</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>2</AlwaysBuild>
+ <GenerateAssemblyFile>2</GenerateAssemblyFile>
+ <AssembleAssemblyFile>2</AssembleAssemblyFile>
+ <PublicsOnly>2</PublicsOnly>
+ <StopOnExitCode>11</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>1</ComprImg>
+ </CommonProperty>
+ <FileArmAds>
+ <Cads>
+ <interw>2</interw>
+ <Optim>0</Optim>
+ <oTime>2</oTime>
+ <SplitLS>2</SplitLS>
+ <OneElfS>2</OneElfS>
+ <Strict>2</Strict>
+ <EnumInt>2</EnumInt>
+ <PlainCh>2</PlainCh>
+ <Ropi>2</Ropi>
+ <Rwpi>2</Rwpi>
+ <wLevel>0</wLevel>
+ <uThumb>2</uThumb>
+ <uSurpInc>2</uSurpInc>
+ <uC99>2</uC99>
+ <uGnu>2</uGnu>
+ <useXO>2</useXO>
+ <v6Lang>0</v6Lang>
+ <v6LangP>0</v6LangP>
+ <vShortEn>2</vShortEn>
+ <vShortWch>2</vShortWch>
+ <v6Lto>2</v6Lto>
+ <v6WtE>2</v6WtE>
+ <v6Rtti>2</v6Rtti>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Cads>
+ </FileArmAds>
+ </FileOption>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_rcc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_rcc_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_flash.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_flash_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_flash_ramfunc.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_gpio.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_i2c.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_i2c_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_dma.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_dma_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_pwr.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_pwr_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_cortex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_exti.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_tim.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c</FilePath>
+ <FileOption>
+ <CommonProperty>
+ <UseCPPCompiler>2</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>2</AlwaysBuild>
+ <GenerateAssemblyFile>2</GenerateAssemblyFile>
+ <AssembleAssemblyFile>2</AssembleAssemblyFile>
+ <PublicsOnly>2</PublicsOnly>
+ <StopOnExitCode>11</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>1</ComprImg>
+ </CommonProperty>
+ <FileArmAds>
+ <Cads>
+ <interw>2</interw>
+ <Optim>0</Optim>
+ <oTime>2</oTime>
+ <SplitLS>2</SplitLS>
+ <OneElfS>2</OneElfS>
+ <Strict>2</Strict>
+ <EnumInt>2</EnumInt>
+ <PlainCh>2</PlainCh>
+ <Ropi>2</Ropi>
+ <Rwpi>2</Rwpi>
+ <wLevel>0</wLevel>
+ <uThumb>2</uThumb>
+ <uSurpInc>2</uSurpInc>
+ <uC99>2</uC99>
+ <uGnu>2</uGnu>
+ <useXO>2</useXO>
+ <v6Lang>0</v6Lang>
+ <v6LangP>0</v6LangP>
+ <vShortEn>2</vShortEn>
+ <vShortWch>2</vShortWch>
+ <v6Lto>2</v6Lto>
+ <v6WtE>2</v6WtE>
+ <v6Rtti>2</v6Rtti>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Cads>
+ </FileArmAds>
+ </FileOption>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_tim_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c</FilePath>
+ <FileOption>
+ <CommonProperty>
+ <UseCPPCompiler>2</UseCPPCompiler>
+ <RVCTCodeConst>0</RVCTCodeConst>
+ <RVCTZI>0</RVCTZI>
+ <RVCTOtherData>0</RVCTOtherData>
+ <ModuleSelection>0</ModuleSelection>
+ <IncludeInBuild>1</IncludeInBuild>
+ <AlwaysBuild>2</AlwaysBuild>
+ <GenerateAssemblyFile>2</GenerateAssemblyFile>
+ <AssembleAssemblyFile>2</AssembleAssemblyFile>
+ <PublicsOnly>2</PublicsOnly>
+ <StopOnExitCode>11</StopOnExitCode>
+ <CustomArgument></CustomArgument>
+ <IncludeLibraryModules></IncludeLibraryModules>
+ <ComprImg>1</ComprImg>
+ </CommonProperty>
+ <FileArmAds>
+ <Cads>
+ <interw>2</interw>
+ <Optim>0</Optim>
+ <oTime>2</oTime>
+ <SplitLS>2</SplitLS>
+ <OneElfS>2</OneElfS>
+ <Strict>2</Strict>
+ <EnumInt>2</EnumInt>
+ <PlainCh>2</PlainCh>
+ <Ropi>2</Ropi>
+ <Rwpi>2</Rwpi>
+ <wLevel>0</wLevel>
+ <uThumb>2</uThumb>
+ <uSurpInc>2</uSurpInc>
+ <uC99>2</uC99>
+ <uGnu>2</uGnu>
+ <useXO>2</useXO>
+ <v6Lang>0</v6Lang>
+ <v6LangP>0</v6LangP>
+ <vShortEn>2</vShortEn>
+ <vShortWch>2</vShortWch>
+ <v6Lto>2</v6Lto>
+ <v6WtE>2</v6WtE>
+ <v6Rtti>2</v6Rtti>
+ <VariousControls>
+ <MiscControls></MiscControls>
+ <Define></Define>
+ <Undefine></Undefine>
+ <IncludePath></IncludePath>
+ </VariousControls>
+ </Cads>
+ </FileArmAds>
+ </FileOption>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_uart.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c</FilePath>
+ </File>
+ <File>
+ <FileName>stm32l4xx_hal_uart_ex.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Drivers/CMSIS</GroupName>
+ <Files>
+ <File>
+ <FileName>system_stm32l4xx.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>../Core/Src/system_stm32l4xx.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>Board</GroupName>
+ <Files>
+ <File>
+ <FileName>miscdev.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\Board\miscdev.c</FilePath>
+ </File>
+ <File>
+ <FileName>buzzer.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\Board\buzzer.c</FilePath>
+ </File>
+ <File>
+ <FileName>servo_sg90.c</FileName>
+ <FileType>1</FileType>
+ <FilePath>..\Board\servo_sg90.c</FilePath>
+ </File>
+ </Files>
+ </Group>
+ <Group>
+ <GroupName>::CMSIS</GroupName>
+ </Group>
+ </Groups>
+ </Target>
+ </Targets>
+
+ <RTE>
+ <apis/>
+ <components>
+ <component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="6.2.0" condition="ARMv6_7_8-M Device" ymlID="CMSIS:CORE">
+ <package name="CMSIS" schemaVersion="1.7.53" url="https://www.keil.com/pack/" vendor="ARM" version="6.3.0"/>
+ <targetInfos>
+ <targetInfo name="ISKBoard"/>
+ </targetInfos>
+ </component>
+ </components>
+ <files/>
+ </RTE>
+
+</Project>
diff --git a/ex1.servo-sg90/do_clean.bat b/ex1.servo-sg90/do_clean.bat
new file mode 100644
index 0000000..2b1622c
--- /dev/null
+++ b/ex1.servo-sg90/do_clean.bat
@@ -0,0 +1,32 @@
+@echo off
+setlocal enabledelayedexpansion
+
+call :do_clean
+goto :eof
+
+:do_clean
+call :del_file ".mxproject"
+call :del_file ".cproject"
+call :del_file ".project"
+call :del_file ".clangd"
+call :del_file "*.json"
+call :del_file "*.ld"
+call :del_file "*.s"
+call :del_dir ".settings"
+call :del_dir "Drivers"
+call :del_dir "Debug"
+call :del_dir "Release"
+call :del_dir "build"
+exit /b
+
+:del_file
+if exist "%~1" (
+ del /f /q "%~1" >nul 2>&1
+)
+exit /b
+
+:del_dir
+if exist "%~1\" (
+ rmdir /s /q "%~1" >nul 2>&1
+)
+exit /b
\ No newline at end of file
--
Gitblit v1.10.0