a40997aa12029f24ef0904d9af6415c975c4322f..c6a1e7c00cd2946cef7716b205026a907136778b
4 days ago guowenxue
Add ex1.servo-sg90
c6a1e7 diff | tree
8 days ago guowenxue
Update mdelay and gpio function
6c1a5e diff | tree
13 files modified
17 files added
3437 ■■■■■ changed files
ex1.auto-light/Board/buzzer.c 11 ●●●● patch | view | raw | blame | history
ex1.auto-light/Board/miscdev.c 31 ●●●●● patch | view | raw | blame | history
ex1.auto-light/Board/miscdev.h 15 ●●●●● patch | view | raw | blame | history
ex1.auto-light/Core/Src/main.c 6 ●●●● patch | view | raw | blame | history
ex1.auto-light/ISKBoard.ioc 2 ●●● patch | view | raw | blame | history
ex1.buzzer-music/Board/buzzer.c 11 ●●●● patch | view | raw | blame | history
ex1.buzzer-music/Board/miscdev.c 31 ●●●●● patch | view | raw | blame | history
ex1.buzzer-music/Board/miscdev.h 15 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/.gitignore 47 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/.vscode/stm32flash.bat 21 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/.vscode/stm32flash.exe patch | view | raw | blame | history
ex1.servo-sg90/.vscode/tasks.json 65 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/Board/CMakeLists.txt 28 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/Board/buzzer.c 191 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/Board/buzzer.h 37 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/Board/miscdev.c 406 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/Board/miscdev.h 169 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/Board/servo_sg90.c 124 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/Board/servo_sg90.h 62 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/CMakeLists.txt 72 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/Core/Src/main.c 199 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/ISKBoard.ioc 221 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/MDK-ARM/ISKBoard.uvoptx 681 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/MDK-ARM/ISKBoard.uvprojx 899 ●●●●● patch | view | raw | blame | history
ex1.servo-sg90/do_clean.bat 32 ●●●●● patch | view | raw | blame | history
ex1.ws2812b/Board/buzzer.c 11 ●●●● patch | view | raw | blame | history
ex1.ws2812b/Board/miscdev.c 31 ●●●●● patch | view | raw | blame | history
ex1.ws2812b/Board/miscdev.h 15 ●●●●● patch | view | raw | blame | history
ex1.ws2812b/Board/ws2812b.c 2 ●●●●● patch | view | raw | blame | history
ex1.ws2812b/Core/Src/main.c 2 ●●● patch | view | raw | blame | history
ex1.auto-light/Board/buzzer.c
@@ -11,6 +11,7 @@
#include "tim.h"
#include "buzzer.h"
#define mdelay(ms)            HAL_Delay(ms)
#define ARRAY_SIZE(song)      (sizeof(song)/sizeof(song[0]))
/* 音符频率定义(Hz) */
@@ -147,12 +148,12 @@
        /* Start buzzer */
        HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
        HAL_Delay(interval);
        mdelay(interval);
        /* Stop buzzer */
        HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4);
        HAL_Delay(interval);
        mdelay(interval);
    }
}
@@ -164,18 +165,18 @@
    if (freq == 0)
    {
        HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4);
        HAL_Delay(duration_ms);
        mdelay(duration_ms);
        return;
    }
    Buzzer_SetFreq(freq);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
    HAL_Delay(duration_ms - 30);
    mdelay(duration_ms - 30);
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4);
    HAL_Delay(30);
    mdelay(30);
}
/**
ex1.auto-light/Board/miscdev.c
@@ -12,6 +12,33 @@
/*
 *+----------------------+
 *|    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  |
 *+----------------------+
 */
@@ -103,10 +130,10 @@
void blink_led(int which, uint32_t interval)
{
    turn_led(which, ON);
    HAL_Delay(interval);
    mdelay(interval);
    turn_led(which, OFF);
    HAL_Delay(interval);
    mdelay(interval);
}
/**
ex1.auto-light/Board/miscdev.h
@@ -21,6 +21,13 @@
#define OFF    0
#define ON     1
/*
 *+----------------------+
 *|    STM32 GPIO API    |
 *+----------------------+
 */
/* 定义一个gpio的结构体,用来描述这个引脚的相关信息 */
typedef struct gpio_s
{
@@ -30,6 +37,8 @@
    int                 active; /* 1 for active high, 0 for active low */
} gpio_t;
extern void gpio_clk_enable(GPIO_TypeDef *port);
/*
 *+----------------------+
 *|    GPIO Relay API    |
@@ -151,4 +160,10 @@
 */
extern void udelay(uint16_t us);
/**
 * @brief  毫秒秒级延时,直接使用 HAL_Delay(),方便代码可读性
 * @param  ms: 延时时长(毫秒)
 */
#define mdelay(ms)  HAL_Delay(ms)
#endif /* __MISCDEV_H */
ex1.auto-light/Core/Src/main.c
@@ -116,16 +116,16 @@
          turn_led(Led_R, ON);
          /* 延时一会(等人过去)再关闭灯泡 */
          HAL_Delay(5000);
          mdelay(5000);
          printf("turn light off now\r\n");
          turn_relay(OFF);
          turn_led(Led_R, OFF);
          /* 继电器关的时候有声音,等一会再开始采样 */
          HAL_Delay(1000);
          mdelay(1000);
      }
      HAL_Delay(10);
      mdelay(10);
    /* USER CODE END WHILE */
ex1.auto-light/ISKBoard.ioc
@@ -133,7 +133,7 @@
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
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
ex1.buzzer-music/Board/buzzer.c
@@ -11,6 +11,7 @@
#include "tim.h"
#include "buzzer.h"
#define mdelay(ms)            HAL_Delay(ms)
#define ARRAY_SIZE(song)      (sizeof(song)/sizeof(song[0]))
/* 音符频率定义(Hz) */
@@ -147,12 +148,12 @@
        /* Start buzzer */
        HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
        HAL_Delay(interval);
        mdelay(interval);
        /* Stop buzzer */
        HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4);
        HAL_Delay(interval);
        mdelay(interval);
    }
}
@@ -164,18 +165,18 @@
    if (freq == 0)
    {
        HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4);
        HAL_Delay(duration_ms);
        mdelay(duration_ms);
        return;
    }
    Buzzer_SetFreq(freq);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
    HAL_Delay(duration_ms - 30);
    mdelay(duration_ms - 30);
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4);
    HAL_Delay(30);
    mdelay(30);
}
/**
ex1.buzzer-music/Board/miscdev.c
@@ -12,6 +12,33 @@
/*
 *+----------------------+
 *|    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  |
 *+----------------------+
 */
@@ -103,10 +130,10 @@
void blink_led(int which, uint32_t interval)
{
    turn_led(which, ON);
    HAL_Delay(interval);
    mdelay(interval);
    turn_led(which, OFF);
    HAL_Delay(interval);
    mdelay(interval);
}
/**
ex1.buzzer-music/Board/miscdev.h
@@ -21,6 +21,13 @@
#define OFF    0
#define ON     1
/*
 *+----------------------+
 *|    STM32 GPIO API    |
 *+----------------------+
 */
/* 定义一个gpio的结构体,用来描述这个引脚的相关信息 */
typedef struct gpio_s
{
@@ -30,6 +37,8 @@
    int                 active; /* 1 for active high, 0 for active low */
} gpio_t;
extern void gpio_clk_enable(GPIO_TypeDef *port);
/*
 *+----------------------+
 *|    GPIO Relay API    |
@@ -151,4 +160,10 @@
 */
extern void udelay(uint16_t us);
/**
 * @brief  毫秒秒级延时,直接使用 HAL_Delay(),方便代码可读性
 * @param  ms: 延时时长(毫秒)
 */
#define mdelay(ms)  HAL_Delay(ms)
#endif /* __MISCDEV_H */
ex1.servo-sg90/.gitignore
New file
@@ -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
ex1.servo-sg90/.vscode/stm32flash.bat
New file
@@ -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.
ex1.servo-sg90/.vscode/stm32flash.exe
Binary files differ
ex1.servo-sg90/.vscode/tasks.json
New file
@@ -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"
        }
    ]
}
ex1.servo-sg90/Board/CMakeLists.txt
New file
@@ -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
)
ex1.servo-sg90/Board/buzzer.c
New file
@@ -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);
    }
}
ex1.servo-sg90/Board/buzzer.h
New file
@@ -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
ex1.servo-sg90/Board/miscdev.c
New file
@@ -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);
}
ex1.servo-sg90/Board/miscdev.h
New file
@@ -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 */
ex1.servo-sg90/Board/servo_sg90.c
New file
@@ -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);
}
ex1.servo-sg90/Board/servo_sg90.h
New file
@@ -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
ex1.servo-sg90/CMakeLists.txt
New file
@@ -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
)
ex1.servo-sg90/Core/Src/main.c
New file
@@ -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 */
ex1.servo-sg90/ISKBoard.ioc
New file
@@ -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
ex1.servo-sg90/MDK-ARM/ISKBoard.uvoptx
New file
@@ -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>
ex1.servo-sg90/MDK-ARM/ISKBoard.uvprojx
New file
@@ -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>
ex1.servo-sg90/do_clean.bat
New file
@@ -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
ex1.ws2812b/Board/buzzer.c
@@ -11,6 +11,7 @@
#include "tim.h"
#include "buzzer.h"
#define mdelay(ms)            HAL_Delay(ms)
#define ARRAY_SIZE(song)      (sizeof(song)/sizeof(song[0]))
/* 音符频率定义(Hz) */
@@ -147,12 +148,12 @@
        /* Start buzzer */
        HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
        HAL_Delay(interval);
        mdelay(interval);
        /* Stop buzzer */
        HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4);
        HAL_Delay(interval);
        mdelay(interval);
    }
}
@@ -164,18 +165,18 @@
    if (freq == 0)
    {
        HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4);
        HAL_Delay(duration_ms);
        mdelay(duration_ms);
        return;
    }
    Buzzer_SetFreq(freq);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
    HAL_Delay(duration_ms - 30);
    mdelay(duration_ms - 30);
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4);
    HAL_Delay(30);
    mdelay(30);
}
/**
ex1.ws2812b/Board/miscdev.c
@@ -12,6 +12,33 @@
/*
 *+----------------------+
 *|    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  |
 *+----------------------+
 */
@@ -103,10 +130,10 @@
void blink_led(int which, uint32_t interval)
{
    turn_led(which, ON);
    HAL_Delay(interval);
    mdelay(interval);
    turn_led(which, OFF);
    HAL_Delay(interval);
    mdelay(interval);
}
/**
ex1.ws2812b/Board/miscdev.h
@@ -21,6 +21,13 @@
#define OFF    0
#define ON     1
/*
 *+----------------------+
 *|    STM32 GPIO API    |
 *+----------------------+
 */
/* 定义一个gpio的结构体,用来描述这个引脚的相关信息 */
typedef struct gpio_s
{
@@ -30,6 +37,8 @@
    int                 active; /* 1 for active high, 0 for active low */
} gpio_t;
extern void gpio_clk_enable(GPIO_TypeDef *port);
/*
 *+----------------------+
 *|    GPIO Relay API    |
@@ -151,4 +160,10 @@
 */
extern void udelay(uint16_t us);
/**
 * @brief  毫秒秒级延时,直接使用 HAL_Delay(),方便代码可读性
 * @param  ms: 延时时长(毫秒)
 */
#define mdelay(ms)  HAL_Delay(ms)
#endif /* __MISCDEV_H */
ex1.ws2812b/Board/ws2812b.c
@@ -23,8 +23,6 @@
#include "ws2812b.h"
#include "miscdev.h"
#define mdelay(ms) HAL_Delay(ms)
static color_t g_ColorPanel[WS2812_NUM];
typedef struct ws_gpio_s
ex1.ws2812b/Core/Src/main.c
@@ -107,7 +107,7 @@
  while (1)
  {
    ws2812b_blink();
    HAL_Delay(10);
    mdelay(10);
    /* USER CODE END WHILE */