From c0e71a183b605c8e816d3b46e4a0465821be3b81 Mon Sep 17 00:00:00 2001 From: sunbeam Date: Tue, 18 Feb 2025 10:13:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E7=89=88=20LIN=20OK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + LIN Slave/.vscode/c_cpp_properties.json | 18 + LIN Slave/.vscode/launch.json | 24 + LIN Slave/.vscode/settings.json | 77 + .../Device/FM/FM33xx/Include/core_cm0plus.h | 1000 +++++ .../Device/FM/FM33xx/Include/core_cmFunc.h | 664 +++ .../Device/FM/FM33xx/Include/core_cmInstr.h | 916 ++++ .../Device/FM/FM33xx/Include/fm33lg0xx.h | 992 +++++ .../FM/FM33xx/Include/system_fm33lg0xx.h | 177 + .../Source/Templates/ARM/startup_fm33lg0xx.s | 231 + .../Templates/gcc/linker/fm33lg02x_flash.ld | 139 + .../Templates/gcc/linker/fm33lg04x_flash.ld | 131 + .../Source/Templates/gcc/startup_fm33lg0xx.s | 250 ++ .../Source/Templates/iar/startup_fm33lg0xx.s | 299 ++ .../FM/FM33xx/Source/system_fm33lg0xx.c | 300 ++ .../FM33LG0xx_FL_Driver/Inc/fm33_assert.h | 40 + .../FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl.h | 117 + .../Inc/fm33lg0xx_fl_adc.h | 2080 +++++++++ .../Inc/fm33lg0xx_fl_aes.h | 760 ++++ .../Inc/fm33lg0xx_fl_atim.h | 3749 +++++++++++++++++ .../Inc/fm33lg0xx_fl_bstim16.h | 481 +++ .../Inc/fm33lg0xx_fl_bstim32.h | 484 +++ .../Inc/fm33lg0xx_fl_can.h | 2215 ++++++++++ .../Inc/fm33lg0xx_fl_cdif.h | 222 + .../Inc/fm33lg0xx_fl_cmu.h | 2285 ++++++++++ .../Inc/fm33lg0xx_fl_comp.h | 1110 +++++ .../Inc/fm33lg0xx_fl_conf.h | 221 + .../Inc/fm33lg0xx_fl_crc.h | 469 +++ .../Inc/fm33lg0xx_fl_dac.h | 752 ++++ .../Inc/fm33lg0xx_fl_def.h | 92 + .../Inc/fm33lg0xx_fl_divas.h | 247 ++ .../Inc/fm33lg0xx_fl_dma.h | 1257 ++++++ .../Inc/fm33lg0xx_fl_exti.h | 132 + .../Inc/fm33lg0xx_fl_flash.h | 1020 +++++ .../Inc/fm33lg0xx_fl_gpio.h | 2167 ++++++++++ .../Inc/fm33lg0xx_fl_gptim.h | 2963 +++++++++++++ .../Inc/fm33lg0xx_fl_i2c.h | 1861 ++++++++ .../Inc/fm33lg0xx_fl_iwdt.h | 348 ++ .../Inc/fm33lg0xx_fl_lcd.h | 1192 ++++++ .../Inc/fm33lg0xx_fl_lptim16.h | 1319 ++++++ .../Inc/fm33lg0xx_fl_lptim32.h | 1296 ++++++ .../Inc/fm33lg0xx_fl_lpuart.h | 1128 +++++ .../Inc/fm33lg0xx_fl_pmu.h | 1017 +++++ .../Inc/fm33lg0xx_fl_rmu.h | 758 ++++ .../Inc/fm33lg0xx_fl_rng.h | 255 ++ .../Inc/fm33lg0xx_fl_rtca.h | 1374 ++++++ .../Inc/fm33lg0xx_fl_spi.h | 1251 ++++++ .../Inc/fm33lg0xx_fl_svd.h | 606 +++ .../Inc/fm33lg0xx_fl_uart.h | 1291 ++++++ .../Inc/fm33lg0xx_fl_vao.h | 645 +++ .../Inc/fm33lg0xx_fl_vref.h | 488 +++ .../Inc/fm33lg0xx_fl_vrefp.h | 521 +++ .../Inc/fm33lg0xx_fl_wwdt.h | 263 ++ .../FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl.c | 163 + .../Src/fm33lg0xx_fl_adc.c | 432 ++ .../Src/fm33lg0xx_fl_aes.c | 155 + .../Src/fm33lg0xx_fl_atim.c | 760 ++++ .../Src/fm33lg0xx_fl_bstim16.c | 157 + .../Src/fm33lg0xx_fl_bstim32.c | 151 + .../Src/fm33lg0xx_fl_can.c | 301 ++ .../Src/fm33lg0xx_fl_cmu.c | 289 ++ .../Src/fm33lg0xx_fl_comp.c | 219 + .../Src/fm33lg0xx_fl_crc.c | 167 + .../Src/fm33lg0xx_fl_dac.c | 199 + .../Src/fm33lg0xx_fl_divas.c | 182 + .../Src/fm33lg0xx_fl_dma.c | 229 + .../Src/fm33lg0xx_fl_exti.c | 263 ++ .../Src/fm33lg0xx_fl_flash.c | 568 +++ .../Src/fm33lg0xx_fl_gpio.c | 405 ++ .../Src/fm33lg0xx_fl_gptim.c | 641 +++ .../Src/fm33lg0xx_fl_i2c.c | 249 ++ .../Src/fm33lg0xx_fl_iwdt.c | 133 + .../Src/fm33lg0xx_fl_lcd.c | 341 ++ .../Src/fm33lg0xx_fl_lptim16.c | 374 ++ .../Src/fm33lg0xx_fl_lptim32.c | 348 ++ .../Src/fm33lg0xx_fl_lpuart.c | 281 ++ .../Src/fm33lg0xx_fl_pmu.c | 174 + .../Src/fm33lg0xx_fl_rng.c | 201 + .../Src/fm33lg0xx_fl_rtca.c | 187 + .../Src/fm33lg0xx_fl_spi.c | 229 + .../Src/fm33lg0xx_fl_svd.c | 191 + .../Src/fm33lg0xx_fl_uart.c | 375 ++ .../Src/fm33lg0xx_fl_vao.c | 226 + .../Src/fm33lg0xx_fl_vrefp.c | 167 + .../Src/fm33lg0xx_fl_wwdt.c | 128 + LIN Slave/EWARM/Backup of Example.ewd | 1374 ++++++ LIN Slave/EWARM/Backup of Example.ewp | 1095 +++++ LIN Slave/EWARM/Backup of Example.ewt | 1196 ++++++ LIN Slave/EWARM/Example.dep | 1142 +++++ LIN Slave/EWARM/Example.ewd | 1615 +++++++ LIN Slave/EWARM/Example.ewp | 1234 ++++++ LIN Slave/EWARM/Example.ewt | 1570 +++++++ LIN Slave/EWARM/Project.eww | 7 + .../EWARM/settings/Example.Example.cspy.bat | 40 + .../EWARM/settings/Example.Example.cspy.ps1 | 31 + .../EWARM/settings/Example.Example.driver.xcl | 29 + .../settings/Example.Example.general.xcl | 13 + LIN Slave/EWARM/settings/Example.crun | 13 + LIN Slave/EWARM/settings/Example.dbgdt | 930 ++++ LIN Slave/EWARM/settings/Example.dni | 130 + LIN Slave/EWARM/settings/Example.dnx | 220 + .../EWARM/settings/Example_Example.jlink | 39 + LIN Slave/EWARM/settings/Project.wsdt | 506 +++ LIN Slave/EWARM/settings/Project.wspos | 2 + .../settings/Project_EditorBookmarks.xml | 2 + LIN Slave/Inc/lin.h | 144 + LIN Slave/Inc/main.h | 83 + LIN Slave/Inc/sleep.h | 12 + LIN Slave/Inc/uart.h | 20 + LIN Slave/Inc/user_init.h | 120 + LIN Slave/MF-config/Inc/mf_config.h | 45 + LIN Slave/MF-config/Src/mf_config.c | 88 + LIN Slave/Src/lin.c | 1075 +++++ LIN Slave/Src/main.c | 43 + LIN Slave/Src/sleep.c | 156 + LIN Slave/Src/uart.c | 168 + LIN Slave/Src/user_init.c | 254 ++ 117 files changed, 65976 insertions(+) create mode 100644 .gitignore create mode 100644 LIN Slave/.vscode/c_cpp_properties.json create mode 100644 LIN Slave/.vscode/launch.json create mode 100644 LIN Slave/.vscode/settings.json create mode 100644 LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/core_cm0plus.h create mode 100644 LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/core_cmFunc.h create mode 100644 LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/core_cmInstr.h create mode 100644 LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/fm33lg0xx.h create mode 100644 LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/system_fm33lg0xx.h create mode 100644 LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/ARM/startup_fm33lg0xx.s create mode 100644 LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/gcc/linker/fm33lg02x_flash.ld create mode 100644 LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/gcc/linker/fm33lg04x_flash.ld create mode 100644 LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/gcc/startup_fm33lg0xx.s create mode 100644 LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/iar/startup_fm33lg0xx.s create mode 100644 LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/system_fm33lg0xx.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33_assert.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_adc.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_aes.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_atim.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_bstim16.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_bstim32.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_can.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_cdif.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_cmu.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_comp.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_conf.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_crc.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_dac.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_def.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_divas.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_dma.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_exti.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_flash.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_gpio.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_gptim.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_i2c.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_iwdt.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lcd.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lptim16.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lptim32.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lpuart.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_pmu.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_rmu.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_rng.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_rtca.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_spi.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_svd.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_uart.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_vao.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_vref.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_vrefp.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_wwdt.h create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_adc.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_aes.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_atim.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_bstim16.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_bstim32.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_can.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_cmu.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_comp.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_crc.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_dac.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_divas.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_dma.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_exti.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_flash.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_gpio.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_gptim.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_i2c.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_iwdt.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lcd.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lptim16.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lptim32.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lpuart.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_pmu.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_rng.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_rtca.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_spi.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_svd.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_uart.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_vao.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_vrefp.c create mode 100644 LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_wwdt.c create mode 100644 LIN Slave/EWARM/Backup of Example.ewd create mode 100644 LIN Slave/EWARM/Backup of Example.ewp create mode 100644 LIN Slave/EWARM/Backup of Example.ewt create mode 100644 LIN Slave/EWARM/Example.dep create mode 100644 LIN Slave/EWARM/Example.ewd create mode 100644 LIN Slave/EWARM/Example.ewp create mode 100644 LIN Slave/EWARM/Example.ewt create mode 100644 LIN Slave/EWARM/Project.eww create mode 100644 LIN Slave/EWARM/settings/Example.Example.cspy.bat create mode 100644 LIN Slave/EWARM/settings/Example.Example.cspy.ps1 create mode 100644 LIN Slave/EWARM/settings/Example.Example.driver.xcl create mode 100644 LIN Slave/EWARM/settings/Example.Example.general.xcl create mode 100644 LIN Slave/EWARM/settings/Example.crun create mode 100644 LIN Slave/EWARM/settings/Example.dbgdt create mode 100644 LIN Slave/EWARM/settings/Example.dni create mode 100644 LIN Slave/EWARM/settings/Example.dnx create mode 100644 LIN Slave/EWARM/settings/Example_Example.jlink create mode 100644 LIN Slave/EWARM/settings/Project.wsdt create mode 100644 LIN Slave/EWARM/settings/Project.wspos create mode 100644 LIN Slave/EWARM/settings/Project_EditorBookmarks.xml create mode 100644 LIN Slave/Inc/lin.h create mode 100644 LIN Slave/Inc/main.h create mode 100644 LIN Slave/Inc/sleep.h create mode 100644 LIN Slave/Inc/uart.h create mode 100644 LIN Slave/Inc/user_init.h create mode 100644 LIN Slave/MF-config/Inc/mf_config.h create mode 100644 LIN Slave/MF-config/Src/mf_config.c create mode 100644 LIN Slave/Src/lin.c create mode 100644 LIN Slave/Src/main.c create mode 100644 LIN Slave/Src/sleep.c create mode 100644 LIN Slave/Src/uart.c create mode 100644 LIN Slave/Src/user_init.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..82b8416 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/LIN Slave/EWARM/Example diff --git a/LIN Slave/.vscode/c_cpp_properties.json b/LIN Slave/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..cea4d3f --- /dev/null +++ b/LIN Slave/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "windows-gcc-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "gcc", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "windows-gcc-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git a/LIN Slave/.vscode/launch.json b/LIN Slave/.vscode/launch.json new file mode 100644 index 0000000..2f014ea --- /dev/null +++ b/LIN Slave/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "externalConsole": true, + "cwd": ".", + "program": "build/Debug/outDebug", + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/LIN Slave/.vscode/settings.json b/LIN Slave/.vscode/settings.json new file mode 100644 index 0000000..7eb1239 --- /dev/null +++ b/LIN Slave/.vscode/settings.json @@ -0,0 +1,77 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, +"C_Cpp_Runner.msvcSecureNoWarnings": false, +"MicroPython.executeButton": [ + { + "text": "▶", + "tooltip": "运行", + "alignment": "left", + "command": "extension.executeFile", + "priority": 3.5 + } +], +"MicroPython.syncButton": [ + { + "text": "$(sync)", + "tooltip": "同步", + "alignment": "left", + "command": "extension.execute", + "priority": 4 + } +] +} \ No newline at end of file diff --git a/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/core_cm0plus.h b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/core_cm0plus.h new file mode 100644 index 0000000..e39c6f3 --- /dev/null +++ b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/core_cm0plus.h @@ -0,0 +1,1000 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V5.00 + * @date 29. April 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0PLUS_H_GENERIC +#define __CORE_CM0PLUS_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex-M0+ + @{ + */ + +/* CMSIS CM0+ definitions */ +#define __CM0PLUS_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS HAL main version */ +#define __CM0PLUS_CMSIS_VERSION_SUB ( 0U) /*!< [15:0] CMSIS HAL sub version */ +#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ + __CM0PLUS_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/* Common defines in core_*.h files + - #define __ASM Compiler keyword for asm + - #define __INLINE Compiler keyword for inline + - #define __STATIC_INLINE Compiler keyword for static inline + - #define __NO_RETURN function that never returns + - #define __USED function or variable that is not optimized away + - #define __WEAK weak function or variable + - #define __UNALIGNED_UINT32 pointer to unaligned uint32_t variable + */ +#if defined ( __CC_ARM ) /* ARM Compiler 4/5 */ + #define __ASM __asm + #define __INLINE __inline + #define __STATIC_INLINE static __inline + #define __NO_RETURN __declspec(noreturn) + #define __USED __attribute__((used)) + #define __WEAK __attribute__((weak)) + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler 6 */ + #define __ASM __asm + #define __INLINE __inline + #define __STATIC_INLINE static __inline + #define __NO_RETURN __attribute__((noreturn)) + #define __USED __attribute__((used)) + #define __WEAK __attribute__((weak)) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + +#elif defined ( __GNUC__ ) /* GNU Compiler */ + #define __ASM __asm + #define __INLINE inline + #define __STATIC_INLINE static inline + #define __NO_RETURN __attribute__((noreturn)) + #define __USED __attribute__((used)) + #define __WEAK __attribute__((weak)) + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + +#elif defined ( __ICCARM__ ) /* IAR Compiler */ + #define __ASM __asm + #define __INLINE inline + #define __STATIC_INLINE static inline + #define __NO_RETURN __noreturn + #define __USED + #define __WEAK __weak +// struct __packed T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + +#elif defined ( __TI_ARM__ ) /* TI ARM Compiler */ + #define __ASM __asm + #define __INLINE inline + #define __STATIC_INLINE static inline + #define __NO_RETURN __attribute__((noreturn)) + #define __USED __attribute__((used)) + #define __WEAK __attribute__((weak)) + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + +#elif defined ( __TASKING__ ) /* TASKING Compiler */ + #define __ASM __asm + #define __INLINE inline + #define __STATIC_INLINE static inline + #define __NO_RETURN __attribute__((noreturn)) + #define __USED __attribute__((used)) + #define __WEAK __attribute__((weak)) + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + +#elif defined ( __CSMC__ ) /* COSMIC Compiler */ + #define __packed + #define __ASM _asm + #define __INLINE inline + #define __STATIC_INLINE static inline + #define __NO_RETURN + #define __USED + #define __WEAK + #define __UNALIGNED_UINT32(x) (*x) + +#else + #error Unknown compiler +#endif + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "core_cminstr.h" /* Core Instruction Access */ +#include "core_cmfunc.h" /* Core Function Access */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0PLUS_H_DEPENDANT +#define __CORE_CM0PLUS_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0PLUS_REV + #define __CM0PLUS_REV 0x0000U + #warning "__CM0PLUS_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex-M0+ */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0+ header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Cortex-M0+ Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +/* Interrupt Priorities are WORD accessible only under ARMv6M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be nagative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be nagative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be nagative. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be nagative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be nagative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/core_cmFunc.h b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/core_cmFunc.h new file mode 100644 index 0000000..b6ad0a4 --- /dev/null +++ b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/core_cmFunc.h @@ -0,0 +1,664 @@ +/**************************************************************************//** + * @file core_cmFunc.h + * @brief CMSIS Cortex-M Core Function Access Header File + * @version V4.10 + * @date 18. March 2015 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2015 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#ifndef __CORE_CMFUNC_H +#define __CORE_CMFUNC_H + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + +/* intrinsic void __enable_irq(); */ +/* intrinsic void __disable_irq(); */ + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** \brief Get IPSR Register + + This function returns the content of the IPSR Register. + + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xff); +} + + +/** \brief Set Base Priority with condition + + This function assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xff); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1); +} + +#endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */ + + +#if (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#endif +} + +#endif /* (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07) */ + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief Enable IRQ Interrupts + + This function enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** \brief Disable IRQ Interrupts + + This function disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +/** \brief Get IPSR Register + + This function returns the content of the IPSR Register. + + \return IPSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp"); +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp"); +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory"); +} + + +/** \brief Set Base Priority with condition + + This function assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + + \param [in] basePri Base Priority value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t value) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (value) : "memory"); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + uint32_t result; + + /* Empty asm statement works as a scheduling barrier */ + __ASM volatile (""); + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + __ASM volatile (""); + return(result); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + /* Empty asm statement works as a scheduling barrier */ + __ASM volatile (""); + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc"); + __ASM volatile (""); +#endif +} + +#endif /* (__CORTEX_M == 0x04) || (__CORTEX_M == 0x07) */ + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ +#include + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ +#include + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + +#elif defined ( __CSMC__ ) /*------------------ COSMIC Compiler -------------------*/ +/* Cosmic specific functions */ +#include + +#endif + +/*@} end of CMSIS_Core_RegAccFunctions */ + +#endif /* __CORE_CMFUNC_H */ diff --git a/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/core_cmInstr.h b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/core_cmInstr.h new file mode 100644 index 0000000..fca425c --- /dev/null +++ b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/core_cmInstr.h @@ -0,0 +1,916 @@ +/**************************************************************************//** + * @file core_cmInstr.h + * @brief CMSIS Cortex-M Core Instruction Access Header File + * @version V4.10 + * @date 18. March 2015 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2014 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#ifndef __CORE_CMINSTR_H +#define __CORE_CMINSTR_H + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0) + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0) + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0) + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** \brief Rotate Right in unsigned value (32 bit) + + This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + + \param [in] value Value to rotate + \param [in] value Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** \brief Breakpoint + + This function causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + int32_t s = 4 /*sizeof(v)*/ * 8 - 1; // extra shift needed at end + + result = value; // r will be reversed bits of v; first get LSB of v + for (value >>= 1; value; value >>= 1) + { + result <<= 1; + result |= value & 1; + s--; + } + result <<= s; // shift when v's highest bits are zero + return(result); +} +#endif + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) + +/** \brief LDR Exclusive (8 bit) + + This function executes a exclusive LDR instruction for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) + + +/** \brief LDR Exclusive (16 bit) + + This function executes a exclusive LDR instruction for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) + + +/** \brief LDR Exclusive (32 bit) + + This function executes a exclusive LDR instruction for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) + + +/** \brief STR Exclusive (8 bit) + + This function executes a exclusive STR instruction for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (16 bit) + + This function executes a exclusive STR instruction for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (32 bit) + + This function executes a exclusive STR instruction for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW(value, ptr) __strex(value, ptr) + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +#define __CLREX __clrex + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** \brief Rotate Right with Extend (32 bit) + + This function moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** \brief LDRT Unprivileged (8 bit) + + This function executes a Unprivileged LDRT instruction for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** \brief LDRT Unprivileged (16 bit) + + This function executes a Unprivileged LDRT instruction for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** \brief LDRT Unprivileged (32 bit) + + This function executes a Unprivileged LDRT instruction for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** \brief STRT Unprivileged (8 bit) + + This function executes a Unprivileged STRT instruction for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** \brief STRT Unprivileged (16 bit) + + This function executes a Unprivileged STRT instruction for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** \brief STRT Unprivileged (32 bit) + + This function executes a Unprivileged STRT instruction for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */ + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constrant "l" + * Otherwise, use general registers, specified by constrant "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +__attribute__((always_inline)) __STATIC_INLINE void __NOP(void) +{ + __ASM volatile ("nop"); +} + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +__attribute__((always_inline)) __STATIC_INLINE void __WFI(void) +{ + __ASM volatile ("wfi"); +} + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +__attribute__((always_inline)) __STATIC_INLINE void __WFE(void) +{ + __ASM volatile ("wfe"); +} + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +__attribute__((always_inline)) __STATIC_INLINE void __SEV(void) +{ + __ASM volatile ("sev"); +} + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +__attribute__((always_inline)) __STATIC_INLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__attribute__((always_inline)) __STATIC_INLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__attribute__((always_inline)) __STATIC_INLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +#endif +} + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (short)__builtin_bswap16(value); +#else + uint32_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +#endif +} + + +/** \brief Rotate Right in unsigned value (32 bit) + + This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + + \param [in] value Value to rotate + \param [in] value Number of Bits to rotate + \return Rotated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + return (op1 >> op2) | (op1 << (32 - op2)); +} + + +/** \brief Breakpoint + + This function causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + int32_t s = 4 /*sizeof(v)*/ * 8 - 1; // extra shift needed at end + + result = value; // r will be reversed bits of v; first get LSB of v + for (value >>= 1; value; value >>= 1) + { + result <<= 1; + result |= value & 1; + s--; + } + result <<= s; // shift when v's highest bits are zero +#endif + return(result); +} + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __builtin_clz + + +#if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) + +/** \brief LDR Exclusive (8 bit) + + This function executes a exclusive LDR instruction for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** \brief LDR Exclusive (16 bit) + + This function executes a exclusive LDR instruction for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** \brief LDR Exclusive (32 bit) + + This function executes a exclusive LDR instruction for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** \brief STR Exclusive (8 bit) + + This function executes a exclusive STR instruction for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** \brief STR Exclusive (16 bit) + + This function executes a exclusive STR instruction for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** \brief STR Exclusive (32 bit) + + This function executes a exclusive STR instruction for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +__attribute__((always_inline)) __STATIC_INLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Rotate Right with Extend (32 bit) + + This function moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + + \param [in] value Value to rotate + \return Rotated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** \brief LDRT Unprivileged (8 bit) + + This function executes a Unprivileged LDRT instruction for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** \brief LDRT Unprivileged (16 bit) + + This function executes a Unprivileged LDRT instruction for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** \brief LDRT Unprivileged (32 bit) + + This function executes a Unprivileged LDRT instruction for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** \brief STRT Unprivileged (8 bit) + + This function executes a Unprivileged STRT instruction for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *addr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*addr) : "r" ((uint32_t)value) ); +} + + +/** \brief STRT Unprivileged (16 bit) + + This function executes a Unprivileged STRT instruction for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *addr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*addr) : "r" ((uint32_t)value) ); +} + + +/** \brief STRT Unprivileged (32 bit) + + This function executes a Unprivileged STRT instruction for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *addr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*addr) : "r" (value) ); +} + +#endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */ + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ +#include + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ +#include + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + +#elif defined ( __CSMC__ ) /*------------------ COSMIC Compiler -------------------*/ +/* Cosmic specific functions */ +#include + +#endif + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + +#endif /* __CORE_CMINSTR_H */ diff --git a/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/fm33lg0xx.h b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/fm33lg0xx.h new file mode 100644 index 0000000..336cece --- /dev/null +++ b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/fm33lg0xx.h @@ -0,0 +1,992 @@ +/**************************************************************************************************** * @file FM33LG0XX.h + * + * @brief CMSIS CORTEX-M0 Peripheral Access Layer Header File for + * FM33LG0XX from Keil. + * + * @version V0.0.1 + * @date 14 july 2020 + * + * @note Generated with SVDConv V2.87e + * from CMSIS SVD File 'FM33LG0XX.SVD' Version 1.0, + * + * @par ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontroller, but can be equally used for other + * suitable processor architectures. This file can be freely distributed. + * Modifications to this file shall be clearly marked. + * + * THIS SOFTWARE IS PROVIDED “AS IS”. NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + *******************************************************************************************************/ + + +/** @addtogroup Keil + * @{ + */ + +/** @addtogroup FM33LG0XX + * @{ + */ + +#ifndef __FM33LG0XX_H +#define __FM33LG0XX_H + +#ifdef __cplusplus +extern "C" { +#endif + + +#define __RCHF_INITIAL_CLOCK (8000000) /* Value of the Internal RC HIGH oscillator in Hz */ +#define __RCLP_CLOCK (32000) /* Value of the Internal RC LOW oscillator in Hz */ +#define __XTHF_CLOCK (8000000) /* Value of the EXTERNAL oscillator in Hz */ +#define __XTLF_CLOCK (32768) /* Value of the EXTERNAL oscillator in Hz */ + +/** + * @brief Configuration of the Cortex-M0 Processor and Core Peripherals + */ +#define __CM0_REV 0x0100U /*!< Cortex-M0 Core Revision */ +#define __MPU_PRESENT 1U /*!< MPU present or not */ +#define __VTOR_PRESENT 1U /*!< VTOR present or not */ +#define __NVIC_PRIO_BITS 2U /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ +/* ------------------------- Interrupt Number Definition ------------------------ */ + +/** + * @brief FM33LG0XX Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ + +typedef enum { +/****** Cortex-M0 Processor Exceptions Numbers ****************************************************************/ + Reset_IRQn = -15, /*!< 1 复位向量 */ + NMI_IRQn = -14, /*!< 2 WKUPx中断、低功耗模式错误中断 */ + HardFault_IRQn = -13, /*!< 3 HardFault中断向量 */ + SVC_IRQn = -5, /*!< 11 SVCall系统服务请求 */ + PendSV_IRQn = -2, /*!< 14 可挂起系统服务请求 */ + SysTick_IRQn = -1, /*!< 15 内部定时器中断向量 */ + +/* -------------------- FM33LG0XX specific Interrupt Numbers --------------------*/ + WWDT_IRQn = 0, /*!< 0 窗口看门狗或独立看门狗中断 */ + SVD_IRQn = 1, /*!< 1 电源监测报警中断 */ + RTCx_IRQn = 2, /*!< 2 实时时钟中断 */ + FLASH_IRQn = 3, /*!< 3 NVMIF中断 */ + FDET_IRQn = 4, /*!< 4 XTLF或XTHF停振检测中断、系统时钟选择错误中断 */ + ADC_IRQn = 5, /*!< 5 ADC转换完成中断 */ + DAC_IRQn = 6, /*!< 6 DAC中断 */ + SPI0_IRQn = 7, /*!< 7 SPI0中断 */ + SPI1_IRQn = 8, /*!< 8 SPI1中断 */ + SPI2_IRQn = 9, /*!< 9 SPI2中断 */ + UART0_IRQn = 10, /*!< 10 UART0中断 */ + UART1_IRQn = 11, /*!< 11 UART1中断 */ + UART3_IRQn = 12, /*!< 12 UART3中断 */ + UART4_IRQn = 13, /*!< 13 UART4中断 */ + UART5_IRQn = 14, /*!< 14 UART5中断 */ + LPUARTx_IRQn = 16, /*!< 16 LPUART0/1/2中断 */ + I2C_IRQn = 17, /*!< 17 I2C中断 */ + CCL_IRQn = 18, /*!< 18 时钟校准中断 */ + AES_IRQn = 19, /*!< 19 AES中断 */ + LPTIMx_IRQn = 20, /*!< 20 LPTIM16或LPTIM32中断 */ + DMA_IRQn = 21, /*!< 21 DMA中断 */ + WKUPx_IRQn = 22, /*!< 22 WKUP引脚中断 */ + LUT_IRQn = 23, /*!< 23 LUT中断 */ + BSTIM_IRQn = 24, /*!< 24 BSTIM16或BSTIM32中断 */ + COMPx_IRQn = 25, /*!< 25 COMPx中断 */ + GPTIM01_IRQn = 26, /*!< 26 通用定时器0,1中断 */ + GPTIM2_IRQn = 27, /*!< 27 通用定时器2中断 */ + ATIM_IRQn = 28, /*!< 28 高级定时器中断 */ + VREF_IRQn = 29, /*!< 29 1.2V内部基准电压建立中断、VREF_VREG中断 */ + GPIO_IRQn = 30, /*!< 30 外部引脚中断 */ + CAN_IRQn = 31, /*!< 31 CAN2.0中断 */ + +} IRQn_Type; + + +/** @addtogroup Configuration_of_CMSIS + * @{ + */ + +/* ================================================================================ */ +/* ================ Processor and Core Peripheral Section ================ */ +/* ================================================================================ */ + +#include "core_cm0plus.h" /*!< Cortex-M0 processor and core peripherals */ +#include "system_fm33lg0xx.h" /*!< FM33LG0XX System */ + +/* ================================================================================ */ +/* ================ Device Specific Peripheral Section ================ */ +/* ================================================================================ */ + +/** @addtogroup Device_Peripheral_Registers + * @{ + */ + +/* ================================================================================ */ +/* ================ FLS ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t RDCR; /*!< Flash Read Control Register, Address offset: 0x00 */ + __IO uint32_t PFCR; /*!< Flash Prefetch Control Register, Address offset: 0x04 */ + __I uint32_t OPTBR; /*!< Flash Option Bytes Register, Address offset: 0x08 */ + __IO uint32_t ACLOCK1; /*!< Flash Application Code Lock Register1, Address offset: 0x0C */ + __IO uint32_t ACLOCK2; /*!< Flash Application Code Lock Register2, Address offset: 0x10 */ + __IO uint32_t EPCR; /*!< Flash Erase/Program Control Register, Address offset: 0x14 */ + __O uint32_t KEY; /*!< Flash Key Register, Address offset: 0x18 */ + __IO uint32_t IER; /*!< Flash Interrupt Enable Register, Address offset: 0x1C */ + __IO uint32_t ISR; /*!< Flash Interrupt Status Register, Address offset: 0x20 */ +}FLASH_Type; + + +/* ================================================================================ */ +/* ================ PMU ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR; /*!< Power Management Control Register, Address offset: 0x00 */ + __IO uint32_t WKTR; /*!< Wakeup Time Register, Address offset: 0x04 */ + __IO uint32_t WKFR; /*!< Wakeup Source Flags Register, Address offset: 0x08 */ + __IO uint32_t IER; /*!< PMU Interrupt Enable Register, Address offset: 0x0C */ + __IO uint32_t ISR; /*!< PMU Interrupt and Status Register, Address offset: 0x10 */ + __IO uint32_t RSV1[9]; /*!< RESERVED REGISTER, Address offset: 0x14 */ + __IO uint32_t ULPB_TR; /*!< ULPBG trim Register, Address offset: 0x38 */ +}PMU_Type; + +/* ================================================================================ */ +/* ================ VREFP ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR; /*!< VREFP Control Register, Address offset: 0x00 */ + __IO uint32_t CFGR; /*!< VREFP Config Register, Address offset: 0x04 */ + __IO uint32_t ISR; /*!< VREFP Interrupt Status Register, Address offset: 0x08 */ + __IO uint32_t TR; /*!< VREFP Trim Register, Address offset: 0x0C */ +}VREFP_Type; + +/* ================================================================================ */ +/* ================ VREF ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR; /*!< VREF Control Register, Address offset: 0x00 */ + __IO uint32_t CFGR; /*!< VREF Config Register, Address offset: 0x04 */ + __IO uint32_t ISR; /*!< VREF Status Register, Address offset: 0x08 */ + __IO uint32_t IER; /*!< VREF Interrupt Enable Register, Address offset: 0x0C */ + __IO uint32_t BUFCR; /*!< Buffer Control Register, Address offset: 0x10 */ +}VREF_Type; + + +/* ================================================================================ */ +/* ================ VAO ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t RSV1[512]; /*!< RESERVED REGISTER, Address offset: 0x00 */ + __IO uint32_t RSTCR; /*!< VBAT Reset Control Register, Address offset: 0x800 */ + __IO uint32_t XTLFCR; /*!< XTLF Control Register, Address offset: 0x804 */ + __IO uint32_t XTLFPR; /*!< XTLF Power Register, Address offset: 0x808 */ + __IO uint32_t FDIER; /*!< XTLF Oscillation Fail Detection Interrupt Enable Register,Address offset: 0x80C */ + __IO uint32_t FDISR; /*!< XTLF Oscillation Fail Detection Interrupt Status Register,Address offset: 0x810 */ + __IO uint32_t RSV2[251]; /*!< RESERVED REGISTER, Address offset: 0x814 */ + __IO uint32_t INEN; /*!< VAO IO Input Enable Register, Address offset: 0xC00 */ + __IO uint32_t PUEN; /*!< VAO IO Pull-up Enable Register, Address offset: 0xC04 */ + __IO uint32_t ODEN; /*!< VAO IO Open Drain Enable Register, Address offset: 0xC08 */ + __IO uint32_t FCR; /*!< VAO IO Function Control Register, Address offset: 0xC0C */ + __IO uint32_t DOR; /*!< VAO IO Data Output Register, Address offset: 0xC10 */ + __I uint32_t DIR; /*!< VAO IO Data Input Register, Address offset: 0xC14 */ + __IO uint32_t VILR; /*!< VAO IO Voltage Input Low Register, Address offset: 0xC18 */ +}VAO_Type; + + +/* ================================================================================ */ +/* ================ CDIF ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR; /*!< , Address offset: 0x00 */ + __IO uint32_t PRSC; /*!< , Address offset: 0x04 */ +}CDIF_Type; + + +/* ================================================================================ */ +/* ================ RMU ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t PDRCR; /*!< PDR Control Register, Address offset: 0x00 */ + __IO uint32_t BORCR; /*!< BOR Control Register, Address offset: 0x04 */ + __IO uint32_t LKPCR; /*!< Reset Config Register, Address offset: 0x08 */ + __O uint32_t SOFTRST; /*!< Software Reset Register, Address offset: 0x0C */ + __IO uint32_t RSTFR; /*!< Reset Flag Register, Address offset: 0x10 */ + __O uint32_t PRSTEN; /*!< Peripheral Reset Enable Register, Address offset: 0x14 */ + __IO uint32_t AHBRSTCR; /*!< AHB Peripherals Reset Register, Address offset: 0x18 */ + __IO uint32_t APBRSTCR1; /*!< APB Peripherals Reset Register1, Address offset: 0x1C */ + __IO uint32_t APBRSTCR2; /*!< APB Peripherals Reset Register2, Address offset: 0x20 */ +}RMU_Type; + + +/* ================================================================================ */ +/* ================ IWDT ================ */ +/* ================================================================================ */ + +typedef struct +{ + __O uint32_t SERV; /*!< IWDT Service Register, Address offset: 0x00 */ + __IO uint32_t CR; /*!< IWDT Config Register, Address offset: 0x04 */ + __I uint32_t CNT; /*!< IWDT Counter Register, Address offset: 0x08 */ + __IO uint32_t WIN; /*!< IWDT Window Register, Address offset: 0x0C */ + __IO uint32_t IER; /*!< IWDT Interrupt Enable Register, Address offset: 0x10 */ + __IO uint32_t ISR; /*!< IWDT Interrupt Status Register, Address offset: 0x14 */ +}IWDT_Type; + + +/* ================================================================================ */ +/* ================ WWDT ================ */ +/* ================================================================================ */ + +typedef struct +{ + __O uint32_t CR; /*!< WWDT Control Register, Address offset: 0x00 */ + __IO uint32_t CFGR; /*!< WWDT Config Register, Address offset: 0x04 */ + __I uint32_t CNT; /*!< WWDT Counter Register, Address offset: 0x08 */ + __IO uint32_t IER; /*!< WWDT Interrupt Enable Register, Address offset: 0x0C */ + __IO uint32_t ISR; /*!< WWDT Interrupt Status Register, Address offset: 0x10 */ + __I uint32_t PSC; /*!< WWDT Prescaler Register, Address offset: 0x14 */ +}WWDT_Type; + + +/* ================================================================================ */ +/* ================ CMU ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t SYSCLKCR; /*!< System Clock Control Register, Address offset: 0x00 */ + __IO uint32_t RCHFCR; /*!< RCHF Control Register, Address offset: 0x04 */ + __IO uint32_t RCHFTR; /*!< RCHF Trim Register, Address offset: 0x08 */ + __IO uint32_t PLLCR; /*!< PLL Control Register, Address offset: 0x0C */ + __IO uint32_t RCLPCR; /*!< RCLP Control Register, Address offset: 0x10 */ + __IO uint32_t RCLPTR; /*!< RCLP Trim Register, Address offset: 0x14 */ + __IO uint32_t RSV1; /*!< RESERVED REGISTER, Address offset: 0x18 */ + __IO uint32_t LSCLKSEL; /*!< LSCLK Select Register, Address offset: 0x1C */ + __IO uint32_t XTHFCR; /*!< XTHF Control Register, Address offset: 0x20 */ + __IO uint32_t RCLFCR; /*!< RCLF Control Register, Address offset: 0x24 */ + __IO uint32_t RCLFTR; /*!< RCLF Trim Register, Address offset: 0x28 */ + __IO uint32_t IER; /*!< Interrupt Enable Register, Address offset: 0x2C */ + __IO uint32_t ISR; /*!< Interrupt Status Register, Address offset: 0x30 */ + __IO uint32_t PCLKCR1; /*!< Peripheral bus Clock Control Register1, Address offset: 0x34 */ + __IO uint32_t PCLKCR2; /*!< Peripheral bus Clock Control Register2, Address offset: 0x38 */ + __IO uint32_t PCLKCR3; /*!< Peripheral bus Clock Control Register3, Address offset: 0x3C */ + __IO uint32_t PCLKCR4; /*!< Peripheral bus Clock Control Register4, Address offset: 0x40 */ + __IO uint32_t OPCCR1; /*!< Peripheral Clock Config Register1, Address offset: 0x44 */ + __IO uint32_t OPCCR2; /*!< Peripheral Clock Config Register 2, Address offset: 0x48 */ + __IO uint32_t OPCCR3; /*!< Peripheral Clock Config Register 3, Address offset: 0x4C */ + __IO uint32_t AHBMCR; /*!< AHB Master Control Register, Address offset: 0x50 */ + __IO uint32_t CCCR; /*!< Clock Calibration Control Register, Address offset: 0x54 */ + __IO uint32_t CCFR; /*!< Clock Calibration Config Register, Address offset: 0x58 */ + __I uint32_t CCNR; /*!< Clock Calibration Counter Register, Address offset: 0x5C */ + __IO uint32_t CCISR; /*!< Clock Calibration Interrupt Status Register, Address offset: 0x60 */ +}CMU_Type; + + +/* ================================================================================ */ +/* ================ SVD ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CFGR; /*!< SVD Config Register, Address offset: 0x00 */ + __IO uint32_t CR; /*!< SVD Control Register, Address offset: 0x04 */ + __IO uint32_t IER; /*!< SVD Interrupt Enable Register, Address offset: 0x08 */ + __IO uint32_t ISR; /*!< SVD Interrupt Status Register, Address offset: 0x0C */ + __IO uint32_t VSR; /*!< SVD reference Voltage Select Register, Address offset: 0x10 */ +}SVD_Type; + + +/* ================================================================================ */ +/* ================ AES ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR; /*!< AES Control Register, Address offset: 0x00 */ + __IO uint32_t IER; /*!< AES Interrupt Enable Register, Address offset: 0x04 */ + __IO uint32_t ISR; /*!< AES Interrupt Status Register, Address offset: 0x08 */ + __IO uint32_t DIR; /*!< AES Data Input Register, Address offset: 0x0C */ + __I uint32_t DOR; /*!< AES Data Output Register, Address offset: 0x10 */ + __IO uint32_t KEY0; /*!< AES Key Register 0, Address offset: 0x14 */ + __IO uint32_t KEY1; /*!< AES Key Register 1, Address offset: 0x18 */ + __IO uint32_t KEY2; /*!< AES Key Register 2, Address offset: 0x1C */ + __IO uint32_t KEY3; /*!< AES Key Register 3, Address offset: 0x20 */ + __IO uint32_t KEY4; /*!< AES Key Register 4, Address offset: 0x24 */ + __IO uint32_t KEY5; /*!< AES Key Register 5, Address offset: 0x28 */ + __IO uint32_t KEY6; /*!< AES Key Register 6, Address offset: 0x2C */ + __IO uint32_t KEY7; /*!< AES Key Register 7, Address offset: 0x30 */ + __IO uint32_t IVR0; /*!< AES Initial Vector Register 0, Address offset: 0x34 */ + __IO uint32_t IVR1; /*!< AES Initial Vector Register 1, Address offset: 0x38 */ + __IO uint32_t IVR2; /*!< AES Initial Vector Register 2, Address offset: 0x3C */ + __IO uint32_t IVR3; /*!< AES Initial Vector Register 3, Address offset: 0x40 */ + __IO uint32_t H0; /*!< AES MultH parameter Register 0, Address offset: 0x44 */ + __IO uint32_t H1; /*!< AES MultH parameter Register 1, Address offset: 0x48 */ + __IO uint32_t H2; /*!< AES MultH parameter Register 2, Address offset: 0x4C */ + __IO uint32_t H3; /*!< AES MultH parameter Register 3, Address offset: 0x50 */ +}AES_Type; + + +/* ================================================================================ */ +/* ================ RNG ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR; /*!< Random Number Generator Control Register, Address offset: 0x00 */ + __I uint32_t DOR; /*!< Random Number Generator Data Output Register, Address offset: 0x04 */ + __IO uint32_t RSV1[2]; /*!< RESERVED REGISTER, Address offset: 0x08 */ + __IO uint32_t SR; /*!< Random Number Generator Status Register, Address offset: 0x10 */ + __IO uint32_t CRCCR; /*!< CRC Control Register, Address offset: 0x14 */ + __IO uint32_t CRCDIR; /*!< CRC Data input Register, Address offset: 0x18 */ + __IO uint32_t CRCSR; /*!< CRC Status Register, Address offset: 0x1C */ +}RNG_Type; + + +/* ================================================================================ */ +/* ================ COMP ================ */ +/* ================================================================================ */ +typedef struct +{ + __IO uint32_t CR; /*!< ComparatorControl Register 1, Address offset: 0x00 */ + +} COMP_Type; + +typedef struct +{ + __IO uint32_t ICR; /*!< Comparator Interrupt Config Register, Address offset: 0x0C */ + __IO uint32_t ISR; /*!< Comparator Interrupt Status Register, Address offset: 0x10 */ + __IO uint32_t BUFCR; /*!< Comparator Buffer Control Register, Address offset: 0x14 */ +}COMP_COMMON_Type; + + +/* ================================================================================ */ +/* ================ CALC ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t OPRD; /*!< Operand Register, Address offset: 0x00 */ + __IO uint32_t DIVSOR; /*!< Divisor Regsiter, Address offset: 0x04 */ + __I uint32_t QUOT; /*!< Quotient Register, Address offset: 0x08 */ + __I uint32_t REMD; /*!< Reminder Register, Address offset: 0x0C */ + __I uint32_t ROOT; /*!< Root Register, Address offset: 0x10 */ + __I uint32_t SR; /*!< Status Register, Address offset: 0x14 */ + __IO uint32_t CR; /*!< Control Register, Address offset: 0x18 */ +}DIVAS_Type; + + +/* ================================================================================ */ +/* ================ I2C ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t MSPCFGR; /*!< I2C Master Config Register, Address offset: 0x00 */ + __IO uint32_t MSPCR; /*!< I2C Master Control Register, Address offset: 0x04 */ + __IO uint32_t MSPIER; /*!< I2C Master Intterupt Enable Register, Address offset: 0x08 */ + __IO uint32_t MSPISR; /*!< I2C Master Interrupt Status Register, Address offset: 0x0C */ + __IO uint32_t MSPSR; /*!< I2C Master Status Register, Address offset: 0x10 */ + __IO uint32_t MSPBGR; /*!< I2C Master Baud rate Generator Register, Address offset: 0x14 */ + __IO uint32_t MSPBUF; /*!< I2C Master transfer Buffer, Address offset: 0x18 */ + __IO uint32_t MSPTCR; /*!< I2C Master Timing Control Register, Address offset: 0x1C */ + __IO uint32_t MSPTOR; /*!< I2C Master Time-Out Register, Address offset: 0x20 */ + __IO uint32_t SSPCR; /*!< I2C Slave Control Register, Address offset: 0x24 */ + __IO uint32_t SSPIER; /*!< I2C Slave Interrupt Enable Register, Address offset: 0x28 */ + __IO uint32_t SSPISR; /*!< I2C Slave Interrupt Status Register, Address offset: 0x2C */ + __I uint32_t SSPSR; /*!< I2C Slave Status Register, Address offset: 0x30 */ + __IO uint32_t SSPBUF; /*!< I2C Slave transfer Buffer, Address offset: 0x34 */ + __IO uint32_t SSPADR; /*!< I2C Slave Address Register, Address offset: 0x38 */ +}I2C_Type; + + +/* ================================================================================ */ +/* ================ UART_COMMON ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t IRCR; /*!< Infrared modulation Control Register, Address offset: 0x00 */ +}UART_COMMON_Type; + + +/* ================================================================================ */ +/* ================ UARTx ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CSR; /*!< UARTx Control Status Register, Address offset: 0x00 */ + __IO uint32_t IER; /*!< UARTx Interrupt Enable Register, Address offset: 0x04 */ + __IO uint32_t ISR; /*!< UARTx Interrupt Status Register, Address offset: 0x08 */ + __IO uint32_t TODR; /*!< UARTx Time-Out and Delay Register, Address offset: 0x0C */ + __I uint32_t RXBUF; /*!< UARTx Receive Buffer, Address offset: 0x10 */ + __O uint32_t TXBUF; /*!< UARTx Transmit Buffer, Address offset: 0x14 */ + __IO uint32_t BGR; /*!< UARTx Baud rate Generator Register, Address offset: 0x18 */ +}UART_Type; + + +/* ================================================================================ */ +/* ================ LPUARTx ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CSR; /*!< LPUARTx Control Status Register, Address offset: 0x00 */ + __IO uint32_t IER; /*!< LPUARTx Interrupt Enable Register, Address offset: 0x04 */ + __IO uint32_t ISR; /*!< LPUARTx Interrupt Status Register, Address offset: 0x08 */ + __IO uint32_t BMR; /*!< LPUARTx Baud rate Modulation Register, Address offset: 0x0C */ + __I uint32_t RXBUF; /*!< LPUARTx Receive Buffer Register, Address offset: 0x10 */ + __IO uint32_t TXBUF; /*!< LPUARTx Transmit Buffer Register, Address offset: 0x14 */ + __IO uint32_t DMR; /*!< LPUARTx data Matching Register, Address offset: 0x18 */ +}LPUART_Type; + + +/* ================================================================================ */ +/* ================ SPIx ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR1; /*!< SPIxControl Register1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< SPIxControl Register2, Address offset: 0x04 */ + __IO uint32_t CR3; /*!< Control Register3, Address offset: 0x08 */ + __IO uint32_t IER; /*!< SPIxInterrupt Enable Register, Address offset: 0x0C */ + __IO uint32_t ISR; /*!< SPIxStatus Register, Address offset: 0x10 */ + __O uint32_t TXBUF; /*!< SPIxTransmit Buffer, Address offset: 0x14 */ + __I uint32_t RXBUF; /*!< SPIxReceive Buffer, Address offset: 0x18 */ +}SPI_Type; + + +/* ================================================================================ */ +/* ================ CAN ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR; /*!< CAN Control Register, Address offset: 0x00 */ + __IO uint32_t MSR; /*!< CAN mode select register, Address offset: 0x04 */ + __IO uint32_t BRPR; /*!< CAN Baud rate Prescaler Register, Address offset: 0x08 */ + __IO uint32_t BTR; /*!< CAN Bit Timing Register, Address offset: 0x0C */ + __I uint32_t ECR; /*!< CAN Error Counter Register, Address offset: 0x10 */ + __IO uint32_t ESR; /*!< CAN Error Status Register, Address offset: 0x14 */ + __I uint32_t SR; /*!< CAN Status Register, Address offset: 0x18 */ + __I uint32_t ISR; /*!< CAN Interrupt Status Register, Address offset: 0x1C */ + __IO uint32_t IER; /*!< CAN Interrupt Enable Register, Address offset: 0x20 */ + __IO uint32_t ICR; /*!< CAN Interrupt Clear Register, Address offset: 0x24 */ + __IO uint32_t RSV1[2]; /*!< RESERVED REGISTER, Address offset: 0x28 */ + __O uint32_t TXFIDR; /*!< CAN TX FIFO ID Register, Address offset: 0x30 */ + __O uint32_t TXFDLCR; /*!< CAN TX FIFO DLC Register, Address offset: 0x34 */ + __O uint32_t TXFDW1R; /*!< CAN TX FIFO Data Word1 Register, Address offset: 0x38 */ + __O uint32_t TXFDW2R; /*!< CAN TX FIFO Data Word2 Register, Address offset: 0x3C */ + __O uint32_t HPBIDR; /*!< CAN TX HPB ID Register, Address offset: 0x40 */ + __O uint32_t HPBDLCR; /*!< CAN TX HPB DLC Register, Address offset: 0x44 */ + __O uint32_t HPBDW1R; /*!< CAN TX HPB Data Word1 Register, Address offset: 0x48 */ + __O uint32_t HPBDW2R; /*!< CAN TX HPB Data Word2 Register, Address offset: 0x4C */ + __O uint32_t RXFIDR; /*!< CAN RX FIFO ID Register, Address offset: 0x50 */ + __O uint32_t RXFDLCR; /*!< CAN RX FIFO DLC Register, Address offset: 0x54 */ + __O uint32_t RXFDW1R; /*!< CAN RX FIFO Data Word1 Register, Address offset: 0x58 */ + __O uint32_t RXFDW2R; /*!< CAN RX FIFO Data Word2 Register, Address offset: 0x5C */ + __IO uint32_t AFR; /*!< Acceptance Filter Register, Address offset: 0x60 */ + __IO uint32_t AFMR0; /*!< Acceptance Filter Mask Register0, Address offset: 0x64 */ + __IO uint32_t AFIR0; /*!< Acceptance Filter ID Register0, Address offset: 0x68 */ + __IO uint32_t AFMR1; /*!< Acceptance Filter Mask Register1, Address offset: 0x6C */ + __IO uint32_t AFIR1; /*!< Acceptance Filter ID Register1, Address offset: 0x70 */ + __IO uint32_t AFMR2; /*!< Acceptance Filter Mask Register2, Address offset: 0x74 */ + __IO uint32_t AFIR2; /*!< Acceptance Filter ID Register2, Address offset: 0x78 */ + __IO uint32_t AFMR3; /*!< Acceptance Filter Mask Register3, Address offset: 0x7C */ + __IO uint32_t AFIR3; /*!< Acceptance Filter ID Register3, Address offset: 0x80 */ +}CAN_Type; + + +/* ================================================================================ */ +/* ================ DMA ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t GCR; /*!< DMA Global Control Register, Address offset: 0x00 */ + __IO uint32_t CH0CR; /*!< Channel 0 Control Register, Address offset: 0x04 */ + __IO uint32_t CH0MAD; /*!< Channel 0 Memory Address Register, Address offset: 0x08 */ + __IO uint32_t CH1CR; /*!< Channel 1 Control Register, Address offset: 0x0C */ + __IO uint32_t CH1MAD; /*!< Channel 1 Memory Address Register, Address offset: 0x10 */ + __IO uint32_t CH2CR; /*!< Channel 2 Control Register, Address offset: 0x14 */ + __IO uint32_t CH2MAD; /*!< Channel 2 Memory Address Register, Address offset: 0x18 */ + __IO uint32_t CH3CR; /*!< Channel 3 Control Register, Address offset: 0x1C */ + __IO uint32_t CH3MAD; /*!< Channel 3 Memory Address Register, Address offset: 0x20 */ + __IO uint32_t CH4CR; /*!< Channel 4 Control Register, Address offset: 0x24 */ + __IO uint32_t CH4MAD; /*!< Channel 4 Memory Address Register, Address offset: 0x28 */ + __IO uint32_t CH5CR; /*!< Channel 5 Control Register, Address offset: 0x2C */ + __IO uint32_t CH5MAD; /*!< Channel 5 Memory Address Register, Address offset: 0x30 */ + __IO uint32_t CH6CR; /*!< Channel 6 Control Register, Address offset: 0x34 */ + __IO uint32_t CH6MAD; /*!< Channel 6 Memory Address Register, Address offset: 0x38 */ + __IO uint32_t CH7CR; /*!< Channel 11 Control Register, Address offset: 0x3C */ + __IO uint32_t CH7FLSAD; /*!< Channel 11 Flash Address Register, Address offset: 0x40 */ + __IO uint32_t CH7RAMAD; /*!< Channel 11 RAM Address Register, Address offset: 0x44 */ + __IO uint32_t ISR; /*!< DMA Interrupt Status Register, Address offset: 0x48 */ +}DMA_Type; + + +/* ================================================================================ */ +/* ================ CRC ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t DR; /*!< CRC Data Register, Address offset: 0x00 */ + __IO uint32_t CR; /*!< Control Register, Address offset: 0x04 */ + __IO uint32_t LFSR; /*!< CRC Linear Feedback Shift Register, Address offset: 0x08 */ + __IO uint32_t XOR; /*!< CRC output XOR Register, Address offset: 0x0C */ + __IO uint32_t RSV1[3]; /*!< RESERVED REGISTER, Address offset: 0x10 */ + __IO uint32_t POLY; /*!< CRC Polynominal Register, Address offset: 0x1C */ +}CRC_Type; + + +/* ================================================================================ */ +/* ================ ATIM ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR1; /*!< ATIM Control Register1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< ATIM Control Register2, Address offset: 0x04 */ + __IO uint32_t SMCR; /*!< ATIM Slave Mode Control Register, Address offset: 0x08 */ + __IO uint32_t DIER; /*!< ATIM DMA and Interrupt Enable Register, Address offset: 0x0C */ + __IO uint32_t ISR; /*!< ATIM Interrupt Status Register, Address offset: 0x10 */ + __O uint32_t EGR; /*!< ATIM Event Generation Register, Address offset: 0x14 */ + __IO uint32_t CCMR1; /*!< ATIM Capture/Compare Mode Register1, Address offset: 0x18 */ + __IO uint32_t CCMR2; /*!< ATIM Capture/Compare Mode Register2, Address offset: 0x1C */ + __IO uint32_t CCER; /*!< ATIM Capture/Compare Enable Register, Address offset: 0x20 */ + __IO uint32_t CNT; /*!< ATIM Counter Register, Address offset: 0x24 */ + __IO uint32_t PSC; /*!< ATIM Prescaler Register, Address offset: 0x28 */ + __IO uint32_t ARR; /*!< ATIM Auto-Reload Register, Address offset: 0x2C */ + __IO uint32_t RCR; /*!< ATIM Repetition Counter Register, Address offset: 0x30 */ + __IO uint32_t CCR1; /*!< ATIM Capture/Compare Register1, Address offset: 0x34 */ + __IO uint32_t CCR2; /*!< ATIM Capture/Compare Register2, Address offset: 0x38 */ + __IO uint32_t CCR3; /*!< ATIM Capture/Compare Register3, Address offset: 0x3C */ + __IO uint32_t CCR4; /*!< ATIM Capture/Compare Register4, Address offset: 0x40 */ + __IO uint32_t BDTR; /*!< ATIM Break and Deadtime Register, Address offset: 0x44 */ + __IO uint32_t DCR; /*!< ATIM DMA Control Register, Address offset: 0x48 */ + __IO uint32_t DMAR; /*!< ATIM DMA Access Register, Address offset: 0x4C */ + __IO uint32_t RSV1[4]; /*!< RESERVED REGISTER, Address offset: 0x50 */ + __IO uint32_t BKCR; /*!< ATIM Break Control Register, Address offset: 0x60 */ +}ATIM_Type; + + +/* ================================================================================ */ +/* ================ GPTIMx ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR1; /*!< GPTIMx Control Register1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< GPTIMx Control Register2, Address offset: 0x04 */ + __IO uint32_t SMCR; /*!< GPTIMx Slave Mode Control Register, Address offset: 0x08 */ + __IO uint32_t DIER; /*!< GPTIMx DMA and Interrupt Enable Register, Address offset: 0x0C */ + __IO uint32_t ISR; /*!< Interrupt Status Register, Address offset: 0x10 */ + __O uint32_t EGR; /*!< GPTIMx Event Generation Register, Address offset: 0x14 */ + __IO uint32_t CCMR1; /*!< GPTIMx Capture/Compare Mode Register1, Address offset: 0x18 */ + __IO uint32_t CCMR2; /*!< GPTIMx Capture/Compare Mode Register2, Address offset: 0x1C */ + __IO uint32_t CCER; /*!< GPTIMx Capture/Compare Enable Register, Address offset: 0x20 */ + __IO uint32_t CNT; /*!< GPTIMx Counter Register, Address offset: 0x24 */ + __IO uint32_t PSC; /*!< GPTIMx Prescaler Register, Address offset: 0x28 */ + __IO uint32_t ARR; /*!< GPTIMx Auto-Reload Register, Address offset: 0x2C */ + __IO uint32_t RSV1; /*!< RESERVED REGISTER, Address offset: 0x30 */ + __IO uint32_t CCR1; /*!< GPTIMx Capture/Compare Register1, Address offset: 0x34 */ + __IO uint32_t CCR2; /*!< GPTIMx Capture/Compare Register2, Address offset: 0x38 */ + __IO uint32_t CCR3; /*!< GPTIMx Capture/Compare Register3, Address offset: 0x3C */ + __IO uint32_t CCR4; /*!< GPTIMx Capture/Compare Register4, Address offset: 0x40 */ + __IO uint32_t RSV2; /*!< RESERVED REGISTER, Address offset: 0x44 */ + __IO uint32_t DCR; /*!< GPTIMx DMA Control Register, Address offset: 0x48 */ + __IO uint32_t DMAR; /*!< GPTIMx DMA access Register, Address offset: 0x4C */ + __IO uint32_t RSV3[4]; /*!< RESERVED REGISTER, Address offset: 0x50 */ + __IO uint32_t ITRSEL; /*!< GPTIMx Internal Trigger Select Register, Address offset: 0x60 */ +}GPTIM_Type; + + +/* ================================================================================ */ +/* ================ BSTIM32 ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR1; /*!< BSTIM Control Register1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< BSTIM Control Register2, Address offset: 0x04 */ + __IO uint32_t RSV1; /*!< RESERVED REGISTER, Address offset: 0x08 */ + __IO uint32_t IER; /*!< BSTIM Interrupt Enable Register, Address offset: 0x0C */ + __IO uint32_t ISR; /*!< BSTIM Interrupt Status Register, Address offset: 0x10 */ + __O uint32_t EGR; /*!< BSTIM Event Generation Register, Address offset: 0x14 */ + __IO uint32_t RSV2[3]; /*!< RESERVED REGISTER, Address offset: 0x18 */ + __IO uint32_t CNT; /*!< BSTIM Counter Register, Address offset: 0x24 */ + __IO uint32_t PSC; /*!< BSTIM Prescaler Register, Address offset: 0x28 */ + __IO uint32_t ARR; /*!< BSTIM Auto-Reload Register, Address offset: 0x2C */ +}BSTIM32_Type; + + +/* ================================================================================ */ +/* ================ BSTIM16 ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR1; /*!< BSTIM Control Register1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< BSTIM Control Register2, Address offset: 0x04 */ + __IO uint32_t RSV1; /*!< RESERVED REGISTER, Address offset: 0x08 */ + __IO uint32_t IER; /*!< BSTIM Interrupt Enable Register, Address offset: 0x0C */ + __IO uint32_t ISR; /*!< BSTIM Interrupt Status Register, Address offset: 0x10 */ + __O uint32_t EGR; /*!< BSTIM Event Generation Register, Address offset: 0x14 */ + __IO uint32_t RSV2[3]; /*!< RESERVED REGISTER, Address offset: 0x18 */ + __IO uint32_t CNT; /*!< BSTIM Counter Register, Address offset: 0x24 */ + __IO uint32_t PSC; /*!< BSTIM Prescaler Register, Address offset: 0x28 */ + __IO uint32_t ARR; /*!< BSTIM Auto-Reload Register, Address offset: 0x2C */ +}BSTIM16_Type; + + +/* ================================================================================ */ +/* ================ LPTIM32 ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CFGR; /*!< LPTIM32 Config Register, Address offset: 0x00 */ + __I uint32_t CNT; /*!< LPTIM32 Counter Register, Address offset: 0x04 */ + __IO uint32_t CCSR; /*!< LPTIM32 Capture/Compare Control and Status Register, Address offset: 0x08 */ + __IO uint32_t ARR; /*!< LPTIM32 Auto-Reload Register, Address offset: 0x0C */ + __IO uint32_t IER; /*!< LPTIM32 Interrupt Enable Register, Address offset: 0x10 */ + __IO uint32_t ISR; /*!< LPTIM32 Interrupt Status Register, Address offset: 0x14 */ + __IO uint32_t CR; /*!< LPTIM32 Control Register, Address offset: 0x18 */ + __IO uint32_t RSV1; /*!< RESERVED REGISTER, Address offset: 0x1C */ + __IO uint32_t CCR1; /*!< LPTIM32 Capture/Compare Register1, Address offset: 0x20 */ + __IO uint32_t CCR2; /*!< LPTIM32 Capture/Compare Register2, Address offset: 0x24 */ + __IO uint32_t CCR3; /*!< LPTIM32 Capture/Compare Register3, Address offset: 0x28 */ + __IO uint32_t CCR4; /*!< LPTIM32 Capture/Compare Register4, Address offset: 0x2C */ +}LPTIM32_Type; + + +/* ================================================================================ */ +/* ================ LPTIM16 ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CFGR; /*!< LPTIM Config Register, Address offset: 0x00 */ + __I uint32_t CNT; /*!< LPTIM Counter Register, Address offset: 0x04 */ + __IO uint32_t CCSR; /*!< LPTIM Capture/Compare Control and Status Register, Address offset: 0x08 */ + __IO uint32_t ARR; /*!< LPTIM Auto-Reload Register, Address offset: 0x0C */ + __IO uint32_t IER; /*!< LPTIM Interrupt Enable Register, Address offset: 0x10 */ + __IO uint32_t ISR; /*!< LPTIM Interrupt Status Register, Address offset: 0x14 */ + __IO uint32_t CR; /*!< LPTIM Control Register, Address offset: 0x18 */ + __IO uint32_t RSV1; /*!< RESERVED REGISTER, Address offset: 0x1C */ + __IO uint32_t CCR1; /*!< LPTIM Capture/Compare Register1, Address offset: 0x20 */ + __IO uint32_t CCR2; /*!< LPTIM Capture/Compare Register2, Address offset: 0x24 */ +}LPTIM16_Type; + + +/* ================================================================================ */ +/* ================ RTCA ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t WER; /*!< RTC Write Enable Register, Address offset: 0x00 */ + __IO uint32_t IER; /*!< RTC Interrupt Enable Register, Address offset: 0x04 */ + __IO uint32_t ISR; /*!< RTC Interrupt Status Register, Address offset: 0x08 */ + __IO uint32_t BCDSEC; /*!< BCD format time second registers, Address offset: 0x0C */ + __IO uint32_t BCDMIN; /*!< BCD format time minute registers, Address offset: 0x10 */ + __IO uint32_t BCDHOUR; /*!< BCD format time hour registers, Address offset: 0x14 */ + __IO uint32_t BCDDAY; /*!< BCD format time day registers, Address offset: 0x18 */ + __IO uint32_t BCDWEEK; /*!< BCD format time week registers, Address offset: 0x1C */ + __IO uint32_t BCDMONTH; /*!< BCD format time month registers, Address offset: 0x20 */ + __IO uint32_t BCDYEAR; /*!< BCD format time year registers, Address offset: 0x24 */ + __IO uint32_t ALARM; /*!< RTCA Alarm Register, Address offset: 0x28 */ + __IO uint32_t TMSEL; /*!< RTCA Time Mark Select, Address offset: 0x2C */ + __IO uint32_t ADJUST; /*!< RTCA time Adjust Register, Address offset: 0x30 */ + __IO uint32_t ADSIGN; /*!< RTCA time Adjust Sign Register, Address offset: 0x34 */ + __IO uint32_t RSV1; /*!< RESERVED REGISTER, Address offset: 0x38 */ + __IO uint32_t SBSCNT; /*!< RTCA Sub-Second Counter, Address offset: 0x3C */ + __IO uint32_t CR; /*!< RTCA Control Register, Address offset: 0x40 */ +}RTCA_Type; + + +/* ================================================================================ */ +/* ================ LCD ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR; /*!< LCD Control Register, Address offset: 0x00 */ + __IO uint32_t TEST; /*!< LCD test Register, Address offset: 0x04 */ + __IO uint32_t FCR; /*!< LCD Frequency Control Register, Address offset: 0x08 */ + __IO uint32_t FLKT; /*!< LCD Flick Time Register, Address offset: 0x0C */ + __IO uint32_t RSV1; /*!< RESERVED REGISTER, Address offset: 0x10 */ + __IO uint32_t IER; /*!< LCD Interrupt Enable Register, Address offset: 0x14 */ + __IO uint32_t ISR; /*!< LCD Interrupt Status Register, Address offset: 0x18 */ + __IO uint32_t RSV2[2]; /*!< RESERVED REGISTER, Address offset: 0x1C */ + __IO uint32_t DATA0; /*!< LCD data buffer registers 0, Address offset: 0x24 */ + __IO uint32_t DATA1; /*!< LCD data buffer registers 1, Address offset: 0x28 */ + __IO uint32_t DATA2; /*!< LCD data buffer registers 2, Address offset: 0x2C */ + __IO uint32_t DATA3; /*!< LCD data buffer registers 3, Address offset: 0x30 */ + __IO uint32_t DATA4; /*!< LCD data buffer registers 4, Address offset: 0x34 */ + __IO uint32_t DATA5; /*!< LCD data buffer registers 5, Address offset: 0x38 */ + __IO uint32_t DATA6; /*!< LCD data buffer registers 6, Address offset: 0x3C */ + __IO uint32_t DATA7; /*!< LCD data buffer registers 7, Address offset: 0x40 */ + __IO uint32_t DATA8; /*!< LCD data buffer registers 8, Address offset: 0x44 */ + __IO uint32_t DATA9; /*!< LCD data buffer registers 9, Address offset: 0x48 */ + __IO uint32_t RSV3; /*!< RESERVED REGISTER, Address offset: 0x4C */ + __IO uint32_t COMEN; /*!< LCD COM Enable Register, Address offset: 0x50 */ + __IO uint32_t SEGEN0; /*!< LCD SEG Enable Register0, Address offset: 0x54 */ + __IO uint32_t SEGEN1; /*!< LCD SEG Enable Register 1, Address offset: 0x58 */ +}LCD_Type; + + +/* ================================================================================ */ +/* ================ ADC ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t ISR; /*!< ADC Interrupt and Status Register, Address offset: 0x00 */ + __IO uint32_t IER; /*!< ADC Interrupt Enable Register, Address offset: 0x04 */ + __IO uint32_t CR1; /*!< ADC Control Register, Address offset: 0x08 */ + __IO uint32_t CR2; /*!< ADC Control Register, Address offset: 0x0C */ + __IO uint32_t CALR; /*!< ADC Calibration Register, Address offset: 0x10 */ + __IO uint32_t CFGR1; /*!< ADC Config Register1, Address offset: 0x14 */ + __IO uint32_t CFGR2; /*!< ADC Config Register2, Address offset: 0x18 */ + __IO uint32_t SMTR; /*!< ADC Sampling Time Register, Address offset: 0x1C */ + __IO uint32_t CHER; /*!< ADC Channel Enable Register, Address offset: 0x20 */ + __IO uint32_t DCR; /*!< ADC Differential Channel Control Register, Address offset: 0x24 */ + __I uint32_t DR; /*!< ADC Data Register, Address offset: 0x28 */ + __IO uint32_t HLTR; /*!< ADC analog watchdog Threshold Register, Address offset: 0x2C */ +}ADC_Type; + + +/* ================================================================================ */ +/* ================ DAC ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t CR1; /*!< DAC Control Register, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< DAC Control Register, Address offset: 0x04 */ + __IO uint32_t CFGR; /*!< DAC Config Register, Address offset: 0x08 */ + __O uint32_t SWTRGR; /*!< DAC Software Trigger Register, Address offset: 0x0C */ + __IO uint32_t DHR; /*!< DAC Data Holding Register, Address offset: 0x10 */ + __IO uint32_t ISR; /*!< DAC Interrupt Status Register, Address offset: 0x14 */ + __IO uint32_t IER; /*!< DAC Interrupt Enable Register, Address offset: 0x18 */ + __IO uint32_t SHTR; /*!< DAC Sample Hold Time Register, Address offset: 0x1C */ +}DAC_Type; + + +/* ================================================================================ */ +/* ================ GPIO ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t INEN; /*!< GPIOx Input Enable Register, Address offset: 0x00 */ + __IO uint32_t PUEN; /*!< GPIOx Pull-Up Enable Register, Address offset: 0x04 */ + __IO uint32_t ODEN; /*!< GPIOx Open-Drain Enable Register, Address offset: 0x08 */ + __IO uint32_t FCR; /*!< GPIOx Function Control Register, Address offset: 0x0C */ + __IO uint32_t DO; /*!< GPIOx Data Output Register, Address offset: 0x10 */ + __O uint32_t DSET; /*!< GPIOx Data Set Register, Address offset: 0x14 */ + __O uint32_t DRST; /*!< GPIOx Data Reset Register, Address offset: 0x18 */ + __I uint32_t DIN; /*!< GPIOx Data Input Register, Address offset: 0x1C */ + __IO uint32_t DFS; /*!< GPIOx Digital Function Select, Address offset: 0x20 */ + __IO uint32_t RSV1; /*!< RESERVED REGISTER, Address offset: 0x24 */ + __IO uint32_t ANEN; /*!< GPIOx Analog channel Enable Register, Address offset: 0x28 */ + __IO uint32_t VILR; /*!< GPIOx Voltage Input Low Register, Address offset: 0x2C */ +}GPIO_Type; + + +/* ================================================================================ */ +/* ================ GPIO_COMMON ================ */ +/* ================================================================================ */ + +typedef struct +{ + __IO uint32_t EXTISEL0; /*!< External Interrupt Input Select Register0, Address offset: 0x00 */ + __IO uint32_t EXTISEL1; /*!< External Interrupt Input Select Register1, Address offset: 0x04 */ + __IO uint32_t EXTIEDS0; /*!< External Interrupt Edge Select and Enable Register0, Address offset: 0x08 */ + __IO uint32_t EXTIEDS1; /*!< External Interrupt Edge Select and Enable Register1, Address offset: 0x0C */ + __IO uint32_t EXTIDF; /*!< External Interrupt Digital Filter Register, Address offset: 0x10 */ + __IO uint32_t EXTIISR; /*!< External Interrupt and Status Register, Address offset: 0x14 */ + __I uint32_t EXTIDI; /*!< External Interrupt Data Input Register, Address offset: 0x18 */ + __IO uint32_t RSV1[9]; /*!< RESERVED REGISTER, Address offset: 0x1C */ + __IO uint32_t FOUTSEL; /*!< Frequency Output Select Register, Address offset: 0x100 */ + __IO uint32_t RSV2[63]; /*!< RESERVED REGISTER, Address offset: 0x104 */ + __IO uint32_t PINWKEN; /*!< Wakeup Enable Register, Address offset: 0x200 */ +}GPIO_COMMON_Type; + + +/* ================================================================================ */ +/* ================ DBG ================ */ +/* ================================================================================ */ + +typedef struct +{ + __I uint32_t SYSCFG; /*!< , Address offset: 0x00 */ + __IO uint32_t CR; /*!< , Address offset: 0x04 */ + __IO uint32_t HDFR; /*!< , Address offset: 0x08 */ +}DBG_Type; + + + +/* ================================================================================ */ +/* ================ CPU memory map ================ */ +/* ================================================================================ */ + + +/* Peripheral and SRAM base address */ + +#define FLASH_BASE (( uint32_t)0x00000000) +#define SRAM_BASE (( uint32_t)0x20000000) +#define PERIPH_BASE (( uint32_t)0x40000000) + + +/* ================================================================================ */ +/* ================ Peripheral memory map ================ */ +/* ================================================================================ */ + +/* Peripheral memory map */ + +#define FLASH_R_BASE (PERIPH_BASE +0x00001000) +#define PMU_BASE (PERIPH_BASE +0x00002000) +#define VREFP_BASE (PERIPH_BASE +0x0000203C) +#define VREF_BASE (PERIPH_BASE +0x0001A400) +#define VAO_BASE (PERIPH_BASE +0x0001F000) +#define CDIF_BASE (PERIPH_BASE +0x0001E000) +#define RMU_BASE (PERIPH_BASE +0x00002800) +#define IWDT_BASE (PERIPH_BASE +0x00011400) +#define WWDT_BASE (PERIPH_BASE +0x00011800) +#define CMU_BASE (PERIPH_BASE +0x00002400) +#define SVD_BASE (PERIPH_BASE +0x00012800) +#define AES_BASE (PERIPH_BASE +0x00013800) +#define RNG_BASE (PERIPH_BASE +0x00013C00) +#define COMP1_BASE (PERIPH_BASE +0x00015400) +#define COMP2_BASE (PERIPH_BASE +0x00015404) +#define COMP3_BASE (PERIPH_BASE +0x00015408) +#define COMP_COMMON_BASE (PERIPH_BASE +0x0001540C) +#define DIVAS_BASE (PERIPH_BASE +0x00019C00) +#define I2C_BASE (PERIPH_BASE +0x00012400) +#define UART_COMMON_BASE (PERIPH_BASE +0x00017C00) +#define UART0_BASE (PERIPH_BASE +0x00012000) +#define UART1_BASE (PERIPH_BASE +0x00016800) +#define UART3_BASE (PERIPH_BASE +0x00017000) +#define UART4_BASE (PERIPH_BASE +0x00017400) +#define UART5_BASE (PERIPH_BASE +0x00017800) +#define LPUART0_BASE (PERIPH_BASE +0x00014000) +#define LPUART1_BASE (PERIPH_BASE +0x00014400) +#define LPUART2_BASE (PERIPH_BASE +0x00015000) +#define SPI0_BASE (PERIPH_BASE +0x00010400) +#define SPI1_BASE (PERIPH_BASE +0x00010800) +#define SPI2_BASE (PERIPH_BASE +0x00014800) +#define CAN_BASE (PERIPH_BASE +0x00019400) +#define DMA_BASE (PERIPH_BASE +0x00000400) +#define CRC_BASE (PERIPH_BASE +0x00010000) +#define ATIM_BASE (PERIPH_BASE +0x00013000) +#define GPTIM0_BASE (PERIPH_BASE +0x00014C00) +#define GPTIM1_BASE (PERIPH_BASE +0x00016400) +#define GPTIM2_BASE (PERIPH_BASE +0x00018000) +#define BSTIM32_BASE (PERIPH_BASE +0x00016000) +#define BSTIM16_BASE (PERIPH_BASE +0x00018C00) +#define LPTIM32_BASE (PERIPH_BASE +0x00013400) +#define LPTIM16_BASE (PERIPH_BASE +0x00018800) +#define RTCA_BASE (PERIPH_BASE +0x00011000) +#define LCD_BASE (PERIPH_BASE +0x00010C00) +#define ADC_BASE (PERIPH_BASE +0x00015C00) +#define DAC_BASE (PERIPH_BASE +0x00019800) +#define GPIOA_BASE (PERIPH_BASE +0x00000C00) +#define GPIOB_BASE (PERIPH_BASE +0x00000C40) +#define GPIOC_BASE (PERIPH_BASE +0x00000C80) +#define GPIOD_BASE (PERIPH_BASE +0x00000CC0) +#define GPIOE_BASE (PERIPH_BASE +0x00000D00) +#define GPIO_COMMON_BASE (PERIPH_BASE +0x00000DC0) +#define DBG_BASE (PERIPH_BASE +0x00000000) + +/* ================================================================================ */ +/* ================ Peripheral declaration ================ */ +/* ================================================================================ */ + +#define FLASH ((FLASH_Type *) FLASH_R_BASE ) +#define PMU ((PMU_Type *) PMU_BASE ) +#define VREFP ((VREFP_Type *) VREFP_BASE ) +#define VREF ((VREF_Type *) VREF_BASE ) +#define VAO ((VAO_Type *) VAO_BASE ) +#define CDIF ((CDIF_Type *) CDIF_BASE ) +#define RMU ((RMU_Type *) RMU_BASE ) +#define IWDT ((IWDT_Type *) IWDT_BASE ) +#define WWDT ((WWDT_Type *) WWDT_BASE ) +#define CMU ((CMU_Type *) CMU_BASE ) +#define SVD ((SVD_Type *) SVD_BASE ) +#define AES ((AES_Type *) AES_BASE ) +#define RNG ((RNG_Type *) RNG_BASE ) +#define COMP1 ((COMP_Type *) COMP1_BASE ) +#define COMP2 ((COMP_Type *) COMP2_BASE ) +#define COMP3 ((COMP_Type *) COMP3_BASE ) +#define COMP ((COMP_COMMON_Type *)COMP_COMMON_BASE ) +#define DIVAS ((DIVAS_Type *) DIVAS_BASE ) +#define I2C ((I2C_Type *) I2C_BASE ) +#define UART ((UART_COMMON_Type *) UART_COMMON_BASE ) +#define UART0 ((UART_Type *) UART0_BASE ) +#define UART1 ((UART_Type *) UART1_BASE ) +#define UART3 ((UART_Type *) UART3_BASE ) +#define UART4 ((UART_Type *) UART4_BASE ) +#define UART5 ((UART_Type *) UART5_BASE ) +#define LPUART0 ((LPUART_Type *) LPUART0_BASE ) +#define LPUART1 ((LPUART_Type *) LPUART1_BASE ) +#define LPUART2 ((LPUART_Type *) LPUART2_BASE ) +#define SPI0 ((SPI_Type *) SPI0_BASE ) +#define SPI1 ((SPI_Type *) SPI1_BASE ) +#define SPI2 ((SPI_Type *) SPI2_BASE ) +#define CAN ((CAN_Type *) CAN_BASE ) +#define DMA ((DMA_Type *) DMA_BASE ) +#define CRC ((CRC_Type *) CRC_BASE ) +#define ATIM ((ATIM_Type *) ATIM_BASE ) +#define GPTIM0 ((GPTIM_Type *) GPTIM0_BASE ) +#define GPTIM1 ((GPTIM_Type *) GPTIM1_BASE ) +#define GPTIM2 ((GPTIM_Type *) GPTIM2_BASE ) +#define BSTIM32 ((BSTIM32_Type *) BSTIM32_BASE ) +#define BSTIM16 ((BSTIM16_Type *) BSTIM16_BASE ) +#define LPTIM32 ((LPTIM32_Type *) LPTIM32_BASE ) +#define LPTIM16 ((LPTIM16_Type *) LPTIM16_BASE ) +#define RTCA ((RTCA_Type *) RTCA_BASE ) +#define LCD ((LCD_Type *) LCD_BASE ) +#define ADC ((ADC_Type *) ADC_BASE ) +#define DAC ((DAC_Type *) DAC_BASE ) +#define GPIOA ((GPIO_Type *) GPIOA_BASE ) +#define GPIOB ((GPIO_Type *) GPIOB_BASE ) +#define GPIOC ((GPIO_Type *) GPIOC_BASE ) +#define GPIOD ((GPIO_Type *) GPIOD_BASE ) +#define GPIOE ((GPIO_Type *) GPIOE_BASE ) +#define GPIO ((GPIO_COMMON_Type *) GPIO_COMMON_BASE ) +#define DBG ((DBG_Type *) DBG_BASE ) + +/* ================================================================================ */ +/* ================ Peripheral include ================ */ +/* ================================================================================ */ + +/** @} */ /* End of group Device_Peripheral_Registers */ +/** @} */ /* End of group FM33LG0XX */ +/** @} */ /* End of group Keil */ + +#ifdef __cplusplus +} +#endif + +#endif /* FM33LG0XX_H */ + diff --git a/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/system_fm33lg0xx.h b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/system_fm33lg0xx.h new file mode 100644 index 0000000..8b9b6eb --- /dev/null +++ b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Include/system_fm33lg0xx.h @@ -0,0 +1,177 @@ +/**************************************************************************//** + * @file system_fm33lg0xx.h + * @brief CMSIS Cortex-M0 Device Peripheral Access Layer Header File for + * Device FM33LG0XX + * @version V2.0.0 + * @date 15. Mar 2021 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2012 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + +#ifndef SYSTEM_FM33LC0XX_H +#define SYSTEM_FM33LC0XX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief CMSIS Device version number + */ +#define __FM33LG0xx_CMSIS_VERSION_MAIN (0x02) /*!< [31:24] main version */ +#define __FM33LG0xx_CMSIS_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ +#define __FM33LG0xx_CMSIS_VERSION_SUB2 (0x00) /*!< [15:0] sub2 version */ +#define __FM33LG0xx_CMSIS_VERSION ((__FM33LG0xx_CMSIS_VERSION_MAIN << 24)\ + |(__FM33LG0xx_CMSIS_VERSION_SUB1 << 16)\ + |(__FM33LG0xx_CMSIS_VERSION_SUB2)) + +/* Configurations ------------------------------------------------------------*/ +/** + * @brief LSCLK auto switch + * @note Comment the following line to enable LSCLK auto switch function. + */ +#define USE_LSCLK_AUTO_SWITCH + + +/** + * @brief Keep debug connection under sleep mode + * @note Uncomment the following line to debug under sleep mode + */ +/* #define USE_DEBUG_UNDER_SLEEP */ + +/** + * @brief Open IWDT on program startup + * @note Uncomment the following line to use IWDT on startup. User can modify + * the IWDT_OVERFLOW_PERIOD to change the IDWT overflow period. + */ +/* #define USE_IWDT_ON_STARTUP */ + +#ifdef USE_IWDT_ON_STARTUP + +/* + Valid value of IWDT_OVERFLOW_PERIOD: + - 0x0: 125ms + - 0x1: 250ms + - 0x2: 500ms + - 0x3: 1s + - 0x4: 2s + - 0x5: 4s + - 0x6: 8s + - 0x7: 16s + */ +#define IWDT_OVERFLOW_PERIOD 0x7 + +#endif /* USE_IWDT_ON_STARTUP */ + +/* Includes ------------------------------------------------------------------*/ +#include + +/* Device Includes -----------------------------------------------------------*/ +#include "fm33lg0xx.h" + +/* Trim Values ---------------------------------------------------------------*/ +/* Validate Function */ +#define LDT_CHECK(_N_VALUE_, _T_VALUE_) \ + ((((_N_VALUE_ >> 16) & 0xFFFFU) == \ + (~(_N_VALUE_) & 0xFFFFU)) ? (_N_VALUE_) : (_T_VALUE_)) + +#define RCHF8M_LDT_TRIM (*(uint32_t *)0x1FFFFB40U) /* RC8M 常温校准值 */ +#define RCHF16M_LDT_TRIM (*(uint32_t *)0x1FFFFB3CU) /* RC16M 常温校准值 */ +#define RCHF24M_LDT_TRIM (*(uint32_t *)0x1FFFFB38U) /* RC24M 常温校准值 */ +#define RCHF32M_LDT_TRIM (*(uint32_t *)0x1FFFFB34U) /* RC32M 常温校准值 */ +#define RCLF_LDT_TRIM (*(uint32_t *)0x1FFFFB44U) /* RCLF 常温校准值 */ +#define RCLP_LDT_TRIM (*(uint32_t *)0x1FFFFB20U) /* RCLP 常温校准值 */ + + +#define RCHF8M_LDT_TRIM_BKP (*(uint16_t *)0x1FFFFBC2U) /* RC8M 常温校准值备份 */ +#define RCHF16M_LDT_TRIM_BKP (*(uint16_t *)0x1FFFFBC4U) /* RC16M 常温校准值备份 */ +#define RCHF24M_LDT_TRIM_BKP (*(uint16_t *)0x1FFFFBC6U) /* RC24M 常温校准值备份 */ +#define RCHF32M_LDT_TRIM_BKP (*(uint16_t *)0x1FFFFBC8U) /* RC32M 常温校准值备份 */ +#define RCLF_LDT_TRIM_BKP (*(uint16_t *)0x1FFFFBC0U) /* RCLF 常温校准值备份 */ +#define RCLP_LDT_TRIM_BKP (*(uint16_t *)0x1FFFFBCEU) /* RCLP 常温校准值备份 */ + + +#define RCHF8M_TRIM (LDT_CHECK(RCHF8M_LDT_TRIM, RCHF8M_LDT_TRIM_BKP) & 0xffU) +#define RCHF16M_TRIM (LDT_CHECK(RCHF16M_LDT_TRIM, RCHF16M_LDT_TRIM_BKP) & 0xffU) +#define RCHF24M_TRIM (LDT_CHECK(RCHF24M_LDT_TRIM, RCHF24M_LDT_TRIM_BKP) & 0xffU) +#define RCHF32M_TRIM (LDT_CHECK(RCHF32M_LDT_TRIM, RCHF32M_LDT_TRIM_BKP) & 0xffU) +#define RCLF_TRIM (LDT_CHECK(RCLF_LDT_TRIM, RCLF_LDT_TRIM_BKP) & 0xffU) +#define RCLP_TRIM (LDT_CHECK(RCLP_LDT_TRIM, RCLP_LDT_TRIM_BKP) & 0xffU) + + +#define ULPBG_LDT_TRIM (*(uint32_t *)0x1FFFFA98U) + +#define ULPBG_LDT_TRIM_BKP (*(uint16_t *)0x1FFFFBAAU) /* 备份值 */ + +#define ULPBG_TRIM (LDT_CHECK(ULPBG_LDT_TRIM, ULPBG_LDT_TRIM_BKP) & 0x1fU) + +/* Default Clock Frequency Values --------------------------------------------*/ + +#define XTHF_DEFAULT_VALUE ((uint32_t)8000000U) /*!< Default value of XTHF in Hz */ +#define XTLF_DEFAULT_VALUE ((uint32_t)32768U) /*!< Default value of XTLF in Hz */ + +/* Default system core clock value */ +#define HCLK_DEFAULT_VALUE ((uint32_t)8000000U) + +/* Exported Clock Frequency Variables --------------------------------------- */ +/* + - [SystemCoreClock] holds the value of CPU operation clock freqency, and is initialized + to HCLK_DEFAULT_VALUE; + - [XTLFClock] holds the value of external low-frequency oscillator(XTLF), + and is initialized to XTLF_DEFAULT_VALUE; + - [XTHFClock] holds the value of external high_frequency oscillator(XTHF), + and is initialized to XTHF_DEFAULT_VALUE; + + NOTE: If users are using these two external oscillators, they should modify the + value of XTLFClock and XTHFClock to the correct value, and call the SystemCoreClockUpdate() + to update the SystemCoreClock variable, otherwise those codes which rely on + the SystemCoreClock variable will fail to run. + */ +extern uint32_t XTLFClock; /*!< External Low-freq Osc Clock Frequency (XTLF) */ +extern uint32_t XTHFClock; /*!< External High-freq Osc Clock Frequency (XTHF) */ +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +/** + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit(void); + +/** + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +void SystemCoreClockUpdate(void); + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_FM33LG0XX_H */ diff --git a/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/ARM/startup_fm33lg0xx.s b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/ARM/startup_fm33lg0xx.s new file mode 100644 index 0000000..7cded38 --- /dev/null +++ b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/ARM/startup_fm33lg0xx.s @@ -0,0 +1,231 @@ +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000800 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000800 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: WWDT + DCD SVD_IRQHandler ; 1: SVD + DCD RTC_IRQHandler ; 2: RTC + DCD FLASH_IRQHandler ; 3: FLASH + DCD FDET_IRQHandler ; 4: LFDET + DCD ADC_IRQHandler ; 5: ADC + DCD DAC_IRQHandler ; 6: DAC + DCD SPI0_IRQHandler ; 7: SPI0 + DCD SPI1_IRQHandler ; 8: SPI1 + DCD SPI2_IRQHandler ; 9: SPI2 + DCD UART0_IRQHandler ; 10: UART0 + DCD UART1_IRQHandler ; 11: UART1 + DCD UART3_IRQHandler ; 12: UART3 + DCD UART4_IRQHandler ; 13: UART4 + DCD UART5_IRQHandler ; 14: UART5 + DCD 0 ; 15: + DCD LPUARTx_IRQHandler ; 16: LPUART + DCD I2C_IRQHandler ; 17: I2C + DCD CCL_IRQHandler ; 18: CCL + DCD AES_IRQHandler ; 19: AES + DCD LPTIM_IRQHandler ; 20: LPTIM + DCD DMA_IRQHandler ; 21: DMA + DCD WKUPx_IRQHandler ; 22: WKUP + DCD LUT_IRQHandler ; 23: LUT + DCD BSTIM_IRQHandler ; 24: BSTIM + DCD COMPx_IRQHandler ; 25: COMPx + DCD GPTIM0_1_IRQHandler ; 26: GPTIM0_1 + DCD GPTIM2_IRQHandler ; 27: GPTIM2 + DCD ATIM_IRQHandler ; 28: ATIM + DCD VREF_IRQHandler ; 29: VREF + DCD GPIO_IRQHandler ; 30: GPIO + DCD CAN_IRQHandler ; 31: CAN +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + + +; Reset Handler + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT CAN_IRQHandler [WEAK] + EXPORT GPIO_IRQHandler [WEAK] + EXPORT VREF_IRQHandler [WEAK] + EXPORT ATIM_IRQHandler [WEAK] + EXPORT GPTIM2_IRQHandler [WEAK] + EXPORT GPTIM0_1_IRQHandler [WEAK] + EXPORT COMPx_IRQHandler [WEAK] + EXPORT BSTIM_IRQHandler [WEAK] + EXPORT LUT_IRQHandler [WEAK] + EXPORT WKUPx_IRQHandler [WEAK] + EXPORT DMA_IRQHandler [WEAK] + EXPORT LPTIM_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT CCL_IRQHandler [WEAK] + EXPORT I2C_IRQHandler [WEAK] + EXPORT LPUARTx_IRQHandler [WEAK] + EXPORT UART5_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART1_IRQHandler [WEAK] + EXPORT UART0_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT DAC_IRQHandler [WEAK] + EXPORT ADC_IRQHandler [WEAK] + EXPORT FDET_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT SVD_IRQHandler [WEAK] + EXPORT WDT_IRQHandler [WEAK] + +CAN_IRQHandler +GPIO_IRQHandler +VREF_IRQHandler +ATIM_IRQHandler +GPTIM2_IRQHandler +GPTIM0_1_IRQHandler +COMPx_IRQHandler +BSTIM_IRQHandler +LUT_IRQHandler +WKUPx_IRQHandler +DMA_IRQHandler +LPTIM_IRQHandler +AES_IRQHandler +CCL_IRQHandler +I2C_IRQHandler +LPUARTx_IRQHandler +UART5_IRQHandler +UART4_IRQHandler +UART3_IRQHandler +UART1_IRQHandler +UART0_IRQHandler +SPI2_IRQHandler +SPI1_IRQHandler +SPI0_IRQHandler +DAC_IRQHandler +ADC_IRQHandler +FDET_IRQHandler +FLASH_IRQHandler +RTC_IRQHandler +SVD_IRQHandler +WDT_IRQHandler + + B . + ENDP + + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + + END + + *****END OF FILE***** \ No newline at end of file diff --git a/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/gcc/linker/fm33lg02x_flash.ld b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/gcc/linker/fm33lg02x_flash.ld new file mode 100644 index 0000000..e65baef --- /dev/null +++ b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/gcc/linker/fm33lg02x_flash.ld @@ -0,0 +1,139 @@ +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20008000; /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x400; /* required amount of heap */ +_Stack_Size = 0x400; /* amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K +FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + /* User_heap_stack section, used to check that there is enough RAM left */ + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + + /* system stack */ + PROVIDE (_stack_base = _estack - _Stack_Size); /* _estack is top of stack*/ + ASSERT ((_stack_base > end), "Error: No room left for the stack") + /* _estack is top of stack*/ + + /* left ram for heap */ + PROVIDE (heap_start = _end); + PROVIDE (heap_end = _stack_base); + PROVIDE (heap_len = heap_end - heap_start); + ASSERT ((heap_len > _Min_Heap_Size), "Error: No room left for the heap") + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/gcc/linker/fm33lg04x_flash.ld b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/gcc/linker/fm33lg04x_flash.ld new file mode 100644 index 0000000..49f3d0f --- /dev/null +++ b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/gcc/linker/fm33lg04x_flash.ld @@ -0,0 +1,131 @@ +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20008000; /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x400; /* required amount of heap */ +_Stack_Size = 0x400; /* amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K +FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + + /* system stack */ + PROVIDE (_stack_base = _estack - _Stack_Size); /* _estack is top of stack*/ + ASSERT ((_stack_base > end), "Error: No room left for the stack") + /* _estack is top of stack*/ + + /* left ram for heap */ + PROVIDE (heap_start = _end); + PROVIDE (heap_end = _stack_base); + PROVIDE (heap_len = heap_end - heap_start); + ASSERT ((heap_len > _Min_Heap_Size), "Error: No room left for the heap") + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/gcc/startup_fm33lg0xx.s b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/gcc/startup_fm33lg0xx.s new file mode 100644 index 0000000..e1c4d0d --- /dev/null +++ b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/gcc/startup_fm33lg0xx.s @@ -0,0 +1,250 @@ + .syntax unified + .cpu cortex-m0plus + .fpu softvfp + .thumb + +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr r0, =_estack + mov sp, r0 /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + movs r1, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r3, =_sidata + ldr r3, [r3, r1] + str r3, [r0, r1] + adds r1, r1, #4 + +LoopCopyDataInit: + ldr r0, =_sdata + ldr r3, =_edata + adds r2, r0, r1 + cmp r2, r3 + bcc CopyDataInit + ldr r2, =_sbss + b LoopFillZerobss +/* Zero fill the bss segment. */ +FillZerobss: + movs r3, #0 + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + ldr r3, = _ebss + cmp r2, r3 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ +// bl __libc_init_array +/* Call the application's entry point.*/ + bl main + +LoopForever: + b LoopForever + + .size Reset_Handler, .-Reset_Handler + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler + +/****************************************************************************** +* +* The minimal vector table for a Cortex M0. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .global g_pfnVectors +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word 0 + .word 0 + .word PendSV_Handler + .word SysTick_Handler + /* External Interrupts */ + .word WWDT_IRQHandler /* 0: WWDT */ + .word SVD_IRQHandler /* 1: SVD */ + .word RTC_IRQHandler /* 2: RTC */ + .word FLASH_IRQHandler /* 3: FLASH */ + .word FDET_IRQHandler /* 4: FDET */ + .word ADC_IRQHandler /* 5: ADC */ + .word DAC_IRQHandler /* 6: DAC */ + .word SPI0_IRQHandler /* 7: SPI0 */ + .word SPI1_IRQHandler /* 8: SPI1 */ + .word SPI2_IRQHandler /* 9: SPI2 */ + .word UART0_IRQHandler /* 10: UART0 */ + .word UART1_IRQHandler /* 11: UART1 */ + .word UART3_IRQHandler /* 12: UART3 */ + .word UART4_IRQHandler /* 13: UART4 */ + .word UART5_IRQHandler /* 14: UART5 */ + .word U7816_IRQHandler /* 15: U7816 */ + .word LPUARTx_IRQHandler /* 16: LPUARTx */ + .word I2C_IRQHandler /* 17: I2C */ + .word CCL_IRQHandler /* 18: CCL */ + .word AES_IRQHandler /* 19: AES */ + .word LPTIM_IRQHandler /* 20: LPTIM */ + .word DMA_IRQHandler /* 21: DMA */ + .word WKUPx_IRQHandler /* 22: WKUP */ + .word LUT_IRQHandler /* 23: LUT */ + .word BSTIM_IRQHandler /* 24: BSTIM */ + .word COMPx_IRQHandler /* 25: COMPx */ + .word GPTIM0_1_IRQHandler /* 26: GPTIM0(1) */ + .word GPTIM2_IRQHandler /* 27: GPTIM2 */ + .word ATIM_IRQHandler /* 28: ATIM */ + .word VREF_IRQHandler /* 39: VREF */ + .word GPIO_IRQHandler /* 30: GPIO */ + .word CAN_IRQHandler /* 31: CAN */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDT_IRQHandler + .thumb_set WWDT_IRQHandler,Default_Handler + + .weak SVD_IRQHandler + .thumb_set SVD_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak FDET_IRQHandler + .thumb_set FDET_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak DAC_IRQHandler + .thumb_set DAC_IRQHandler,Default_Handler + + .weak SPI0_IRQHandler + .thumb_set SPI0_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak UART0_IRQHandler + .thumb_set UART0_IRQHandler,Default_Handler + + .weak UART1_IRQHandler + .thumb_set UART1_IRQHandler,Default_Handler + + .weak UART3_IRQHandler + .thumb_set UART3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak U7816_IRQHandler + .thumb_set U7816_IRQHandler,Default_Handler + + .weak LPUARTx_IRQHandler + .thumb_set LPUARTx_IRQHandler,Default_Handler + + .weak I2C_IRQHandler + .thumb_set I2C_IRQHandler,Default_Handler + + .weak CCL_IRQHandler + .thumb_set CCL_IRQHandler,Default_Handler + + .weak AES_IRQHandler + .thumb_set AES_IRQHandler,Default_Handler + + .weak LPTIM_IRQHandler + .thumb_set LPTIM_IRQHandler,Default_Handler + + .weak DMA_IRQHandler + .thumb_set DMA_IRQHandler,Default_Handler + + .weak WKUPx_IRQHandler + .thumb_set WKUPx_IRQHandler,Default_Handler + + .weak LUT_IRQHandler + .thumb_set LUT_IRQHandler,Default_Handler + + .weak BSTIM_IRQHandler + .thumb_set BSTIM_IRQHandler,Default_Handler + + .weak COMPx_IRQHandler + .thumb_set COMPx_IRQHandler,Default_Handler + + .weak GPTIM0_1_IRQHandler + .thumb_set GPTIM0_1_IRQHandler,Default_Handler + + .weak GPTIM2_IRQHandler + .thumb_set GPTIM2_IRQHandler,Default_Handler + + .weak ATIM_IRQHandler + .thumb_set ATIM_IRQHandler,Default_Handler + + .weak VREF_IRQHandler + .thumb_set VREF_IRQHandler,Default_Handler + + .weak GPIO_IRQHandler + .thumb_set GPIO_IRQHandler,Default_Handler + + .weak CAN_IRQHandler + .thumb_set CAN_IRQHandler,Default_Handler + diff --git a/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/iar/startup_fm33lg0xx.s b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/iar/startup_fm33lg0xx.s new file mode 100644 index 0000000..4004ec6 --- /dev/null +++ b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/Templates/iar/startup_fm33lg0xx.s @@ -0,0 +1,299 @@ + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + PUBLIC __vector_table + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0: WWDT + DCD SVD_IRQHandler ; 1: SVD + DCD RTC_IRQHandler ; 2: RTC + DCD FLASH_IRQHandler ; 3: FLASH + DCD FDET_IRQHandler ; 4: LFDET + DCD ADC_IRQHandler ; 5: ADC + DCD DAC_IRQHandler ; 6: DAC + DCD SPI0_IRQHandler ; 7: SPI0 + DCD SPI1_IRQHandler ; 8: SPI1 + DCD SPI2_IRQHandler ; 9: SPI2 + DCD UART0_IRQHandler ; 10: UART0 + DCD UART1_IRQHandler ; 11: UART1 + DCD UART3_IRQHandler ; 12: UART3 + DCD UART4_IRQHandler ; 13: UART4 + DCD UART5_IRQHandler ; 14: UART5 + DCD U7816_IRQHandler ; 15: U7816 + DCD LPUARTx_IRQHandler ; 16: LPUART + DCD I2C_IRQHandler ; 17: I2C + DCD CCL_IRQHandler ; 18: CCL + DCD AES_IRQHandler ; 19: AES + DCD LPTIM_IRQHandler ; 20: LPTIM + DCD DMA_IRQHandler ; 21: DMA + DCD WKUPx_IRQHandler ; 22: WKUP + DCD LUT_IRQHandler ; 23: LUT + DCD BSTIM_IRQHandler ; 24: BSTIM + DCD COMPx_IRQHandler ; 25: COMPx + DCD GPTIM0_1_IRQHandler ; 26: GPTIM0_1 + DCD GPTIM2_IRQHandler ; 27: GPTIM2 + DCD ATIM_IRQHandler ; 28: ATIM + DCD VREF_IRQHandler ; 29: VREF + DCD GPIO_IRQHandler ; 30: GPIO + DCD CAN_IRQHandler ; 31: CAN +__Vectors_End + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:NOROOT:REORDER(2) +Reset_Handler + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +NMI_Handler + B NMI_Handler + + + PUBWEAK HardFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +HardFault_Handler + B HardFault_Handler + + + PUBWEAK SVC_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +SVC_Handler + B SVC_Handler + + + PUBWEAK PendSV_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +PendSV_Handler + B PendSV_Handler + + + PUBWEAK SysTick_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +SysTick_Handler + B SysTick_Handler + + + PUBWEAK WDT_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +WDT_IRQHandler + B WDT_IRQHandler + + + PUBWEAK SVD_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SVD_IRQHandler + B SVD_IRQHandler + + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + + PUBWEAK FLASH_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +FLASH_IRQHandler + B FLASH_IRQHandler + + + PUBWEAK FDET_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +FDET_IRQHandler + B FDET_IRQHandler + + + PUBWEAK ADC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +ADC_IRQHandler + B ADC_IRQHandler + + PUBWEAK DAC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DAC_IRQHandler + B DAC_IRQHandler + + + PUBWEAK SPI0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI0_IRQHandler + B SPI0_IRQHandler + + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + + PUBWEAK UART0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART0_IRQHandler + B UART0_IRQHandler + + + PUBWEAK UART1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART1_IRQHandler + B UART1_IRQHandler + + + PUBWEAK UART3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART3_IRQHandler + B UART3_IRQHandler + + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART4_IRQHandler + B UART4_IRQHandler + + + PUBWEAK UART5_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART5_IRQHandler + B UART5_IRQHandler + + + PUBWEAK U7816_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +U7816_IRQHandler + B U7816_IRQHandler + + + PUBWEAK LPUARTx_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +LPUARTx_IRQHandler + B LPUARTx_IRQHandler + + + PUBWEAK I2C_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C_IRQHandler + B I2C_IRQHandler + + PUBWEAK CCL_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CCL_IRQHandler + B CCL_IRQHandler + + + PUBWEAK AES_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +AES_IRQHandler + B AES_IRQHandler + + + PUBWEAK LPTIM_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +LPTIM_IRQHandler + B LPTIM_IRQHandler + + + PUBWEAK DMA_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA_IRQHandler + B DMA_IRQHandler + + + PUBWEAK WKUPx_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +WKUPx_IRQHandler + B WKUPx_IRQHandler + + PUBWEAK LUT_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +LUT_IRQHandler + B LUT_IRQHandler + + + PUBWEAK BSTIM_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +BSTIM_IRQHandler + B BSTIM_IRQHandler + + + PUBWEAK COMPx_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +COMPx_IRQHandler + B COMPx_IRQHandler + + + PUBWEAK GPTIM0_1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +GPTIM0_1_IRQHandler + B GPTIM0_1_IRQHandler + + + PUBWEAK GPTIM2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +GPTIM2_IRQHandler + B GPTIM2_IRQHandler + + + PUBWEAK ATIM_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +ATIM_IRQHandler + B ATIM_IRQHandler + + + PUBWEAK VREF_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +VREF_IRQHandler + B VREF_IRQHandler + + + PUBWEAK GPIO_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +GPIO_IRQHandler + B GPIO_IRQHandler + + + PUBWEAK CAN_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN_IRQHandler + B CAN_IRQHandler + END \ No newline at end of file diff --git a/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/system_fm33lg0xx.c b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/system_fm33lg0xx.c new file mode 100644 index 0000000..1c93a98 --- /dev/null +++ b/LIN Slave/Drivers/CMSIS/Device/FM/FM33xx/Source/system_fm33lg0xx.c @@ -0,0 +1,300 @@ +/**************************************************************************//** + * @file system_fm33lg0xx.c + * @brief CMSIS Cortex-M0 Device Peripheral Access Layer Source File for + * Device FM33LG0XX + * @version V2.0.0 + * @date 15. Mar 2021 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2012 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + +#include "system_fm33lg0xx.h" + +/* Clock Variable definitions ------------------------------------------------*/ +uint32_t XTLFClock = XTLF_DEFAULT_VALUE; /*!< External Low-freq Osc Clock Frequency (XTLF) */ +uint32_t XTHFClock = XTHF_DEFAULT_VALUE; /*!< External High-freq Osc Clock Frequency (XTHF) */ +uint32_t SystemCoreClock = HCLK_DEFAULT_VALUE; /*!< System Clock Frequency (Core Clock) */ + +/* Clock functions -----------------------------------------------------------*/ +/** + * @brief Retrieve the PLL clock frequency + * + * @retval PLL clock frequency + */ +static uint32_t SystemPLLClockUpdate(void) +{ + uint32_t clock = 0; + + /* Acquire PLL clock source */ + switch ((CMU->PLLCR >> 1) & 0x1) + { + case 0: + switch ((CMU->RCHFCR >> 16) & 0xFU) + { + case 1: /* 16MHz */ + clock = 16000000; + break; + + case 2: /* 24MHz */ + clock = 24000000; + break; + + case 3: /* 32MHz */ + clock = 32000000; + break; + + case 0: /* 8MHz */ + default: + clock = 8000000; + break; + } + break; + + case 1: + clock = XTHFClock; + break; + } + + /* Acquire PLL prescaler */ + switch ((CMU->PLLCR >> 0x4) & 0x7) + { + case 0: /* input divided by 1 */ + clock /= 1; + break; + + case 1: /* input divided by 2 */ + clock /= 2; + break; + + case 2: /* input divided by 4 */ + clock /= 4; + break; + + case 3: /* input divided by 8 */ + clock /= 8; + break; + + case 4: /* input divided by 12 */ + clock /= 12; + break; + + case 5: /* input divided by 16 */ + clock /= 16; + break; + + case 6: /* input divided by 24 */ + clock /= 24; + break; + + case 7: /* input divided by 32 */ + clock /= 32; + break; + } + + /* Acquire PLL multiplier and calculate PLL frequency */ + clock = clock * (((CMU->PLLCR >> 16) & 0x7F) + 1); + + /* Acquire PLL output channel(PLLx1 or PLLx2) */ + if ((CMU->PLLCR >> 3) & 0x1) + { + clock *= 2; + } + + return clock; +} + +/** + * @brief Update the core clock frequency variable: SystemCoreClock + * + */ +void SystemCoreClockUpdate(void) +{ + switch ((CMU->SYSCLKCR >> 0) & 0x7) + { + case 1: /* XTHF */ + SystemCoreClock = XTHFClock; + break; + + case 2: /* PLL */ + SystemCoreClock = SystemPLLClockUpdate(); + break; + + case 4: /* RCLF */ + switch ((CMU->RCLFCR >> 16) & 0x3) + { + case 0: /* output divided by 1 */ + SystemCoreClock = 614400; + break; + + case 1: /* output divided by 4 */ + SystemCoreClock = 153600; + break; + + case 2: /* output divided by 8 */ + SystemCoreClock = 76800; + break; + + case 3: /* output divided by 16 */ + SystemCoreClock = 38400; + break; + } + break; + + case 5: /* XTLF */ + SystemCoreClock = XTLFClock; + break; + + case 6: /* RCLP */ + SystemCoreClock = 32000; + break; + + default: + switch ((CMU->RCHFCR >> 16) & 0xf) + { + case 1: /* 16MHz */ + SystemCoreClock = 16000000; + break; + + case 2: /* 24MHz */ + SystemCoreClock = 24000000; + break; + + case 3: /* 32MHz */ + SystemCoreClock = 32000000; + break; + + case 0: /* 8MHz */ + default: + SystemCoreClock = 8000000; + break; + } + break; + } + /* AHB Prescaler */ + switch((CMU->SYSCLKCR >> 8) & 0x7) + { + case 4: /* divide by 2 */ + SystemCoreClock /= 2; + break; + + case 5: /* divide by 4 */ + SystemCoreClock /= 4; + break; + + case 6: /* divide by 8 */ + SystemCoreClock /= 8; + break; + + case 7: /* divide by 16 */ + SystemCoreClock /= 16; + break; + + default: /* no division */ + break; + } +} + +/** + * @brief Setup the microcontroller system. + * Initialize the System. + */ +void SystemInit(void) +{ + + #if defined(USE_IWDT_ON_STARTUP) + CMU->PCLKCR1 |= 0x20U; /* Enable IWDT Operation Clock */ + IWDT->CR = IWDT_OVERFLOW_PERIOD; /* Configure IWDT overflow period */ + IWDT->SERV = 0x12345A5AU; /* Enable IWDT */ + #endif + + /* Enable VREF Operation Clock */ + CMU->PCLKCR1 |= 0x1U << 12; + + /* Enable PAD Operation Clock */ + CMU->PCLKCR1 |= 0x1U << 7; + + #ifdef USE_LSCLK_AUTO_SWITCH + + /* Enable LSCLK auto switch */ + CMU->SYSCLKCR |= 0x8000000U; + CMU->LSCLKSEL = 0x55U; + + #else + + /* Disable LSCLK auto switch */ + CMU->SYSCLKCR &= 0x7FFFFFFU; + CMU->LSCLKSEL = 0x55U; + + #endif /* USE_LSCLK_AUTO_SWITCH */ + + /* Keep timers running and disable IWDT && WWDT under debug mode */ + DBG->CR = 0x3U; + + #ifdef USE_DEBUG_UNDER_SLEEP + /* Keep debug connnection under sleep mode */ + DBG->CR |= 0x1U << 16; + #endif + + /* Load power trim value */ + PMU->ULPB_TR = ULPBG_TRIM; + + /* Load default clock trim value */ + CMU->RCHFTR = RCHF8M_TRIM; + CMU->RCLFTR = RCLF_TRIM; + CMU->RCLPTR = RCLP_TRIM; + + /* Enable SWD port pull up */ + GPIOD->PUEN |= 0x3U << 7; + + /* + If BOR is disabled, power down will be monitored by PDR. This means VDD can + be below the minimum operating voltage(1.65V) to V_PDR threshold without + power down reset. To solve this, user should use SVD to monitor VDD voltage. + When the VDD voltage drop below 1.65V, program can enter sleep. + */ + + /* PDR Config enable 1.5v */ + RMU->PDRCR = 0x5; + + /* Disable BOR power down */ + RMU->BORCR = 0x01; + + /* Update System Core Clock */ + SystemCoreClockUpdate(); + + #if defined(USE_IWDT_ON_STARTUP) + IWDT->SERV = 0x12345A5AU; /* Feed IWDT */ + #endif +} + + + + + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33_assert.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33_assert.h new file mode 100644 index 0000000..022d8b0 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33_assert.h @@ -0,0 +1,40 @@ +/** + **************************************************************************************************** + * @file fm33_assert.h + * @author FMSH Application Team + * @brief Assert function define + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +#ifndef __FM33_ASSERT_H +#define __FM33_ASSERT_H + +#ifdef __cplusplus + extern "C" { +#endif + +#ifdef USE_FULL_ASSERT +#define assert_param(expr) do{if((expr) == 0)for(;;);}while(0) +#else +#define assert_param(expr) ((void)0U) +#endif + +#ifdef __cplusplus +} +#endif + + +#endif + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl.h new file mode 100644 index 0000000..a8feaee --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl.h @@ -0,0 +1,117 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl.h + * @author FMSH Application Team + * @brief Header file of FL Driver Library + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + +/* Define to prevent recursive inclusion -------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_H +#define __FM33LG0XX_FL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_conf.h" +#include "fm33lg0xx_fl_def.h" + +/* Macros ---------------------------------------------------------------------------------------------*/ +/** @defgroup FL_Private_Macros FL Driver Library Private Macros + * @{ + */ + +/** + * @brief FM33LG0xx FL Driver Library version number + */ +#define __FM33LG0xx_FL_VERSION_MAIN (0x02) /*!< [31:24] main version */ +#define __FM33LG0xx_FL_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ +#define __FM33LG0xx_FL_VERSION_SUB2 (0x01) /*!< [15:0] sub2 version */ +#define __FM33LG0xx_FL_VERSION ((__FM33LG0xx_FL_VERSION_MAIN << 24)\ + |(__FM33LG0xx_FL_VERSION_SUB1 << 16)\ + |(__FM33LG0xx_FL_VERSION_SUB2)) + +/** + * @brief Macros used by delay support functions + */ +#define FL_DELAY_US (SystemCoreClock/1000000) +#define FL_DELAY_MS (SystemCoreClock/1000) + +/** + * @} + */ + + /* Struct Defines -------------------------------------------------------------------------------------*/ +/** @defgroup FL_ET_NVIC FL Driver Library NVIC Init Sturcture Defines + * @{ + */ + +typedef struct +{ + /** 中断抢占优先级 */ + uint32_t preemptPriority; + +} FL_NVIC_ConfigTypeDef; + +/** + * @} + */ + +/* Exported Functions ---------------------------------------------------------------------------------*/ +/** @defgroup FL_EF_DELAY Exported FL Driver Library Delay Support Functions + * @{ + */ + +void FL_DelayInit(void); +void FL_DelayUs(uint32_t count); +void FL_DelayMs(uint32_t count); +void FL_DelayUsStart(uint32_t count); +void FL_DelayMsStart(uint32_t count); +bool FL_DelayEnd(void); + +/** + * @} + */ + +/** @defgroup FL_EF_INIT FL Driver Library Exported Init Functions + * @{ + */ + +void FL_Init(void); + +/** + * @} + */ + +/** @defgroup FL_EF_NVIC FL Driver Library Exported NVIC Configuration Functions + * @{ + */ + +void FL_NVIC_Init(FL_NVIC_ConfigTypeDef *configStruct, IRQn_Type irq); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_H */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_adc.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_adc.h new file mode 100644 index 0000000..e6bb8e8 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_adc.h @@ -0,0 +1,2080 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_adc.h + * @author FMSH Application Team + * @brief Head file of ADC FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_ADC_H +#define __FM33LG0XX_FL_ADC_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + + /** @defgroup ADC ADC + * @brief ADC FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup ADC_FL_ES_INIT ADC Exported Init structures + * @{ + */ +#define ADC_VREF_SOURCE (*((uint16_t *)(0x1FFFFB08))) /* vref122定标值 */ + +#define ADC_VREF_BKP (*((uint16_t *)(0x1FFFFBF6))) /* vref122备份值 */ + +#define ADC_VREF ((((ADC_VREF_SOURCE & 0xffffU)>0x0654) && ((ADC_VREF_SOURCE & 0xffffU)<0x0690)) ? ADC_VREF_SOURCE : ADC_VREF_BKP) + + +#define ADC_TS_SOURCE (*((uint16_t *)(0x1FFFFB12))) /* PTAT定标值 */ + +#define ADC_TS_BKP (*((uint16_t *)(0x1FFFFBE2))) /* PTAT备份值 */ + +#define ADC_TS ((((ADC_TS_SOURCE & 0xffffU)>0x03E8) && ((ADC_TS_SOURCE & 0xffffU)<0x0474)) ? ADC_TS_SOURCE : ADC_TS_BKP) + +/** + * @brief FL ADC Init Sturcture definition + */ +typedef struct +{ + /** ADC工作时钟源选择 */ + uint32_t clockSource; + /** ADCCLK预分频配置 */ + uint32_t clockPrescaler; + /** ADC基准源选择 */ + uint32_t referenceSource; + /** ADC数据位选择 */ + uint32_t bitWidth; + +} FL_ADC_CommonInitTypeDef; + +typedef struct +{ + /** 连续转换模式配置 */ + uint32_t conversionMode; + /** 单次自动转换模式配置 */ + uint32_t autoMode; + /** 等待模式配置 */ + FL_FunState waitMode; + /** 覆盖模式配置 */ + FL_FunState overrunMode; + /** 通道扫描顺序配置 */ + uint32_t scanDirection; + /** 触发信号使能配置 */ + uint32_t externalTrigConv; + /** 触发源选择 */ + uint32_t triggerSource; + /** 快速通道采样时间配置 */ + uint32_t fastChannelTime; + /** 慢速通道采样时间配置 */ + uint32_t lowChannelTime; + /** 过采样使能配置 */ + FL_FunState oversamplingMode; + /** 过采样率配置 */ + uint32_t overSampingMultiplier; + /** 过采样移位配置 */ + uint32_t oversamplingShift; + +} FL_ADC_InitTypeDef; +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup ADC_FL_Exported_Constants ADC Exported Constants + * @{ + */ + +#define ADC_ISR_EOC_Pos (0U) +#define ADC_ISR_EOC_Msk (0x1U << ADC_ISR_EOC_Pos) +#define ADC_ISR_EOC ADC_ISR_EOC_Msk + +#define ADC_ISR_EOS_Pos (1U) +#define ADC_ISR_EOS_Msk (0x1U << ADC_ISR_EOS_Pos) +#define ADC_ISR_EOS ADC_ISR_EOS_Msk + +#define ADC_ISR_OVR_Pos (2U) +#define ADC_ISR_OVR_Msk (0x1U << ADC_ISR_OVR_Pos) +#define ADC_ISR_OVR ADC_ISR_OVR_Msk + +#define ADC_ISR_BUSY_Pos (3U) +#define ADC_ISR_BUSY_Msk (0x1U << ADC_ISR_BUSY_Pos) +#define ADC_ISR_BUSY ADC_ISR_BUSY_Msk + +#define ADC_ISR_EOCAL_Pos (4U) +#define ADC_ISR_EOCAL_Msk (0x1U << ADC_ISR_EOCAL_Pos) +#define ADC_ISR_EOCAL ADC_ISR_EOCAL_Msk + +#define ADC_ISR_AWD_UL_Pos (5U) +#define ADC_ISR_AWD_UL_Msk (0x1U << ADC_ISR_AWD_UL_Pos) +#define ADC_ISR_AWD_UL ADC_ISR_AWD_UL_Msk + +#define ADC_ISR_AWD_AH_Pos (6U) +#define ADC_ISR_AWD_AH_Msk (0x1U << ADC_ISR_AWD_AH_Pos) +#define ADC_ISR_AWD_AH ADC_ISR_AWD_AH_Msk + +#define ADC_IER_EOCIE_Pos (0U) +#define ADC_IER_EOCIE_Msk (0x1U << ADC_IER_EOCIE_Pos) +#define ADC_IER_EOCIE ADC_IER_EOCIE_Msk + +#define ADC_IER_EOSIE_Pos (1U) +#define ADC_IER_EOSIE_Msk (0x1U << ADC_IER_EOSIE_Pos) +#define ADC_IER_EOSIE ADC_IER_EOSIE_Msk + +#define ADC_IER_OVRIE_Pos (2U) +#define ADC_IER_OVRIE_Msk (0x1U << ADC_IER_OVRIE_Pos) +#define ADC_IER_OVRIE ADC_IER_OVRIE_Msk + +#define ADC_IER_EOCALIE_Pos (4U) +#define ADC_IER_EOCALIE_Msk (0x1U << ADC_IER_EOCALIE_Pos) +#define ADC_IER_EOCALIE ADC_IER_EOCALIE_Msk + +#define ADC_IER_AWD_ULIE_Pos (5U) +#define ADC_IER_AWD_ULIE_Msk (0x1U << ADC_IER_AWD_ULIE_Pos) +#define ADC_IER_AWD_ULIE ADC_IER_AWD_ULIE_Msk + +#define ADC_IER_AWD_AHIE_Pos (6U) +#define ADC_IER_AWD_AHIE_Msk (0x1U << ADC_IER_AWD_AHIE_Pos) +#define ADC_IER_AWD_AHIE ADC_IER_AWD_AHIE_Msk + +#define ADC_CR1_ADEN_Pos (0U) +#define ADC_CR1_ADEN_Msk (0x1U << ADC_CR1_ADEN_Pos) +#define ADC_CR1_ADEN ADC_CR1_ADEN_Msk + +#define ADC_CR1_SWTRIG_Pos (1U) +#define ADC_CR1_SWTRIG_Msk (0x1U << ADC_CR1_SWTRIG_Pos) +#define ADC_CR1_SWTRIG ADC_CR1_SWTRIG_Msk + +#define ADC_CR2_TRGCFG_Pos (0U) +#define ADC_CR2_TRGCFG_Msk (0x3U << ADC_CR2_TRGCFG_Pos) +#define ADC_CR2_TRGCFG ADC_CR2_TRGCFG_Msk + +#define ADC_CALR_CALEN_Pos (0U) +#define ADC_CALR_CALEN_Msk (0x1U << ADC_CALR_CALEN_Pos) +#define ADC_CALR_CALEN ADC_CALR_CALEN_Msk + +#define ADC_CFGR1_PEFSEL_Pos (0U) +#define ADC_CFGR1_PEFSEL_Msk (0x3U << ADC_CFGR1_PEFSEL_Pos) +#define ADC_CFGR1_PEFSEL ADC_CFGR1_PEFSEL_Msk + +#define ADC_CFGR1_CLKSEL_Pos (2U) +#define ADC_CFGR1_CLKSEL_Msk (0x1U << ADC_CFGR1_CLKSEL_Pos) +#define ADC_CFGR1_CLKSEL ADC_CFGR1_CLKSEL_Msk + +#define ADC_CFGR1_BITSEL_Pos (3U) +#define ADC_CFGR1_BITSEL_Msk (0x3U << ADC_CFGR1_BITSEL_Pos) +#define ADC_CFGR1_BITSEL ADC_CFGR1_BITSEL_Msk + +#define ADC_CFGR1_EXSOC_Pos (5U) +#define ADC_CFGR1_EXSOC_Msk (0x1U << ADC_CFGR1_EXSOC_Pos) +#define ADC_CFGR1_EXSOC ADC_CFGR1_EXSOC_Msk + +#define ADC_CFGR1_APBCLK_PSC_Pos (6U) +#define ADC_CFGR1_APBCLK_PSC_Msk (0x3U << ADC_CFGR1_APBCLK_PSC_Pos) +#define ADC_CFGR1_APBCLK_PSC ADC_CFGR1_APBCLK_PSC_Msk + +#define ADC_CFGR1_BUFEN_Pos (8U) +#define ADC_CFGR1_BUFEN_Msk (0x1U << ADC_CFGR1_BUFEN_Pos) +#define ADC_CFGR1_BUFEN ADC_CFGR1_BUFEN_Msk + +#define ADC_CFGR1_BUFMOD_Pos (9U) +#define ADC_CFGR1_BUFMOD_Msk (0x1U << ADC_CFGR1_BUFMOD_Pos) +#define ADC_CFGR1_BUFMOD ADC_CFGR1_BUFMOD_Msk + +#define ADC_CFGR1_BUFLPF_Pos (10U) +#define ADC_CFGR1_BUFLPF_Msk (0x1U << ADC_CFGR1_BUFLPF_Pos) +#define ADC_CFGR1_BUFLPF ADC_CFGR1_BUFLPF_Msk + +#define ADC_CFGR1_BUFCHP_EN_Pos (11U) +#define ADC_CFGR1_BUFCHP_EN_Msk (0x1U << ADC_CFGR1_BUFCHP_EN_Pos) +#define ADC_CFGR1_BUFCHP_EN ADC_CFGR1_BUFCHP_EN_Msk + +#define ADC_CFGR2_DMAEN_Pos (0U) +#define ADC_CFGR2_DMAEN_Msk (0x1U << ADC_CFGR2_DMAEN_Pos) +#define ADC_CFGR2_DMAEN ADC_CFGR2_DMAEN_Msk + +#define ADC_CFGR2_SCANDIR_Pos (2U) +#define ADC_CFGR2_SCANDIR_Msk (0x1U << ADC_CFGR2_SCANDIR_Pos) +#define ADC_CFGR2_SCANDIR ADC_CFGR2_SCANDIR_Msk + +#define ADC_CFGR2_EXTS_Pos (4U) +#define ADC_CFGR2_EXTS_Msk (0xfU << ADC_CFGR2_EXTS_Pos) +#define ADC_CFGR2_EXTS ADC_CFGR2_EXTS_Msk + +#define ADC_CFGR2_OVRM_Pos (8U) +#define ADC_CFGR2_OVRM_Msk (0x1U << ADC_CFGR2_OVRM_Pos) +#define ADC_CFGR2_OVRM ADC_CFGR2_OVRM_Msk + +#define ADC_CFGR2_CONT_Pos (9U) +#define ADC_CFGR2_CONT_Msk (0x1U << ADC_CFGR2_CONT_Pos) +#define ADC_CFGR2_CONT ADC_CFGR2_CONT_Msk + +#define ADC_CFGR2_WAIT_Pos (10U) +#define ADC_CFGR2_WAIT_Msk (0x1U << ADC_CFGR2_WAIT_Pos) +#define ADC_CFGR2_WAIT ADC_CFGR2_WAIT_Msk + +#define ADC_CFGR2_SEMI_Pos (11U) +#define ADC_CFGR2_SEMI_Msk (0x1U << ADC_CFGR2_SEMI_Pos) +#define ADC_CFGR2_SEMI ADC_CFGR2_SEMI_Msk + +#define ADC_CFGR2_IOTRFEN_Pos (14U) +#define ADC_CFGR2_IOTRFEN_Msk (0x1U << ADC_CFGR2_IOTRFEN_Pos) +#define ADC_CFGR2_IOTRFEN ADC_CFGR2_IOTRFEN_Msk + +#define ADC_CFGR2_OVSEN_Pos (16U) +#define ADC_CFGR2_OVSEN_Msk (0x1U << ADC_CFGR2_OVSEN_Pos) +#define ADC_CFGR2_OVSEN ADC_CFGR2_OVSEN_Msk + +#define ADC_CFGR2_OVSR_Pos (17U) +#define ADC_CFGR2_OVSR_Msk (0x7U << ADC_CFGR2_OVSR_Pos) +#define ADC_CFGR2_OVSR ADC_CFGR2_OVSR_Msk + +#define ADC_CFGR2_OVSS_Pos (20U) +#define ADC_CFGR2_OVSS_Msk (0xfU << ADC_CFGR2_OVSS_Pos) +#define ADC_CFGR2_OVSS ADC_CFGR2_OVSS_Msk + +#define ADC_CFGR2_AWDEN_Pos (24U) +#define ADC_CFGR2_AWDEN_Msk (0x1U << ADC_CFGR2_AWDEN_Pos) +#define ADC_CFGR2_AWDEN ADC_CFGR2_AWDEN_Msk + +#define ADC_CFGR2_AWDSC_Pos (25U) +#define ADC_CFGR2_AWDSC_Msk (0x1U << ADC_CFGR2_AWDSC_Pos) +#define ADC_CFGR2_AWDSC ADC_CFGR2_AWDSC_Msk + +#define ADC_CFGR2_AWDCH_Pos (26U) +#define ADC_CFGR2_AWDCH_Msk (0x1fU << ADC_CFGR2_AWDCH_Pos) +#define ADC_CFGR2_AWDCH ADC_CFGR2_AWDCH_Msk + +#define ADC_SMTR_SMTS1_Pos (0U) +#define ADC_SMTR_SMTS1_Msk (0xfU << ADC_SMTR_SMTS1_Pos) +#define ADC_SMTR_SMTS1 ADC_SMTR_SMTS1_Msk + +#define ADC_SMTR_SMTS2_Pos (4U) +#define ADC_SMTR_SMTS2_Msk (0xfU << ADC_SMTR_SMTS2_Pos) +#define ADC_SMTR_SMTS2 ADC_SMTR_SMTS2_Msk + +#define ADC_DR_DATA_Pos (0U) +#define ADC_DR_DATA_Msk (0xffffU << ADC_DR_DATA_Pos) +#define ADC_DR_DATA ADC_DR_DATA_Msk + +#define ADC_HLTR_AWD_LT_Pos (0U) +#define ADC_HLTR_AWD_LT_Msk (0xffffU << ADC_HLTR_AWD_LT_Pos) +#define ADC_HLTR_AWD_LT ADC_HLTR_AWD_LT_Msk + +#define ADC_HLTR_AWD_HT_Pos (16U) +#define ADC_HLTR_AWD_HT_Msk (0xffffU << ADC_HLTR_AWD_HT_Pos) +#define ADC_HLTR_AWD_HT ADC_HLTR_AWD_HT_Msk + + + +#define FL_ADC_EXTERNAL_CH0 (0x1U << 0U) +#define FL_ADC_EXTERNAL_CH1 (0x1U << 1U) +#define FL_ADC_EXTERNAL_CH2 (0x1U << 2U) +#define FL_ADC_EXTERNAL_CH3 (0x1U << 3U) +#define FL_ADC_EXTERNAL_CH4 (0x1U << 4U) +#define FL_ADC_EXTERNAL_CH5 (0x1U << 5U) +#define FL_ADC_EXTERNAL_CH6 (0x1U << 6U) +#define FL_ADC_EXTERNAL_CH7 (0x1U << 7U) +#define FL_ADC_EXTERNAL_CH8 (0x1U << 8U) +#define FL_ADC_EXTERNAL_CH9 (0x1U << 9U) +#define FL_ADC_EXTERNAL_CH10 (0x1U << 10U) +#define FL_ADC_EXTERNAL_CH11 (0x1U << 11U) +#define FL_ADC_EXTERNAL_CH12 (0x1U << 12U) +#define FL_ADC_EXTERNAL_CH13 (0x1U << 13U) +#define FL_ADC_EXTERNAL_CH14 (0x1U << 14U) +#define FL_ADC_EXTERNAL_CH15 (0x1U << 15U) +#define FL_ADC_EXTERNAL_CH16 (0x1U << 16U) +#define FL_ADC_EXTERNAL_CH17 (0x1U << 17U) +#define FL_ADC_EXTERNAL_CH18 (0x1U << 18U) +#define FL_ADC_EXTERNAL_CH19 (0x1U << 19U) +#define FL_ADC_INTERNAL_VREF1P2 (0x1U << 24U) +#define FL_ADC_INTERNAL_TS (0x1U << 25U) +#define FL_ADC_INTERNAL_AVREF (0x1U << 26U) +#define FL_ADC_INTERNAL_VBAT_DIV3 (0x1U << 27U) +#define FL_ADC_INTERNAL_VDD_DIV3 (0x1U << 28U) +#define FL_ADC_INTERNAL_DAC (0x1U << 29U) +#define FL_ADC_ALL_CHANNEL (0xfffffU << 0U) + + +#define FL_ADC_DIFFERENTIAL_GROUP0 (0x1U << 0U) +#define FL_ADC_DIFFERENTIAL_GROUP1 (0x1U << 1U) +#define FL_ADC_DIFFERENTIAL_GROUP2 (0x1U << 2U) +#define FL_ADC_DIFFERENTIAL_GROUP3 (0x1U << 3U) +#define FL_ADC_DIFFERENTIAL_GROUP4 (0x1U << 4U) +#define FL_ADC_DIFFERENTIAL_GROUP5 (0x1U << 5U) +#define FL_ADC_DIFFERENTIAL_GROUP6 (0x1U << 6U) +#define FL_ADC_CLK_PSC_DIV1 (0x0U << 0U) +#define FL_ADC_CLK_PSC_DIV2 (0x1U << 0U) +#define FL_ADC_CLK_PSC_DIV4 (0x2U << 0U) +#define FL_ADC_CLK_PSC_DIV8 (0x3U << 0U) +#define FL_ADC_CLK_PSC_DIV16 (0x4U << 0U) +#define FL_ADC_CLK_PSC_DIV32 (0x5U << 0U) + + + +#define FL_ADC_TRIGGER_EDGE_NONE (0x0U << ADC_CR2_TRGCFG_Pos) +#define FL_ADC_TRIGGER_EDGE_RISING (0x1U << ADC_CR2_TRGCFG_Pos) +#define FL_ADC_TRIGGER_EDGE_FALLING (0x2U << ADC_CR2_TRGCFG_Pos) +#define FL_ADC_TRIGGER_EDGE_BOTH (0x3U << ADC_CR2_TRGCFG_Pos) + + +#define FL_ADC_REF_SOURCE_VDDA (0x0U << ADC_CFGR1_PEFSEL_Pos) +#define FL_ADC_REF_SOURCE_VREFP (0x1U << ADC_CFGR1_PEFSEL_Pos) +#define FL_ADC_REF_SOURCE_VDD15 (0x2U << ADC_CFGR1_PEFSEL_Pos) + + +#define FL_ADC_CLK_SOURCE_ADCCLK (0x0U << ADC_CFGR1_CLKSEL_Pos) +#define FL_ADC_CLK_SOURCE_APBCLK (0x1U << ADC_CFGR1_CLKSEL_Pos) + + +#define FL_ADC_BIT_WIDTH_12B (0x0U << ADC_CFGR1_BITSEL_Pos) +#define FL_ADC_BIT_WIDTH_10B (0x1U << ADC_CFGR1_BITSEL_Pos) +#define FL_ADC_BIT_WIDTH_8B (0x2U << ADC_CFGR1_BITSEL_Pos) +#define FL_ADC_BIT_WIDTH_6B (0x3U << ADC_CFGR1_BITSEL_Pos) + + +#define FL_ADC_APBCLK_PSC_DIV1 (0x0U << ADC_CFGR1_APBCLK_PSC_Pos) +#define FL_ADC_APBCLK_PSC_DIV2 (0x1U << ADC_CFGR1_APBCLK_PSC_Pos) +#define FL_ADC_APBCLK_PSC_DIV4 (0x2U << ADC_CFGR1_APBCLK_PSC_Pos) +#define FL_ADC_APBCLK_PSC_DIV8 (0x3U << ADC_CFGR1_APBCLK_PSC_Pos) + + +#define FL_ADC_BUFF_POWER_MODE_NORMAL (0x0U << ADC_CFGR1_BUFMOD_Pos) +#define FL_ADC_BUFF_POWER_MODE_LOW (0x1U << ADC_CFGR1_BUFMOD_Pos) + + +#define FL_ADC_BUFF_FILTER_MODE_NORMAL (0x0U << ADC_CFGR1_BUFLPF_Pos) +#define FL_ADC_BUFF_FILTER_MODE_LOWPASS (0x1U << ADC_CFGR1_BUFLPF_Pos) + + +#define FL_ADC_SEQ_SCAN_DIR_FORWARD (0x0U << ADC_CFGR2_SCANDIR_Pos) +#define FL_ADC_SEQ_SCAN_DIR_BACKWARD (0x1U << ADC_CFGR2_SCANDIR_Pos) + + +#define FL_ADC_TRGI_LUT0 (0x0U << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_LUT1 (0x1U << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_LUT2 (0x2U << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_ATIM (0x3U << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_GPTIM1 (0x4U << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_GPTIM2 (0x5U << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_BSTIM16 (0x6U << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_LPTIM16 (0x7U << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_COMP1 (0x8U << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_COMP2 (0x9U << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_RTCA (0xaU << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_LUT3 (0xbU << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_GPTIM0 (0xcU << ADC_CFGR2_EXTS_Pos) +#define FL_ADC_TRGI_COMP3 (0xdU << ADC_CFGR2_EXTS_Pos) + + +#define FL_ADC_CONV_MODE_SINGLE (0x0U << ADC_CFGR2_CONT_Pos) +#define FL_ADC_CONV_MODE_CONTINUOUS (0x1U << ADC_CFGR2_CONT_Pos) + + +#define FL_ADC_SINGLE_CONV_MODE_AUTO (0x0U << ADC_CFGR2_SEMI_Pos) +#define FL_ADC_SINGLE_CONV_MODE_SEMIAUTO (0x1U << ADC_CFGR2_SEMI_Pos) + + +#define FL_ADC_OVERSAMPLING_MUL_2X (0x0U << ADC_CFGR2_OVSR_Pos) +#define FL_ADC_OVERSAMPLING_MUL_4X (0x1U << ADC_CFGR2_OVSR_Pos) +#define FL_ADC_OVERSAMPLING_MUL_8X (0x2U << ADC_CFGR2_OVSR_Pos) +#define FL_ADC_OVERSAMPLING_MUL_16X (0x3U << ADC_CFGR2_OVSR_Pos) +#define FL_ADC_OVERSAMPLING_MUL_32X (0x4U << ADC_CFGR2_OVSR_Pos) +#define FL_ADC_OVERSAMPLING_MUL_64X (0x5U << ADC_CFGR2_OVSR_Pos) +#define FL_ADC_OVERSAMPLING_MUL_128X (0x6U << ADC_CFGR2_OVSR_Pos) +#define FL_ADC_OVERSAMPLING_MUL_256X (0x7U << ADC_CFGR2_OVSR_Pos) + + +#define FL_ADC_OVERSAMPLING_SHIFT_0B (0x0U << ADC_CFGR2_OVSS_Pos) +#define FL_ADC_OVERSAMPLING_SHIFT_1B (0x1U << ADC_CFGR2_OVSS_Pos) +#define FL_ADC_OVERSAMPLING_SHIFT_2B (0x2U << ADC_CFGR2_OVSS_Pos) +#define FL_ADC_OVERSAMPLING_SHIFT_3B (0x3U << ADC_CFGR2_OVSS_Pos) +#define FL_ADC_OVERSAMPLING_SHIFT_4B (0x4U << ADC_CFGR2_OVSS_Pos) +#define FL_ADC_OVERSAMPLING_SHIFT_5B (0x5U << ADC_CFGR2_OVSS_Pos) +#define FL_ADC_OVERSAMPLING_SHIFT_6B (0x6U << ADC_CFGR2_OVSS_Pos) +#define FL_ADC_OVERSAMPLING_SHIFT_7B (0x7U << ADC_CFGR2_OVSS_Pos) +#define FL_ADC_OVERSAMPLING_SHIFT_8B (0x8U << ADC_CFGR2_OVSS_Pos) + + +#define FL_ADC_AWDG_ALL_CHANNEL (0x0U << ADC_CFGR2_AWDSC_Pos) +#define FL_ADC_AWDG_SINGLE_CHANNEL (0x1U << ADC_CFGR2_AWDSC_Pos) + + +#define FL_ADC_AWDG_CH0 (0x0U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH1 (0x1U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH2 (0x2U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH3 (0x3U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH4 (0x4U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH5 (0x5U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH6 (0x6U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH7 (0x7U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH8 (0x8U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH9 (0x9U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH10 (0xaU << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH11 (0xbU << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH12 (0xcU << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH13 (0xdU << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH14 (0xeU << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH15 (0xfU << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH16 (0x10U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH17 (0x11U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH18 (0x12U << ADC_CFGR2_AWDCH_Pos) +#define FL_ADC_AWDG_CH19 (0x13U << ADC_CFGR2_AWDCH_Pos) + + +#define FL_ADC_SLOW_CH_SAMPLING_TIME_2_ADCCLK (0x0U << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_4_ADCCLK (0x1U << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_8_ADCCLK (0x2U << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_12_ADCCLK (0x3U << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_16_ADCCLK (0x4U << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_32_ADCCLK (0x5U << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_64_ADCCLK (0x6U << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_80_ADCCLK (0x7U << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_96_ADCCLK (0x8U << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_128_ADCCLK (0x9U << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_160_ADCCLK (0xaU << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_192_ADCCLK (0xbU << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_256_ADCCLK (0xcU << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_320_ADCCLK (0xdU << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_384_ADCCLK (0xeU << ADC_SMTR_SMTS1_Pos) +#define FL_ADC_SLOW_CH_SAMPLING_TIME_512_ADCCLK (0xfU << ADC_SMTR_SMTS1_Pos) + + +#define FL_ADC_FAST_CH_SAMPLING_TIME_2_ADCCLK (0x0U << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_4_ADCCLK (0x1U << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_8_ADCCLK (0x2U << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_12_ADCCLK (0x3U << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_16_ADCCLK (0x4U << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_32_ADCCLK (0x5U << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_64_ADCCLK (0x6U << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_80_ADCCLK (0x7U << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_96_ADCCLK (0x8U << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_128_ADCCLK (0x9U << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_160_ADCCLK (0xaU << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_192_ADCCLK (0xbU << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_256_ADCCLK (0xcU << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_320_ADCCLK (0xdU << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_384_ADCCLK (0xeU << ADC_SMTR_SMTS2_Pos) +#define FL_ADC_FAST_CH_SAMPLING_TIME_512_ADCCLK (0xfU << ADC_SMTR_SMTS2_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup ADC_FL_Exported_Functions ADC Exported Functions + * @{ + */ + +/** + * @brief Get ADC End Of Conversion Flag + * @rmtoll ISR EOC FL_ADC_IsActiveFlag_EndOfConversion + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsActiveFlag_EndOfConversion(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->ISR, ADC_ISR_EOC_Msk) == (ADC_ISR_EOC_Msk)); +} + +/** + * @brief Clear ADC End Of Conversion Flag + * @rmtoll ISR EOC FL_ADC_ClearFlag_EndOfConversion + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_ClearFlag_EndOfConversion(ADC_Type *ADCx) +{ + WRITE_REG(ADCx->ISR, ADC_ISR_EOC_Msk); +} + +/** + * @brief Get ADC End Of Sequence Flag + * @rmtoll ISR EOS FL_ADC_IsActiveFlag_EndOfSequence + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsActiveFlag_EndOfSequence(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->ISR, ADC_ISR_EOS_Msk) == (ADC_ISR_EOS_Msk)); +} + +/** + * @brief Clear ADC End Of Sequence Flag + * @rmtoll ISR EOS FL_ADC_ClearFlag_EndOfSequence + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_ClearFlag_EndOfSequence(ADC_Type *ADCx) +{ + WRITE_REG(ADCx->ISR, ADC_ISR_EOS_Msk); +} + +/** + * @brief Get ADC Data Overrun Flag + * @rmtoll ISR OVR FL_ADC_IsActiveFlag_Overrun + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsActiveFlag_Overrun(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->ISR, ADC_ISR_OVR_Msk) == (ADC_ISR_OVR_Msk)); +} + +/** + * @brief Clear ADC Data Overrun Flag + * @rmtoll ISR OVR FL_ADC_ClearFlag_Overrun + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_ClearFlag_Overrun(ADC_Type *ADCx) +{ + WRITE_REG(ADCx->ISR, ADC_ISR_OVR_Msk); +} + +/** + * @brief Get ADC Busy Flag + * @rmtoll ISR BUSY FL_ADC_IsActiveFlag_Busy + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsActiveFlag_Busy(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->ISR, ADC_ISR_BUSY_Msk) == (ADC_ISR_BUSY_Msk)); +} + +/** + * @brief Get ADC End Of Calibration Flag + * @rmtoll ISR EOCAL FL_ADC_IsActiveFlag_EndOfCalibration + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsActiveFlag_EndOfCalibration(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->ISR, ADC_ISR_EOCAL_Msk) == (ADC_ISR_EOCAL_Msk)); +} + +/** + * @brief Clear ADC End Of Calibration Flag + * @rmtoll ISR EOCAL FL_ADC_ClearFlag_EndOfCalibration + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_ClearFlag_EndOfCalibration(ADC_Type *ADCx) +{ + WRITE_REG(ADCx->ISR, ADC_ISR_EOCAL_Msk); +} + +/** + * @brief Get ADC Analog Watchdog Under Low + * @rmtoll ISR AWD_UL FL_ADC_IsActiveFlag_AnalogWDGUnderLow + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsActiveFlag_AnalogWDGUnderLow(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->ISR, ADC_ISR_AWD_UL_Msk) == (ADC_ISR_AWD_UL_Msk)); +} + +/** + * @brief Clear ADC Analog Watchdog Under Low + * @rmtoll ISR AWD_UL FL_ADC_ClearFlag_AnalogWDGUnderLow + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_ClearFlag_AnalogWDGUnderLow(ADC_Type *ADCx) +{ + WRITE_REG(ADCx->ISR, ADC_ISR_AWD_UL_Msk); +} + +/** + * @brief Get ADC Analog Watchdog Above High + * @rmtoll ISR AWD_AH FL_ADC_IsActiveFlag_AnalogWDGAboveHigh + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsActiveFlag_AnalogWDGAboveHigh(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->ISR, ADC_ISR_AWD_AH_Msk) == (ADC_ISR_AWD_AH_Msk)); +} + +/** + * @brief Clear ADC Analog Watchdog Above High + * @rmtoll ISR AWD_AH FL_ADC_ClearFlag_AnalogWDGAboveHigh + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_ClearFlag_AnalogWDGAboveHigh(ADC_Type *ADCx) +{ + WRITE_REG(ADCx->ISR, ADC_ISR_AWD_AH_Msk); +} + +/** + * @brief Enable ADC End 0f Conversion interrupt + * @rmtoll IER EOCIE FL_ADC_EnableIT_EndOfConversion + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableIT_EndOfConversion(ADC_Type *ADCx) +{ + SET_BIT(ADCx->IER, ADC_IER_EOCIE_Msk); +} + +/** + * @brief Disable ADC End 0f Conversion interrupt + * @rmtoll IER EOCIE FL_ADC_DisableIT_EndOfConversion + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableIT_EndOfConversion(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->IER, ADC_IER_EOCIE_Msk); +} + +/** + * @brief Get ADC End 0f Conversion interrupt Enable Status + * @rmtoll IER EOCIE FL_ADC_IsEnabledIT_EndOfConversion + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledIT_EndOfConversion(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->IER, ADC_IER_EOCIE_Msk) == ADC_IER_EOCIE_Msk); +} + +/** + * @brief Enable ADC End Of Sequence interrupt + * @rmtoll IER EOSIE FL_ADC_EnableIT_EndOfSequence + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableIT_EndOfSequence(ADC_Type *ADCx) +{ + SET_BIT(ADCx->IER, ADC_IER_EOSIE_Msk); +} + +/** + * @brief Disable ADC End Of Sequence interrupt + * @rmtoll IER EOSIE FL_ADC_DisableIT_EndOfSequence + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableIT_EndOfSequence(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->IER, ADC_IER_EOSIE_Msk); +} + +/** + * @brief Get ADC End Of Sequence interrupt Enable Status + * @rmtoll IER EOSIE FL_ADC_IsEnabledIT_EndOfSequence + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledIT_EndOfSequence(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->IER, ADC_IER_EOSIE_Msk) == ADC_IER_EOSIE_Msk); +} + +/** + * @brief Enable ADC Data Overrun interrupt + * @rmtoll IER OVRIE FL_ADC_EnableIT_Overrun + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableIT_Overrun(ADC_Type *ADCx) +{ + SET_BIT(ADCx->IER, ADC_IER_OVRIE_Msk); +} + +/** + * @brief Disable ADC Data Overrun interrupt + * @rmtoll IER OVRIE FL_ADC_DisableIT_Overrun + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableIT_Overrun(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->IER, ADC_IER_OVRIE_Msk); +} + +/** + * @brief Get ADC Data Overrun interrupt Enable Status + * @rmtoll IER OVRIE FL_ADC_IsEnabledIT_Overrun + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledIT_Overrun(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->IER, ADC_IER_OVRIE_Msk) == ADC_IER_OVRIE_Msk); +} + +/** + * @brief Enable ADC End Of Calibration interrupt + * @rmtoll IER EOCALIE FL_ADC_EnableIT_EndOfCalibration + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableIT_EndOfCalibration(ADC_Type *ADCx) +{ + SET_BIT(ADCx->IER, ADC_IER_EOCALIE_Msk); +} + +/** + * @brief Disable ADC End Of Calibration interrupt + * @rmtoll IER EOCALIE FL_ADC_DisableIT_EndOfCalibration + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableIT_EndOfCalibration(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->IER, ADC_IER_EOCALIE_Msk); +} + +/** + * @brief Get ADC End Of Calibration interrupt Enable Status + * @rmtoll IER EOCALIE FL_ADC_IsEnabledIT_EndOfCalibration + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledIT_EndOfCalibration(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->IER, ADC_IER_EOCALIE_Msk) == ADC_IER_EOCALIE_Msk); +} + +/** + * @brief Enable ADC Analog Watchdog Under Low interrupt + * @rmtoll IER AWD_ULIE FL_ADC_EnableIT_AnalogWDGUnderLow + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableIT_AnalogWDGUnderLow(ADC_Type *ADCx) +{ + SET_BIT(ADCx->IER, ADC_IER_AWD_ULIE_Msk); +} + +/** + * @brief Disable ADC Analog Watchdog Under Low interrupt + * @rmtoll IER AWD_ULIE FL_ADC_DisableIT_AnalogWDGUnderLow + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableIT_AnalogWDGUnderLow(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->IER, ADC_IER_AWD_ULIE_Msk); +} + +/** + * @brief Get ADC Analog Watchdog Under Low interrupt Enable Status + * @rmtoll IER AWD_ULIE FL_ADC_IsEnabledIT_AnalogWDGUnderLow + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledIT_AnalogWDGUnderLow(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->IER, ADC_IER_AWD_ULIE_Msk) == ADC_IER_AWD_ULIE_Msk); +} + +/** + * @brief Enable ADC Analog Watchdog Above High interrupt + * @rmtoll IER AWD_AHIE FL_ADC_EnableIT_AnalogWDGAboveHigh + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableIT_AnalogWDGAboveHigh(ADC_Type *ADCx) +{ + SET_BIT(ADCx->IER, ADC_IER_AWD_AHIE_Msk); +} + +/** + * @brief Disable ADC Analog Watchdog Above High interrupt + * @rmtoll IER AWD_AHIE FL_ADC_DisableIT_AnalogWDGAboveHigh + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableIT_AnalogWDGAboveHigh(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->IER, ADC_IER_AWD_AHIE_Msk); +} + +/** + * @brief Get ADC Analog Watchdog Above High interrupt Enable Status + * @rmtoll IER AWD_AHIE FL_ADC_IsEnabledIT_AnalogWDGAboveHigh + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledIT_AnalogWDGAboveHigh(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->IER, ADC_IER_AWD_AHIE_Msk) == ADC_IER_AWD_AHIE_Msk); +} + +/** + * @brief Enable ADC + * @rmtoll CR1 ADEN FL_ADC_Enable + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_Enable(ADC_Type *ADCx) +{ + SET_BIT(ADCx->CR1, ADC_CR1_ADEN_Msk); +} + +/** + * @brief Disable ADC + * @rmtoll CR1 ADEN FL_ADC_Disable + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_Disable(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->CR1, ADC_CR1_ADEN_Msk); +} + +/** + * @brief Get ADC Enable Status + * @rmtoll CR1 ADEN FL_ADC_IsEnabled + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabled(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR1, ADC_CR1_ADEN_Msk) == ADC_CR1_ADEN_Msk); +} + +/** + * @brief Enable ADC Sofeware Triggered Conversion + * @rmtoll CR1 SWTRIG FL_ADC_EnableSWConversion + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableSWConversion(ADC_Type *ADCx) +{ + SET_BIT(ADCx->CR1, ADC_CR1_SWTRIG_Msk); +} + +/** + * @brief Set ADC Trigger Edge + * @rmtoll CR2 TRGCFG FL_ADC_SetTriggerEdge + * @param ADCx ADC instance + * @param edge This parameter can be one of the following values: + * @arg @ref FL_ADC_TRIGGER_EDGE_NONE + * @arg @ref FL_ADC_TRIGGER_EDGE_RISING + * @arg @ref FL_ADC_TRIGGER_EDGE_FALLING + * @arg @ref FL_ADC_TRIGGER_EDGE_BOTH + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetTriggerEdge(ADC_Type *ADCx, uint32_t edge) +{ + MODIFY_REG(ADCx->CR2, ADC_CR2_TRGCFG_Msk, edge); +} + +/** + * @brief Read ADC Trigger Edge + * @rmtoll CR2 TRGCFG FL_ADC_GetTriggerEdge + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_TRIGGER_EDGE_NONE + * @arg @ref FL_ADC_TRIGGER_EDGE_RISING + * @arg @ref FL_ADC_TRIGGER_EDGE_FALLING + * @arg @ref FL_ADC_TRIGGER_EDGE_BOTH + */ +__STATIC_INLINE uint32_t FL_ADC_GetTriggerEdge(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CR2, ADC_CR2_TRGCFG_Msk)); +} + +/** + * @brief Enable ADC Calibration + * @rmtoll CALR CALEN FL_ADC_EnableCalibration + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableCalibration(ADC_Type *ADCx) +{ + SET_BIT(ADCx->CALR, ADC_CALR_CALEN_Msk); +} + +/** + * @brief Disable ADC Calibration + * @rmtoll CALR CALEN FL_ADC_DisableCalibration + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableCalibration(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->CALR, ADC_CALR_CALEN_Msk); +} + +/** + * @brief Get ADC Calibration Enable Status + * @rmtoll CALR CALEN FL_ADC_IsEnabledCalibration + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledCalibration(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CALR, ADC_CALR_CALEN_Msk) == ADC_CALR_CALEN_Msk); +} + +/** + * @brief Set ADC Reference Source + * @rmtoll CFGR1 PEFSEL FL_ADC_SetReferenceSource + * @param ADCx ADC instance + * @param ref This parameter can be one of the following values: + * @arg @ref FL_ADC_REF_SOURCE_VDDA + * @arg @ref FL_ADC_REF_SOURCE_VREFP + * @arg @ref FL_ADC_REF_SOURCE_VDD15 + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetReferenceSource(ADC_Type *ADCx, uint32_t ref) +{ + MODIFY_REG(ADCx->CFGR1, ADC_CFGR1_PEFSEL_Msk, ref); +} + +/** + * @brief Read ADC Reference Source + * @rmtoll CFGR1 PEFSEL FL_ADC_GetReferenceSource + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_REF_SOURCE_VDDA + * @arg @ref FL_ADC_REF_SOURCE_VREFP + * @arg @ref FL_ADC_REF_SOURCE_VDD15 + */ +__STATIC_INLINE uint32_t FL_ADC_GetReferenceSource(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR1, ADC_CFGR1_PEFSEL_Msk)); +} + +/** + * @brief Set ADC Working Clock + * @rmtoll CFGR1 CLKSEL FL_ADC_SetClockSource + * @param ADCx ADC instance + * @param clock This parameter can be one of the following values: + * @arg @ref FL_ADC_CLK_SOURCE_ADCCLK + * @arg @ref FL_ADC_CLK_SOURCE_APBCLK + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetClockSource(ADC_Type *ADCx, uint32_t clock) +{ + MODIFY_REG(ADCx->CFGR1, ADC_CFGR1_CLKSEL_Msk, clock); +} + +/** + * @brief Read ADC Working Clock + * @rmtoll CFGR1 CLKSEL FL_ADC_GetClockSource + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_CLK_SOURCE_ADCCLK + * @arg @ref FL_ADC_CLK_SOURCE_APBCLK + */ +__STATIC_INLINE uint32_t FL_ADC_GetClockSource(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR1, ADC_CFGR1_CLKSEL_Msk)); +} + +/** + * @brief Set ADC Output Bit Width + * @rmtoll CFGR1 BITSEL FL_ADC_SetBitWidth + * @param ADCx ADC instance + * @param bitWidth This parameter can be one of the following values: + * @arg @ref FL_ADC_BIT_WIDTH_12B + * @arg @ref FL_ADC_BIT_WIDTH_10B + * @arg @ref FL_ADC_BIT_WIDTH_8B + * @arg @ref FL_ADC_BIT_WIDTH_6B + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetBitWidth(ADC_Type *ADCx, uint32_t bitWidth) +{ + MODIFY_REG(ADCx->CFGR1, ADC_CFGR1_BITSEL_Msk, bitWidth); +} + +/** + * @brief Read ADC Output Bit Width + * @rmtoll CFGR1 BITSEL FL_ADC_GetBitWidth + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_BIT_WIDTH_12B + * @arg @ref FL_ADC_BIT_WIDTH_10B + * @arg @ref FL_ADC_BIT_WIDTH_8B + * @arg @ref FL_ADC_BIT_WIDTH_6B + */ +__STATIC_INLINE uint32_t FL_ADC_GetBitWidth(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR1, ADC_CFGR1_BITSEL_Msk)); +} + +/** + * @brief Enable ADC External Conversion + * @rmtoll CFGR1 EXSOC FL_ADC_EnableExternalConversion + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableExternalConversion(ADC_Type *ADCx) +{ + SET_BIT(ADCx->CFGR1, ADC_CFGR1_EXSOC_Msk); +} + +/** + * @brief Disable ADC External Conversion + * @rmtoll CFGR1 EXSOC FL_ADC_DisableExternalConversion + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableExternalConversion(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->CFGR1, ADC_CFGR1_EXSOC_Msk); +} + +/** + * @brief Get ADC External Conversion Enable Status + * @rmtoll CFGR1 EXSOC FL_ADC_IsEnabledExternalConversion + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledExternalConversion(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR1, ADC_CFGR1_EXSOC_Msk) == ADC_CFGR1_EXSOC_Msk); +} + +/** + * @brief Set ADC APBCLK Prescaler + * @rmtoll CFGR1 APBCLK_PSC FL_ADC_SetAPBPrescaler + * @param ADCx ADC instance + * @param psc This parameter can be one of the following values: + * @arg @ref FL_ADC_APBCLK_PSC_DIV1 + * @arg @ref FL_ADC_APBCLK_PSC_DIV2 + * @arg @ref FL_ADC_APBCLK_PSC_DIV4 + * @arg @ref FL_ADC_APBCLK_PSC_DIV8 + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetAPBPrescaler(ADC_Type *ADCx, uint32_t psc) +{ + MODIFY_REG(ADCx->CFGR1, ADC_CFGR1_APBCLK_PSC_Msk, psc); +} + +/** + * @brief Read ADC APBCLK Prescaler + * @rmtoll CFGR1 APBCLK_PSC FL_ADC_GetAPBPrescaler + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_APBCLK_PSC_DIV1 + * @arg @ref FL_ADC_APBCLK_PSC_DIV2 + * @arg @ref FL_ADC_APBCLK_PSC_DIV4 + * @arg @ref FL_ADC_APBCLK_PSC_DIV8 + */ +__STATIC_INLINE uint32_t FL_ADC_GetAPBPrescaler(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR1, ADC_CFGR1_APBCLK_PSC_Msk)); +} + +/** + * @brief Enable ADC Buffer + * @rmtoll CFGR1 BUFEN FL_ADC_EnableBuffer + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableBuffer(ADC_Type *ADCx) +{ + SET_BIT(ADCx->CFGR1, ADC_CFGR1_BUFEN_Msk); +} + +/** + * @brief Disable ADC Buffer + * @rmtoll CFGR1 BUFEN FL_ADC_DisableBuffer + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableBuffer(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->CFGR1, ADC_CFGR1_BUFEN_Msk); +} + +/** + * @brief Get ADC Buffer Enable Status + * @rmtoll CFGR1 BUFEN FL_ADC_IsEnabledBuffer + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledBuffer(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR1, ADC_CFGR1_BUFEN_Msk) == ADC_CFGR1_BUFEN_Msk); +} + +/** + * @brief Set ADC Buffer Power Mode + * @rmtoll CFGR1 BUFMOD FL_ADC_SetBufferPowerMode + * @param ADCx ADC instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_ADC_BUFF_POWER_MODE_NORMAL + * @arg @ref FL_ADC_BUFF_POWER_MODE_LOW + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetBufferPowerMode(ADC_Type *ADCx, uint32_t mode) +{ + MODIFY_REG(ADCx->CFGR1, ADC_CFGR1_BUFMOD_Msk, mode); +} + +/** + * @brief Read ADC Buffer Power Mode + * @rmtoll CFGR1 BUFMOD FL_ADC_GetBufferPowerMode + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_BUFF_POWER_MODE_NORMAL + * @arg @ref FL_ADC_BUFF_POWER_MODE_LOW + */ +__STATIC_INLINE uint32_t FL_ADC_GetBufferPowerMode(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR1, ADC_CFGR1_BUFMOD_Msk)); +} + +/** + * @brief Set ADC Buffer Filter Mode + * @rmtoll CFGR1 BUFLPF FL_ADC_SetBufferFilterMode + * @param ADCx ADC instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_ADC_BUFF_FILTER_MODE_NORMAL + * @arg @ref FL_ADC_BUFF_FILTER_MODE_LOWPASS + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetBufferFilterMode(ADC_Type *ADCx, uint32_t mode) +{ + MODIFY_REG(ADCx->CFGR1, ADC_CFGR1_BUFLPF_Msk, mode); +} + +/** + * @brief Read ADC Buffer Filter Mode + * @rmtoll CFGR1 BUFLPF FL_ADC_GetBufferFilterMode + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_BUFF_FILTER_MODE_NORMAL + * @arg @ref FL_ADC_BUFF_FILTER_MODE_LOWPASS + */ +__STATIC_INLINE uint32_t FL_ADC_GetBufferFilterMode(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR1, ADC_CFGR1_BUFLPF_Msk)); +} + +/** + * @brief Enable ADC Buffer Chopper + * @rmtoll CFGR1 BUFCHP_EN FL_ADC_EnableBufferChopper + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableBufferChopper(ADC_Type *ADCx) +{ + SET_BIT(ADCx->CFGR1, ADC_CFGR1_BUFCHP_EN_Msk); +} + +/** + * @brief Disable ADC Buffer Chopper + * @rmtoll CFGR1 BUFCHP_EN FL_ADC_DisableBufferChopper + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableBufferChopper(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->CFGR1, ADC_CFGR1_BUFCHP_EN_Msk); +} + +/** + * @brief Get ADC Buffer Chopper Enable Status + * @rmtoll CFGR1 BUFCHP_EN FL_ADC_IsEnabledBufferChopper + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledBufferChopper(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR1, ADC_CFGR1_BUFCHP_EN_Msk) == ADC_CFGR1_BUFCHP_EN_Msk); +} + +/** + * @brief Enable ADC DMA + * @rmtoll CFGR2 DMAEN FL_ADC_EnableDMAReq + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableDMAReq(ADC_Type *ADCx) +{ + SET_BIT(ADCx->CFGR2, ADC_CFGR2_DMAEN_Msk); +} + +/** + * @brief Disable ADC DMA + * @rmtoll CFGR2 DMAEN FL_ADC_DisableDMAReq + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableDMAReq(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->CFGR2, ADC_CFGR2_DMAEN_Msk); +} + +/** + * @brief Get ADC DMA Enable Status + * @rmtoll CFGR2 DMAEN FL_ADC_IsEnabledDMAReq + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledDMAReq(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_DMAEN_Msk) == ADC_CFGR2_DMAEN_Msk); +} + +/** + * @brief Set ADC Channel Scan Direction + * @rmtoll CFGR2 SCANDIR FL_ADC_SetSequenceScanDirection + * @param ADCx ADC instance + * @param dir This parameter can be one of the following values: + * @arg @ref FL_ADC_SEQ_SCAN_DIR_FORWARD + * @arg @ref FL_ADC_SEQ_SCAN_DIR_BACKWARD + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetSequenceScanDirection(ADC_Type *ADCx, uint32_t dir) +{ + MODIFY_REG(ADCx->CFGR2, ADC_CFGR2_SCANDIR_Msk, dir); +} + +/** + * @brief Get ADC Channel Scan Direction + * @rmtoll CFGR2 SCANDIR FL_ADC_GetSequenceScanDirection + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_SEQ_SCAN_DIR_FORWARD + * @arg @ref FL_ADC_SEQ_SCAN_DIR_BACKWARD + */ +__STATIC_INLINE uint32_t FL_ADC_GetSequenceScanDirection(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_SCANDIR_Msk)); +} + +/** + * @brief Set ADC Trigger Source + * @rmtoll CFGR2 EXTS FL_ADC_SetTriggerSource + * @param ADCx ADC instance + * @param source This parameter can be one of the following values: + * @arg @ref FL_ADC_TRGI_LUT0 + * @arg @ref FL_ADC_TRGI_LUT1 + * @arg @ref FL_ADC_TRGI_LUT2 + * @arg @ref FL_ADC_TRGI_ATIM + * @arg @ref FL_ADC_TRGI_GPTIM1 + * @arg @ref FL_ADC_TRGI_GPTIM2 + * @arg @ref FL_ADC_TRGI_BSTIM16 + * @arg @ref FL_ADC_TRGI_LPTIM16 + * @arg @ref FL_ADC_TRGI_COMP1 + * @arg @ref FL_ADC_TRGI_COMP2 + * @arg @ref FL_ADC_TRGI_RTCA + * @arg @ref FL_ADC_TRGI_LUT3 + * @arg @ref FL_ADC_TRGI_GPTIM0 + * @arg @ref FL_ADC_TRGI_COMP3 + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetTriggerSource(ADC_Type *ADCx, uint32_t source) +{ + MODIFY_REG(ADCx->CFGR2, ADC_CFGR2_EXTS_Msk, source); +} + +/** + * @brief Get ADC Trigger Source + * @rmtoll CFGR2 EXTS FL_ADC_GetTriggerSource + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_TRGI_LUT0 + * @arg @ref FL_ADC_TRGI_LUT1 + * @arg @ref FL_ADC_TRGI_LUT2 + * @arg @ref FL_ADC_TRGI_ATIM + * @arg @ref FL_ADC_TRGI_GPTIM1 + * @arg @ref FL_ADC_TRGI_GPTIM2 + * @arg @ref FL_ADC_TRGI_BSTIM16 + * @arg @ref FL_ADC_TRGI_LPTIM16 + * @arg @ref FL_ADC_TRGI_COMP1 + * @arg @ref FL_ADC_TRGI_COMP2 + * @arg @ref FL_ADC_TRGI_RTCA + * @arg @ref FL_ADC_TRGI_LUT3 + * @arg @ref FL_ADC_TRGI_GPTIM0 + * @arg @ref FL_ADC_TRGI_COMP3 + */ +__STATIC_INLINE uint32_t FL_ADC_GetTriggerSource(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_EXTS_Msk)); +} + +/** + * @brief Enable ADC Overrun Mode + * @rmtoll CFGR2 OVRM FL_ADC_EnableOverrunMode + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableOverrunMode(ADC_Type *ADCx) +{ + SET_BIT(ADCx->CFGR2, ADC_CFGR2_OVRM_Msk); +} + +/** + * @brief Disable ADC Overrun Mode + * @rmtoll CFGR2 OVRM FL_ADC_DisableOverrunMode + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableOverrunMode(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->CFGR2, ADC_CFGR2_OVRM_Msk); +} + +/** + * @brief Get ADC Overrun Mode Enable Status + * @rmtoll CFGR2 OVRM FL_ADC_IsEnabledOverrunMode + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledOverrunMode(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_OVRM_Msk) == ADC_CFGR2_OVRM_Msk); +} + +/** + * @brief Set ADC Conversion Mode + * @rmtoll CFGR2 CONT FL_ADC_SetConversionMode + * @param ADCx ADC instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_ADC_CONV_MODE_SINGLE + * @arg @ref FL_ADC_CONV_MODE_CONTINUOUS + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetConversionMode(ADC_Type *ADCx, uint32_t mode) +{ + MODIFY_REG(ADCx->CFGR2, ADC_CFGR2_CONT_Msk, mode); +} + +/** + * @brief Get ADC Conversion Mode + * @rmtoll CFGR2 CONT FL_ADC_GetConversionMode + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_CONV_MODE_SINGLE + * @arg @ref FL_ADC_CONV_MODE_CONTINUOUS + */ +__STATIC_INLINE uint32_t FL_ADC_GetConversionMode(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_CONT_Msk)); +} + +/** + * @brief Enable ADC Wait Mode + * @rmtoll CFGR2 WAIT FL_ADC_EnableWaitMode + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableWaitMode(ADC_Type *ADCx) +{ + SET_BIT(ADCx->CFGR2, ADC_CFGR2_WAIT_Msk); +} + +/** + * @brief Disable ADC Wait Mode + * @rmtoll CFGR2 WAIT FL_ADC_DisableWaitMode + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableWaitMode(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->CFGR2, ADC_CFGR2_WAIT_Msk); +} + +/** + * @brief Get ADC Wait Mode Enable Status + * @rmtoll CFGR2 WAIT FL_ADC_IsEnabledWaitMode + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledWaitMode(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_WAIT_Msk) == ADC_CFGR2_WAIT_Msk); +} + +/** + * @brief Set ADC Single Conversion Mode + * @rmtoll CFGR2 SEMI FL_ADC_SetSingleConversionAutoMode + * @param ADCx ADC instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_ADC_SINGLE_CONV_MODE_AUTO + * @arg @ref FL_ADC_SINGLE_CONV_MODE_SEMIAUTO + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetSingleConversionAutoMode(ADC_Type *ADCx, uint32_t mode) +{ + MODIFY_REG(ADCx->CFGR2, ADC_CFGR2_SEMI_Msk, mode); +} + +/** + * @brief Get ADC Single Conversion Mode + * @rmtoll CFGR2 SEMI FL_ADC_GetSingleConversionAutoMode + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_SINGLE_CONV_MODE_AUTO + * @arg @ref FL_ADC_SINGLE_CONV_MODE_SEMIAUTO + */ +__STATIC_INLINE uint32_t FL_ADC_GetSingleConversionAutoMode(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_SEMI_Msk)); +} + +/** + * @brief Enable ADC Trigger Filter + * @rmtoll CFGR2 IOTRFEN FL_ADC_EnableTriggerFilter + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableTriggerFilter(ADC_Type *ADCx) +{ + SET_BIT(ADCx->CFGR2, ADC_CFGR2_IOTRFEN_Msk); +} + +/** + * @brief Disable ADC Trigger Filter + * @rmtoll CFGR2 IOTRFEN FL_ADC_DisableTriggerFilter + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableTriggerFilter(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->CFGR2, ADC_CFGR2_IOTRFEN_Msk); +} + +/** + * @brief Get ADC Trigger Filter Enable Status + * @rmtoll CFGR2 IOTRFEN FL_ADC_IsEnabledTriggerFilter + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledTriggerFilter(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_IOTRFEN_Msk) == ADC_CFGR2_IOTRFEN_Msk); +} + +/** + * @brief Enable ADC OverSampling + * @rmtoll CFGR2 OVSEN FL_ADC_EnableOverSampling + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableOverSampling(ADC_Type *ADCx) +{ + SET_BIT(ADCx->CFGR2, ADC_CFGR2_OVSEN_Msk); +} + +/** + * @brief Disable ADC OverSampling + * @rmtoll CFGR2 OVSEN FL_ADC_DisableOverSampling + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableOverSampling(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->CFGR2, ADC_CFGR2_OVSEN_Msk); +} + +/** + * @brief Get ADC OverSampling Enable Status + * @rmtoll CFGR2 OVSEN FL_ADC_IsEnabledOverSampling + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledOverSampling(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_OVSEN_Msk) == ADC_CFGR2_OVSEN_Msk); +} + +/** + * @brief Set ADC OverSampling Multiplier + * @rmtoll CFGR2 OVSR FL_ADC_SetOverSamplingMultiplier + * @param ADCx ADC instance + * @param mul This parameter can be one of the following values: + * @arg @ref FL_ADC_OVERSAMPLING_MUL_2X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_4X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_8X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_16X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_32X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_64X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_128X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_256X + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetOverSamplingMultiplier(ADC_Type *ADCx, uint32_t mul) +{ + MODIFY_REG(ADCx->CFGR2, ADC_CFGR2_OVSR_Msk, mul); +} + +/** + * @brief Read ADC OverSampling Multiplier + * @rmtoll CFGR2 OVSR FL_ADC_GetOverSamplingMultiplier + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_OVERSAMPLING_MUL_2X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_4X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_8X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_16X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_32X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_64X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_128X + * @arg @ref FL_ADC_OVERSAMPLING_MUL_256X + */ +__STATIC_INLINE uint32_t FL_ADC_GetOverSamplingMultiplier(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_OVSR_Msk)); +} + +/** + * @brief Set ADC OverSampling Shift + * @rmtoll CFGR2 OVSS FL_ADC_SetOverSamplingShift + * @param ADCx ADC instance + * @param shift This parameter can be one of the following values: + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_0B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_1B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_2B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_3B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_4B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_5B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_6B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_7B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_8B + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetOverSamplingShift(ADC_Type *ADCx, uint32_t shift) +{ + MODIFY_REG(ADCx->CFGR2, ADC_CFGR2_OVSS_Msk, shift); +} + +/** + * @brief Read ADC OverSampling Shift + * @rmtoll CFGR2 OVSS FL_ADC_GetOverSamplingShift + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_0B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_1B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_2B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_3B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_4B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_5B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_6B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_7B + * @arg @ref FL_ADC_OVERSAMPLING_SHIFT_8B + */ +__STATIC_INLINE uint32_t FL_ADC_GetOverSamplingShift(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_OVSS_Msk)); +} + +/** + * @brief Enable ADC Analog WDG + * @rmtoll CFGR2 AWDEN FL_ADC_EnableAnalogWDG + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableAnalogWDG(ADC_Type *ADCx) +{ + SET_BIT(ADCx->CFGR2, ADC_CFGR2_AWDEN_Msk); +} + +/** + * @brief Disable ADC Analog WDG + * @rmtoll CFGR2 AWDEN FL_ADC_DisableAnalogWDG + * @param ADCx ADC instance + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableAnalogWDG(ADC_Type *ADCx) +{ + CLEAR_BIT(ADCx->CFGR2, ADC_CFGR2_AWDEN_Msk); +} + +/** + * @brief Get ADC Analog WDG Enable Status + * @rmtoll CFGR2 AWDEN FL_ADC_IsEnabledAnalogWDG + * @param ADCx ADC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledAnalogWDG(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_AWDEN_Msk) == ADC_CFGR2_AWDEN_Msk); +} + +/** + * @brief Set ADC Analog WDG Monitor Mode + * @rmtoll CFGR2 AWDSC FL_ADC_SetAnalogWDGMonitorMode + * @param ADCx ADC instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_ADC_AWDG_ALL_CHANNEL + * @arg @ref FL_ADC_AWDG_SINGLE_CHANNEL + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetAnalogWDGMonitorMode(ADC_Type *ADCx, uint32_t mode) +{ + MODIFY_REG(ADCx->CFGR2, ADC_CFGR2_AWDSC_Msk, mode); +} + +/** + * @brief Read ADC Analog WDG Monitor Mode + * @rmtoll CFGR2 AWDSC FL_ADC_GetAnalogWDGMonitorMode + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_AWDG_ALL_CHANNEL + * @arg @ref FL_ADC_AWDG_SINGLE_CHANNEL + */ +__STATIC_INLINE uint32_t FL_ADC_GetAnalogWDGMonitorMode(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_AWDSC_Msk)); +} + +/** + * @brief Set ADC Analog WDG Monitor Channel + * @rmtoll CFGR2 AWDCH FL_ADC_SetAnalogWDGMonitorChannel + * @param ADCx ADC instance + * @param monitorChannel This parameter can be one of the following values: + * @arg @ref FL_ADC_AWDG_CH0 + * @arg @ref FL_ADC_AWDG_CH1 + * @arg @ref FL_ADC_AWDG_CH2 + * @arg @ref FL_ADC_AWDG_CH3 + * @arg @ref FL_ADC_AWDG_CH4 + * @arg @ref FL_ADC_AWDG_CH5 + * @arg @ref FL_ADC_AWDG_CH6 + * @arg @ref FL_ADC_AWDG_CH7 + * @arg @ref FL_ADC_AWDG_CH8 + * @arg @ref FL_ADC_AWDG_CH9 + * @arg @ref FL_ADC_AWDG_CH10 + * @arg @ref FL_ADC_AWDG_CH11 + * @arg @ref FL_ADC_AWDG_CH12 + * @arg @ref FL_ADC_AWDG_CH13 + * @arg @ref FL_ADC_AWDG_CH14 + * @arg @ref FL_ADC_AWDG_CH15 + * @arg @ref FL_ADC_AWDG_CH16 + * @arg @ref FL_ADC_AWDG_CH17 + * @arg @ref FL_ADC_AWDG_CH18 + * @arg @ref FL_ADC_AWDG_CH19 + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetAnalogWDGMonitorChannel(ADC_Type *ADCx, uint32_t monitorChannel) +{ + MODIFY_REG(ADCx->CFGR2, ADC_CFGR2_AWDCH_Msk, monitorChannel); +} + +/** + * @brief Read ADC Analog WDG Monitor Channel + * @rmtoll CFGR2 AWDCH FL_ADC_GetAnalogWDGMonitorChannel + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_AWDG_CH0 + * @arg @ref FL_ADC_AWDG_CH1 + * @arg @ref FL_ADC_AWDG_CH2 + * @arg @ref FL_ADC_AWDG_CH3 + * @arg @ref FL_ADC_AWDG_CH4 + * @arg @ref FL_ADC_AWDG_CH5 + * @arg @ref FL_ADC_AWDG_CH6 + * @arg @ref FL_ADC_AWDG_CH7 + * @arg @ref FL_ADC_AWDG_CH8 + * @arg @ref FL_ADC_AWDG_CH9 + * @arg @ref FL_ADC_AWDG_CH10 + * @arg @ref FL_ADC_AWDG_CH11 + * @arg @ref FL_ADC_AWDG_CH12 + * @arg @ref FL_ADC_AWDG_CH13 + * @arg @ref FL_ADC_AWDG_CH14 + * @arg @ref FL_ADC_AWDG_CH15 + * @arg @ref FL_ADC_AWDG_CH16 + * @arg @ref FL_ADC_AWDG_CH17 + * @arg @ref FL_ADC_AWDG_CH18 + * @arg @ref FL_ADC_AWDG_CH19 + */ +__STATIC_INLINE uint32_t FL_ADC_GetAnalogWDGMonitorChannel(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->CFGR2, ADC_CFGR2_AWDCH_Msk)); +} + +/** + * @brief Set ADC Slow Channel Sampling Time + * @rmtoll SMTR SMTS1 FL_ADC_SetSlowChannelSamplingTime + * @param ADCx ADC instance + * @param time This parameter can be one of the following values: + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_2_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_4_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_8_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_12_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_16_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_32_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_64_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_80_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_96_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_128_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_160_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_192_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_256_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_320_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_384_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_512_ADCCLK + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetSlowChannelSamplingTime(ADC_Type *ADCx, uint32_t time) +{ + MODIFY_REG(ADCx->SMTR, ADC_SMTR_SMTS1_Msk, time); +} + +/** + * @brief Read ADC Slow Channel Sampling Time + * @rmtoll SMTR SMTS1 FL_ADC_GetSlowChannelSamplingTime + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_2_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_4_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_8_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_12_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_16_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_32_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_64_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_80_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_96_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_128_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_160_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_192_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_256_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_320_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_384_ADCCLK + * @arg @ref FL_ADC_SLOW_CH_SAMPLING_TIME_512_ADCCLK + */ +__STATIC_INLINE uint32_t FL_ADC_GetSlowChannelSamplingTime(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->SMTR, ADC_SMTR_SMTS1_Msk)); +} + +/** + * @brief Set ADC Fast Channel Sampling Time + * @rmtoll SMTR SMTS2 FL_ADC_SetFastChannelSamplingTime + * @param ADCx ADC instance + * @param time This parameter can be one of the following values: + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_2_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_4_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_8_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_12_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_16_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_32_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_64_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_80_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_96_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_128_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_160_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_192_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_256_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_320_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_384_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_512_ADCCLK + * @retval None + */ +__STATIC_INLINE void FL_ADC_SetFastChannelSamplingTime(ADC_Type *ADCx, uint32_t time) +{ + MODIFY_REG(ADCx->SMTR, ADC_SMTR_SMTS2_Msk, time); +} + +/** + * @brief Read ADC Fast Channel Sampling Time + * @rmtoll SMTR SMTS2 FL_ADC_GetFastChannelSamplingTime + * @param ADCx ADC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_2_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_4_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_8_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_12_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_16_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_32_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_64_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_80_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_96_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_128_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_160_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_192_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_256_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_320_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_384_ADCCLK + * @arg @ref FL_ADC_FAST_CH_SAMPLING_TIME_512_ADCCLK + */ +__STATIC_INLINE uint32_t FL_ADC_GetFastChannelSamplingTime(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->SMTR, ADC_SMTR_SMTS2_Msk)); +} + +/** + * @brief Enable ADC Channel + * @rmtoll CHER FL_ADC_EnableSequencerChannel + * @param ADCx ADC instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ADC_EXTERNAL_CH0 + * @arg @ref FL_ADC_EXTERNAL_CH1 + * @arg @ref FL_ADC_EXTERNAL_CH2 + * @arg @ref FL_ADC_EXTERNAL_CH3 + * @arg @ref FL_ADC_EXTERNAL_CH4 + * @arg @ref FL_ADC_EXTERNAL_CH5 + * @arg @ref FL_ADC_EXTERNAL_CH6 + * @arg @ref FL_ADC_EXTERNAL_CH7 + * @arg @ref FL_ADC_EXTERNAL_CH8 + * @arg @ref FL_ADC_EXTERNAL_CH9 + * @arg @ref FL_ADC_EXTERNAL_CH10 + * @arg @ref FL_ADC_EXTERNAL_CH11 + * @arg @ref FL_ADC_EXTERNAL_CH12 + * @arg @ref FL_ADC_EXTERNAL_CH13 + * @arg @ref FL_ADC_EXTERNAL_CH14 + * @arg @ref FL_ADC_EXTERNAL_CH15 + * @arg @ref FL_ADC_EXTERNAL_CH16 + * @arg @ref FL_ADC_EXTERNAL_CH17 + * @arg @ref FL_ADC_EXTERNAL_CH18 + * @arg @ref FL_ADC_EXTERNAL_CH19 + * @arg @ref FL_ADC_INTERNAL_VREF1P2 + * @arg @ref FL_ADC_INTERNAL_TS + * @arg @ref FL_ADC_INTERNAL_AVREF + * @arg @ref FL_ADC_INTERNAL_VBAT_DIV3 + * @arg @ref FL_ADC_INTERNAL_VDD_DIV3 + * @arg @ref FL_ADC_INTERNAL_DAC + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableSequencerChannel(ADC_Type *ADCx, uint32_t channel) +{ + SET_BIT(ADCx->CHER, ((channel & 0x7fffffff) << 0x0U)); +} + +/** + * @brief Disable ADC Channel + * @rmtoll CHER FL_ADC_DisableSequencerChannel + * @param ADCx ADC instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ADC_EXTERNAL_CH0 + * @arg @ref FL_ADC_EXTERNAL_CH1 + * @arg @ref FL_ADC_EXTERNAL_CH2 + * @arg @ref FL_ADC_EXTERNAL_CH3 + * @arg @ref FL_ADC_EXTERNAL_CH4 + * @arg @ref FL_ADC_EXTERNAL_CH5 + * @arg @ref FL_ADC_EXTERNAL_CH6 + * @arg @ref FL_ADC_EXTERNAL_CH7 + * @arg @ref FL_ADC_EXTERNAL_CH8 + * @arg @ref FL_ADC_EXTERNAL_CH9 + * @arg @ref FL_ADC_EXTERNAL_CH10 + * @arg @ref FL_ADC_EXTERNAL_CH11 + * @arg @ref FL_ADC_EXTERNAL_CH12 + * @arg @ref FL_ADC_EXTERNAL_CH13 + * @arg @ref FL_ADC_EXTERNAL_CH14 + * @arg @ref FL_ADC_EXTERNAL_CH15 + * @arg @ref FL_ADC_EXTERNAL_CH16 + * @arg @ref FL_ADC_EXTERNAL_CH17 + * @arg @ref FL_ADC_EXTERNAL_CH18 + * @arg @ref FL_ADC_EXTERNAL_CH19 + * @arg @ref FL_ADC_INTERNAL_VREF1P2 + * @arg @ref FL_ADC_INTERNAL_TS + * @arg @ref FL_ADC_INTERNAL_AVREF + * @arg @ref FL_ADC_INTERNAL_VBAT_DIV3 + * @arg @ref FL_ADC_INTERNAL_VDD_DIV3 + * @arg @ref FL_ADC_INTERNAL_DAC + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableSequencerChannel(ADC_Type *ADCx, uint32_t channel) +{ + CLEAR_BIT(ADCx->CHER, ((channel & 0x7fffffff) << 0x0U)); +} + +/** + * @brief Get ADC Channel Enable Status + * @rmtoll CHER FL_ADC_IsEnabledSequencerChannel + * @param ADCx ADC instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ADC_EXTERNAL_CH0 + * @arg @ref FL_ADC_EXTERNAL_CH1 + * @arg @ref FL_ADC_EXTERNAL_CH2 + * @arg @ref FL_ADC_EXTERNAL_CH3 + * @arg @ref FL_ADC_EXTERNAL_CH4 + * @arg @ref FL_ADC_EXTERNAL_CH5 + * @arg @ref FL_ADC_EXTERNAL_CH6 + * @arg @ref FL_ADC_EXTERNAL_CH7 + * @arg @ref FL_ADC_EXTERNAL_CH8 + * @arg @ref FL_ADC_EXTERNAL_CH9 + * @arg @ref FL_ADC_EXTERNAL_CH10 + * @arg @ref FL_ADC_EXTERNAL_CH11 + * @arg @ref FL_ADC_EXTERNAL_CH12 + * @arg @ref FL_ADC_EXTERNAL_CH13 + * @arg @ref FL_ADC_EXTERNAL_CH14 + * @arg @ref FL_ADC_EXTERNAL_CH15 + * @arg @ref FL_ADC_EXTERNAL_CH16 + * @arg @ref FL_ADC_EXTERNAL_CH17 + * @arg @ref FL_ADC_EXTERNAL_CH18 + * @arg @ref FL_ADC_EXTERNAL_CH19 + * @arg @ref FL_ADC_INTERNAL_VREF1P2 + * @arg @ref FL_ADC_INTERNAL_TS + * @arg @ref FL_ADC_INTERNAL_AVREF + * @arg @ref FL_ADC_INTERNAL_VBAT_DIV3 + * @arg @ref FL_ADC_INTERNAL_VDD_DIV3 + * @arg @ref FL_ADC_INTERNAL_DAC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledSequencerChannel(ADC_Type *ADCx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(ADCx->CHER, ((channel & 0x7fffffff) << 0x0U)) == ((channel & 0x7fffffff) << 0x0U)); +} + +/** + * @brief Enable ADC Differential Channel + * @rmtoll DCR FL_ADC_EnableDifferentialChannel + * @param ADCx ADC instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP0 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP1 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP2 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP3 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP4 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP5 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP6 + * @retval None + */ +__STATIC_INLINE void FL_ADC_EnableDifferentialChannel(ADC_Type *ADCx, uint32_t channel) +{ + SET_BIT(ADCx->DCR, ((channel & 0x7f) << 0x0U)); +} + +/** + * @brief Disable ADC Differential Channel + * @rmtoll DCR FL_ADC_DisableDifferentialChannel + * @param ADCx ADC instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP0 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP1 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP2 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP3 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP4 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP5 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP6 + * @retval None + */ +__STATIC_INLINE void FL_ADC_DisableDifferentialChannel(ADC_Type *ADCx, uint32_t channel) +{ + CLEAR_BIT(ADCx->DCR, ((channel & 0x7f) << 0x0U)); +} + +/** + * @brief Get ADC Differential Channel Enable Status + * @rmtoll DCR FL_ADC_IsEnabledDifferentialChannel + * @param ADCx ADC instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP0 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP1 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP2 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP3 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP4 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP5 + * @arg @ref FL_ADC_DIFFERENTIAL_GROUP6 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ADC_IsEnabledDifferentialChannel(ADC_Type *ADCx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(ADCx->DCR, ((channel & 0x7f) << 0x0U)) == ((channel & 0x7f) << 0x0U)); +} + +/** + * @brief Get ADC Conversion Data + * @rmtoll DR DATA FL_ADC_ReadConversionData + * @param ADCx ADC instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ADC_ReadConversionData(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->DR, (0xffffU << 0U)) >> 0U); +} + +/** + * @brief Write ADC Analog Watchdog Under Low + * @rmtoll HLTR AWD_LT FL_ADC_WriteAnalogWDGLowThreshold + * @param ADCx ADC instance + * @param threshold + * @retval None + */ +__STATIC_INLINE void FL_ADC_WriteAnalogWDGLowThreshold(ADC_Type *ADCx, uint32_t threshold) +{ + MODIFY_REG(ADCx->HLTR, (0xffffU << 0U), (threshold << 0U)); +} + +/** + * @brief Read ADC Analog Watchdog Under Low + * @rmtoll HLTR AWD_LT FL_ADC_ReadAnalogWDGLowThreshold + * @param ADCx ADC instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ADC_ReadAnalogWDGLowThreshold(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->HLTR, (0xffffU << 0U)) >> 0U); +} + +/** + * @brief Write ADC Analog Watchdog Above High + * @rmtoll HLTR AWD_HT FL_ADC_WriteAnalogWDGHighThreshold + * @param ADCx ADC instance + * @param threshold + * @retval None + */ +__STATIC_INLINE void FL_ADC_WriteAnalogWDGHighThreshold(ADC_Type *ADCx, uint32_t threshold) +{ + MODIFY_REG(ADCx->HLTR, (0xffffU << 16U), (threshold << 16U)); +} + +/** + * @brief Read ADC Analog Watchdog Above High + * @rmtoll HLTR AWD_HT FL_ADC_ReadAnalogWDGHighThreshold + * @param ADCx ADC instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ADC_ReadAnalogWDGHighThreshold(ADC_Type *ADCx) +{ + return (uint32_t)(READ_BIT(ADCx->HLTR, (0xffffU << 16U)) >> 16U); +} + +/** + * @} + */ + +/** @defgroup ADC_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_ADC_CommonDeInit(void); +FL_ErrorStatus FL_ADC_DeInit(ADC_Type *ADCx); +uint32_t GetActualVddaVoltage(ADC_Type *ADCx); +void FL_ADC_StructInit(FL_ADC_InitTypeDef *ADC_InitStruct); +FL_ErrorStatus FL_ADC_Init(ADC_Type *ADCx, FL_ADC_InitTypeDef *ADC_InitStruct); +void FL_ADC_CommonStructInit(FL_ADC_CommonInitTypeDef *ADC_CommonInitStruct); +FL_ErrorStatus FL_ADC_CommonInit(FL_ADC_CommonInitTypeDef *ADC_CommonInitStruct); + +/** + * @} + */ + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_ADC_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.1 @ 2022-05-09*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_aes.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_aes.h new file mode 100644 index 0000000..99aded3 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_aes.h @@ -0,0 +1,760 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_aes.h + * @author FMSH Application Team + * @brief Head file of AES FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_AES_H +#define __FM33LG0XX_FL_AES_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup AES AES + * @brief AES FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup AES_FL_ES_INIT AES Exported Init structures + * @{ + */ + +/** + * @brief FL AES Init Sturcture definition + */ +typedef struct +{ + /* 秘钥长度 */ + uint32_t keyLength; + /* 数据流处理模式 */ + uint32_t cipherMode; + /* AES工作模式 */ + uint32_t operationMode; + /* 输入数据类型 */ + uint32_t dataType; + +} FL_AES_InitTypeDef; +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup AES_FL_Exported_Constants AES Exported Constants + * @{ + */ + +#define AES_CR_KEYLEN_Pos (13U) +#define AES_CR_KEYLEN_Msk (0x3U << AES_CR_KEYLEN_Pos) +#define AES_CR_KEYLEN AES_CR_KEYLEN_Msk + +#define AES_CR_DMAOEN_Pos (12U) +#define AES_CR_DMAOEN_Msk (0x1U << AES_CR_DMAOEN_Pos) +#define AES_CR_DMAOEN AES_CR_DMAOEN_Msk + +#define AES_CR_DMAIEN_Pos (11U) +#define AES_CR_DMAIEN_Msk (0x1U << AES_CR_DMAIEN_Pos) +#define AES_CR_DMAIEN AES_CR_DMAIEN_Msk + +#define AES_CR_IVRSWAP_Pos (9U) +#define AES_CR_IVRSWAP_Msk (0x3U << AES_CR_IVRSWAP_Pos) +#define AES_CR_IVRSWAP AES_CR_IVRSWAP_Msk + +#define AES_CR_CHMOD_Pos (5U) +#define AES_CR_CHMOD_Msk (0x3U << AES_CR_CHMOD_Pos) +#define AES_CR_CHMOD AES_CR_CHMOD_Msk + +#define AES_CR_MODE_Pos (3U) +#define AES_CR_MODE_Msk (0x3U << AES_CR_MODE_Pos) +#define AES_CR_MODE AES_CR_MODE_Msk + +#define AES_CR_DATATYP_Pos (1U) +#define AES_CR_DATATYP_Msk (0x3U << AES_CR_DATATYP_Pos) +#define AES_CR_DATATYP AES_CR_DATATYP_Msk + +#define AES_CR_EN_Pos (0U) +#define AES_CR_EN_Msk (0x1U << AES_CR_EN_Pos) +#define AES_CR_EN AES_CR_EN_Msk + +#define AES_IER_WRERR_IE_Pos (2U) +#define AES_IER_WRERR_IE_Msk (0x1U << AES_IER_WRERR_IE_Pos) +#define AES_IER_WRERR_IE AES_IER_WRERR_IE_Msk + +#define AES_IER_RDERR_IE_Pos (1U) +#define AES_IER_RDERR_IE_Msk (0x1U << AES_IER_RDERR_IE_Pos) +#define AES_IER_RDERR_IE AES_IER_RDERR_IE_Msk + +#define AES_IER_CCF_IE_Pos (0U) +#define AES_IER_CCF_IE_Msk (0x1U << AES_IER_CCF_IE_Pos) +#define AES_IER_CCF_IE AES_IER_CCF_IE_Msk + +#define AES_ISR_WRERR_Pos (2U) +#define AES_ISR_WRERR_Msk (0x1U << AES_ISR_WRERR_Pos) +#define AES_ISR_WRERR AES_ISR_WRERR_Msk + +#define AES_ISR_RDERR_Pos (1U) +#define AES_ISR_RDERR_Msk (0x1U << AES_ISR_RDERR_Pos) +#define AES_ISR_RDERR AES_ISR_RDERR_Msk + +#define AES_ISR_CCF_Pos (0U) +#define AES_ISR_CCF_Msk (0x1U << AES_ISR_CCF_Pos) +#define AES_ISR_CCF AES_ISR_CCF_Msk + + + +#define FL_AES_KEY0_OFFSET (0x0U << 0U) +#define FL_AES_KEY1_OFFSET (0x1U << 0U) +#define FL_AES_KEY2_OFFSET (0x2U << 0U) +#define FL_AES_KEY3_OFFSET (0x3U << 0U) +#define FL_AES_KEY4_OFFSET (0x4U << 0U) +#define FL_AES_KEY5_OFFSET (0x5U << 0U) +#define FL_AES_KEY6_OFFSET (0x6U << 0U) +#define FL_AES_KEY7_OFFSET (0x7U << 0U) +#define FL_AES_IVR0_OFFSET (0x0U << 0U) +#define FL_AES_IVR1_OFFSET (0x1U << 0U) +#define FL_AES_IVR2_OFFSET (0x2U << 0U) +#define FL_AES_IVR3_OFFSET (0x3U << 0U) +#define FL_AES_H0_OFFSET (0x0U << 0U) +#define FL_AES_H1_OFFSET (0x1U << 0U) +#define FL_AES_H2_OFFSET (0x2U << 0U) +#define FL_AES_H3_OFFSET (0x3U << 0U) + + + +#define FL_AES_KEY_LENGTH_128B (0x0U << AES_CR_KEYLEN_Pos) +#define FL_AES_KEY_LENGTH_192B (0x1U << AES_CR_KEYLEN_Pos) +#define FL_AES_KEY_LENGTH_256B (0x2U << AES_CR_KEYLEN_Pos) + + +#define FL_AES_IVR_SWAP_32B (0x0U << AES_CR_IVRSWAP_Pos) +#define FL_AES_IVR_SWAP_16B (0x1U << AES_CR_IVRSWAP_Pos) +#define FL_AES_IVR_SWAP_8B (0x2U << AES_CR_IVRSWAP_Pos) +#define FL_AES_IVR_SWAP_1B (0x3U << AES_CR_IVRSWAP_Pos) + + +#define FL_AES_CIPHER_ECB (0x0U << AES_CR_CHMOD_Pos) +#define FL_AES_CIPHER_CBC (0x1U << AES_CR_CHMOD_Pos) +#define FL_AES_CIPHER_CTR (0x2U << AES_CR_CHMOD_Pos) +#define FL_AES_CIPHER_MULTH (0x3U << AES_CR_CHMOD_Pos) + + +#define FL_AES_OPERATION_MODE_ENCRYPTION (0x0U << AES_CR_MODE_Pos) +#define FL_AES_OPERATION_MODE_KEYDERIVATION (0x1U << AES_CR_MODE_Pos) +#define FL_AES_OPERATION_MODE_DECRYPTION (0x2U << AES_CR_MODE_Pos) +#define FL_AES_OPERATION_MODE_KEYDERIVATION_DECRYPTION (0x3U << AES_CR_MODE_Pos) + + +#define FL_AES_DATA_TYPE_32B (0x0U << AES_CR_DATATYP_Pos) +#define FL_AES_DATA_TYPE_16B (0x1U << AES_CR_DATATYP_Pos) +#define FL_AES_DATA_TYPE_8B (0x2U << AES_CR_DATATYP_Pos) +#define FL_AES_DATA_TYPE_1B (0x3U << AES_CR_DATATYP_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup AES_FL_Exported_Functions AES Exported Functions + * @{ + */ + +/** + * @brief Set key size selection + * @rmtoll CR KEYLEN FL_AES_SetKeySize + * @param AESx AES instance + * @param keySize This parameter can be one of the following values: + * @arg @ref FL_AES_KEY_LENGTH_128B + * @arg @ref FL_AES_KEY_LENGTH_192B + * @arg @ref FL_AES_KEY_LENGTH_256B + * @retval None + */ +__STATIC_INLINE void FL_AES_SetKeySize(AES_Type *AESx, uint32_t keySize) +{ + MODIFY_REG(AESx->CR, AES_CR_KEYLEN_Msk, keySize); +} + +/** + * @brief Get key size selection + * @rmtoll CR KEYLEN FL_AES_GetKeySize + * @param AESx AES instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_AES_KEY_LENGTH_128B + * @arg @ref FL_AES_KEY_LENGTH_192B + * @arg @ref FL_AES_KEY_LENGTH_256B + */ +__STATIC_INLINE uint32_t FL_AES_GetKeySize(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->CR, AES_CR_KEYLEN_Msk)); +} + +/** + * @brief DMA output enable + * @rmtoll CR DMAOEN FL_AES_EnableDMAReq_Output + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_EnableDMAReq_Output(AES_Type *AESx) +{ + SET_BIT(AESx->CR, AES_CR_DMAOEN_Msk); +} + +/** + * @brief DMA output enable status + * @rmtoll CR DMAOEN FL_AES_IsEnabledDMAReq_Output + * @param AESx AES instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_AES_IsEnabledDMAReq_Output(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->CR, AES_CR_DMAOEN_Msk) == AES_CR_DMAOEN_Msk); +} + +/** + * @brief DMA output disable + * @rmtoll CR DMAOEN FL_AES_DisableDMAReq_Output + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_DisableDMAReq_Output(AES_Type *AESx) +{ + CLEAR_BIT(AESx->CR, AES_CR_DMAOEN_Msk); +} + +/** + * @brief DMA input enable + * @rmtoll CR DMAIEN FL_AES_EnableDMAReq_Input + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_EnableDMAReq_Input(AES_Type *AESx) +{ + SET_BIT(AESx->CR, AES_CR_DMAIEN_Msk); +} + +/** + * @brief DMA input enable status + * @rmtoll CR DMAIEN FL_AES_IsEnabledDMAReq_Input + * @param AESx AES instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_AES_IsEnabledDMAReq_Input(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->CR, AES_CR_DMAIEN_Msk) == AES_CR_DMAIEN_Msk); +} + +/** + * @brief DMA input disable + * @rmtoll CR DMAIEN FL_AES_DisableDMAReq_Input + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_DisableDMAReq_Input(AES_Type *AESx) +{ + CLEAR_BIT(AESx->CR, AES_CR_DMAIEN_Msk); +} + +/** + * @brief Set IVR register read out swapping + * @rmtoll CR IVRSWAP FL_AES_SetIVRSwapType + * @param AESx AES instance + * @param type This parameter can be one of the following values: + * @arg @ref FL_AES_IVR_SWAP_32B + * @arg @ref FL_AES_IVR_SWAP_16B + * @arg @ref FL_AES_IVR_SWAP_8B + * @arg @ref FL_AES_IVR_SWAP_1B + * @retval None + */ +__STATIC_INLINE void FL_AES_SetIVRSwapType(AES_Type *AESx, uint32_t type) +{ + MODIFY_REG(AESx->CR, AES_CR_IVRSWAP_Msk, type); +} + +/** + * @brief Get IVR register read out swapping + * @rmtoll CR IVRSWAP FL_AES_GetIVRSwapType + * @param AESx AES instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_AES_IVR_SWAP_32B + * @arg @ref FL_AES_IVR_SWAP_16B + * @arg @ref FL_AES_IVR_SWAP_8B + * @arg @ref FL_AES_IVR_SWAP_1B + */ +__STATIC_INLINE uint32_t FL_AES_GetIVRSwapType(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->CR, AES_CR_IVRSWAP_Msk)); +} + +/** + * @brief Set cipher mode + * @rmtoll CR CHMOD FL_AES_SetCipherMode + * @param AESx AES instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_AES_CIPHER_ECB + * @arg @ref FL_AES_CIPHER_CBC + * @arg @ref FL_AES_CIPHER_CTR + * @arg @ref FL_AES_CIPHER_MULTH + * @retval None + */ +__STATIC_INLINE void FL_AES_SetCipherMode(AES_Type *AESx, uint32_t mode) +{ + MODIFY_REG(AESx->CR, AES_CR_CHMOD_Msk, mode); +} + +/** + * @brief Get cipher mode + * @rmtoll CR CHMOD FL_AES_GetCipherMode + * @param AESx AES instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_AES_CIPHER_ECB + * @arg @ref FL_AES_CIPHER_CBC + * @arg @ref FL_AES_CIPHER_CTR + * @arg @ref FL_AES_CIPHER_MULTH + */ +__STATIC_INLINE uint32_t FL_AES_GetCipherMode(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->CR, AES_CR_CHMOD_Msk)); +} + +/** + * @brief Set operation mode + * @rmtoll CR MODE FL_AES_SetOperationMode + * @param AESx AES instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_AES_OPERATION_MODE_ENCRYPTION + * @arg @ref FL_AES_OPERATION_MODE_KEYDERIVATION + * @arg @ref FL_AES_OPERATION_MODE_DECRYPTION + * @arg @ref FL_AES_OPERATION_MODE_KEYDERIVATION_DECRYPTION + * @retval None + */ +__STATIC_INLINE void FL_AES_SetOperationMode(AES_Type *AESx, uint32_t mode) +{ + MODIFY_REG(AESx->CR, AES_CR_MODE_Msk, mode); +} + +/** + * @brief Get operation mode + * @rmtoll CR MODE FL_AES_GetOperationMode + * @param AESx AES instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_AES_OPERATION_MODE_ENCRYPTION + * @arg @ref FL_AES_OPERATION_MODE_KEYDERIVATION + * @arg @ref FL_AES_OPERATION_MODE_DECRYPTION + * @arg @ref FL_AES_OPERATION_MODE_KEYDERIVATION_DECRYPTION + */ +__STATIC_INLINE uint32_t FL_AES_GetOperationMode(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->CR, AES_CR_MODE_Msk)); +} + +/** + * @brief Set data type selection + * @rmtoll CR DATATYP FL_AES_SetDataType + * @param AESx AES instance + * @param rule This parameter can be one of the following values: + * @arg @ref FL_AES_DATA_TYPE_32B + * @arg @ref FL_AES_DATA_TYPE_16B + * @arg @ref FL_AES_DATA_TYPE_8B + * @arg @ref FL_AES_DATA_TYPE_1B + * @retval None + */ +__STATIC_INLINE void FL_AES_SetDataType(AES_Type *AESx, uint32_t rule) +{ + MODIFY_REG(AESx->CR, AES_CR_DATATYP_Msk, rule); +} + +/** + * @brief Get data type selection + * @rmtoll CR DATATYP FL_AES_GetDataType + * @param AESx AES instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_AES_DATA_TYPE_32B + * @arg @ref FL_AES_DATA_TYPE_16B + * @arg @ref FL_AES_DATA_TYPE_8B + * @arg @ref FL_AES_DATA_TYPE_1B + */ +__STATIC_INLINE uint32_t FL_AES_GetDataType(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->CR, AES_CR_DATATYP_Msk)); +} + +/** + * @brief AES enable + * @rmtoll CR EN FL_AES_Enable + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_Enable(AES_Type *AESx) +{ + SET_BIT(AESx->CR, AES_CR_EN_Msk); +} + +/** + * @brief Get AES enable status + * @rmtoll CR EN FL_AES_IsEnabled + * @param AESx AES instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_AES_IsEnabled(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->CR, AES_CR_EN_Msk) == AES_CR_EN_Msk); +} + +/** + * @brief AES disable + * @rmtoll CR EN FL_AES_Disable + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_Disable(AES_Type *AESx) +{ + CLEAR_BIT(AESx->CR, AES_CR_EN_Msk); +} + +/** + * @brief Write error interrupt enable + * @rmtoll IER WRERR_IE FL_AES_EnableIT_WriteError + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_EnableIT_WriteError(AES_Type *AESx) +{ + SET_BIT(AESx->IER, AES_IER_WRERR_IE_Msk); +} + +/** + * @brief Get write error interrupt enable status + * @rmtoll IER WRERR_IE FL_AES_IsEnabledIT_WriteError + * @param AESx AES instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_AES_IsEnabledIT_WriteError(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->IER, AES_IER_WRERR_IE_Msk) == AES_IER_WRERR_IE_Msk); +} + +/** + * @brief Write error interrupt disable + * @rmtoll IER WRERR_IE FL_AES_DisableIT_WriteError + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_DisableIT_WriteError(AES_Type *AESx) +{ + CLEAR_BIT(AESx->IER, AES_IER_WRERR_IE_Msk); +} + +/** + * @brief Read error interrupt enable + * @rmtoll IER RDERR_IE FL_AES_EnableIT_ReadError + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_EnableIT_ReadError(AES_Type *AESx) +{ + SET_BIT(AESx->IER, AES_IER_RDERR_IE_Msk); +} + +/** + * @brief Get read Error interrupt enable status + * @rmtoll IER RDERR_IE FL_AES_IsEnabledIT_ReadError + * @param AESx AES instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_AES_IsEnabledIT_ReadError(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->IER, AES_IER_RDERR_IE_Msk) == AES_IER_RDERR_IE_Msk); +} + +/** + * @brief Read error interrupt disable + * @rmtoll IER RDERR_IE FL_AES_DisableIT_ReadError + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_DisableIT_ReadError(AES_Type *AESx) +{ + CLEAR_BIT(AESx->IER, AES_IER_RDERR_IE_Msk); +} + +/** + * @brief Cipher complete interrupt enable + * @rmtoll IER CCF_IE FL_AES_EnableIT_Complete + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_EnableIT_Complete(AES_Type *AESx) +{ + SET_BIT(AESx->IER, AES_IER_CCF_IE_Msk); +} + +/** + * @brief Get cipher complete interrupt enable status + * @rmtoll IER CCF_IE FL_AES_IsEnabledIT_Complete + * @param AESx AES instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_AES_IsEnabledIT_Complete(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->IER, AES_IER_CCF_IE_Msk) == AES_IER_CCF_IE_Msk); +} + +/** + * @brief Cipher complete interrupt disable + * @rmtoll IER CCF_IE FL_AES_DisableIT_Complete + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_DisableIT_Complete(AES_Type *AESx) +{ + CLEAR_BIT(AESx->IER, AES_IER_CCF_IE_Msk); +} + +/** + * @brief Get write error flag + * @rmtoll ISR WRERR FL_AES_IsActiveFlag_WriteError + * @param AESx AES instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_AES_IsActiveFlag_WriteError(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->ISR, AES_ISR_WRERR_Msk) == (AES_ISR_WRERR_Msk)); +} + +/** + * @brief Clear write error flag + * @rmtoll ISR WRERR FL_AES_ClearFlag_WriteError + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_ClearFlag_WriteError(AES_Type *AESx) +{ + WRITE_REG(AESx->ISR, AES_ISR_WRERR_Msk); +} + +/** + * @brief Get read error flag + * @rmtoll ISR RDERR FL_AES_IsActiveFlag_ReadError + * @param AESx AES instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_AES_IsActiveFlag_ReadError(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->ISR, AES_ISR_RDERR_Msk) == (AES_ISR_RDERR_Msk)); +} + +/** + * @brief Clear read error flag + * @rmtoll ISR RDERR FL_AES_ClearFlag_ReadError + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_ClearFlag_ReadError(AES_Type *AESx) +{ + WRITE_REG(AESx->ISR, AES_ISR_RDERR_Msk); +} + +/** + * @brief Get cipher complete flag + * @rmtoll ISR CCF FL_AES_IsActiveFlag_Complete + * @param AESx AES instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_AES_IsActiveFlag_Complete(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->ISR, AES_ISR_CCF_Msk) == (AES_ISR_CCF_Msk)); +} + +/** + * @brief Clear cipher complete flag + * @rmtoll ISR CCF FL_AES_ClearFlag_Complete + * @param AESx AES instance + * @retval None + */ +__STATIC_INLINE void FL_AES_ClearFlag_Complete(AES_Type *AESx) +{ + WRITE_REG(AESx->ISR, AES_ISR_CCF_Msk); +} + +/** + * @brief Write AES data input register + * @rmtoll DIR FL_AES_WriteInputData + * @param AESx AES instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_AES_WriteInputData(AES_Type *AESx, uint32_t data) +{ + MODIFY_REG(AESx->DIR, (0xffffffffU << 0U), (data << 0U)); +} + +/** + * @brief Read AES data output register + * @rmtoll DOR FL_AES_ReadOutputData + * @param AESx AES instance + * @retval + */ +__STATIC_INLINE uint32_t FL_AES_ReadOutputData(AES_Type *AESx) +{ + return (uint32_t)(READ_BIT(AESx->DOR, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Set key registers + * @rmtoll KEY0 FL_AES_WriteKeys + * @param AESx AES instance + * @param offset This parameter can be one of the following values: + * @arg @ref FL_AES_KEY0_OFFSET + * @arg @ref FL_AES_KEY1_OFFSET + * @arg @ref FL_AES_KEY2_OFFSET + * @arg @ref FL_AES_KEY3_OFFSET + * @arg @ref FL_AES_KEY4_OFFSET + * @arg @ref FL_AES_KEY5_OFFSET + * @arg @ref FL_AES_KEY6_OFFSET + * @arg @ref FL_AES_KEY7_OFFSET + * @param data + * @retval None + */ +__STATIC_INLINE void FL_AES_WriteKeys(AES_Type *AESx, uint32_t offset, uint32_t data) +{ + WRITE_REG(*((&AESx->KEY0) + offset), data); +} + +/** + * @brief Get key registers + * @rmtoll KEY0 FL_AES_ReadKeys + * @param AESx AES instance + * @param offset This parameter can be one of the following values: + * @arg @ref FL_AES_KEY0_OFFSET + * @arg @ref FL_AES_KEY1_OFFSET + * @arg @ref FL_AES_KEY2_OFFSET + * @arg @ref FL_AES_KEY3_OFFSET + * @arg @ref FL_AES_KEY4_OFFSET + * @arg @ref FL_AES_KEY5_OFFSET + * @arg @ref FL_AES_KEY6_OFFSET + * @arg @ref FL_AES_KEY7_OFFSET + * @retval + */ +__STATIC_INLINE uint32_t FL_AES_ReadKeys(AES_Type *AESx, uint32_t offset) +{ + return (uint32_t)READ_REG(*((&AESx->KEY0) + offset)); +} + +/** + * @brief Write initialization vector registers + * @rmtoll DIR FL_AES_WriteIVR + * @param AESx AES instance + * @param offset This parameter can be one of the following values: + * @arg @ref FL_AES_IVR0_OFFSET + * @arg @ref FL_AES_IVR1_OFFSET + * @arg @ref FL_AES_IVR2_OFFSET + * @arg @ref FL_AES_IVR3_OFFSET + * @param data + * @retval None + */ +__STATIC_INLINE void FL_AES_WriteIVR(AES_Type *AESx, uint32_t offset, uint32_t data) +{ + WRITE_REG(*((&AESx->IVR0) + offset), data); +} + +/** + * @brief Read initialization vector registers + * @rmtoll DOR FL_AES_ReadIVR + * @param AESx AES instance + * @param offset This parameter can be one of the following values: + * @arg @ref FL_AES_IVR0_OFFSET + * @arg @ref FL_AES_IVR1_OFFSET + * @arg @ref FL_AES_IVR2_OFFSET + * @arg @ref FL_AES_IVR3_OFFSET + * @retval + */ +__STATIC_INLINE uint32_t FL_AES_ReadIVR(AES_Type *AESx, uint32_t offset) +{ + return (uint32_t)READ_REG(*((&AESx->IVR0) + offset)); +} + +/** + * @brief Set AES MultH parameter Register + * @rmtoll H0 FL_AES_WriteHParams + * @param AESx AES instance + * @param offset This parameter can be one of the following values: + * @arg @ref FL_AES_H0_OFFSET + * @arg @ref FL_AES_H1_OFFSET + * @arg @ref FL_AES_H2_OFFSET + * @arg @ref FL_AES_H3_OFFSET + * @param data + * @retval None + */ +__STATIC_INLINE void FL_AES_WriteHParams(AES_Type *AESx, uint32_t offset, uint32_t data) +{ + WRITE_REG(*((&AESx->H0) + offset), data); +} + +/** + * @brief Get AES MultH parameter Register + * @rmtoll H0 FL_AES_ReadHParams + * @param AESx AES instance + * @param offset This parameter can be one of the following values: + * @arg @ref FL_AES_H0_OFFSET + * @arg @ref FL_AES_H1_OFFSET + * @arg @ref FL_AES_H2_OFFSET + * @arg @ref FL_AES_H3_OFFSET + * @retval + */ +__STATIC_INLINE uint32_t FL_AES_ReadHParams(AES_Type *AESx, uint32_t offset) +{ + return (uint32_t)READ_REG(*((&AESx->H0) + offset)); +} + +/** + * @} + */ + +/** @defgroup AES_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_AES_DeInit(void); +void FL_AES_StructInit(FL_AES_InitTypeDef *AES_InitStructer); +FL_ErrorStatus FL_AES_Init(AES_Type *AESx, FL_AES_InitTypeDef *AES_InitStructer); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_AES_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-14*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_atim.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_atim.h new file mode 100644 index 0000000..945f17f --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_atim.h @@ -0,0 +1,3749 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_atim.h + * @author FMSH Application Team + * @brief Head file of ATIM FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_ATIM_H +#define __FM33LG0XX_FL_ATIM_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup ATIM ATIM + * @brief ATIM FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup ATIM_FL_ES_INIT ATIM Exported Init structures + * @{ + */ + +/** + * @brief FL ATIM Init Sturcture definition + */ + +typedef struct +{ + /*! 时钟源选择 */ + uint32_t clockSource; + /*! 预分频系数 */ + uint32_t prescaler; + /*! 计数模式 */ + uint32_t counterMode; + /*! 自动重装载值 */ + uint32_t autoReload; + /*! 预装载使能 */ + uint32_t autoReloadState; + /*! 定时器分频系数与数字滤波器所使用的采样时钟分频比 */ + uint32_t clockDivision; + /*! 重复计数次数 */ + uint32_t repetitionCounter; + +} FL_ATIM_InitTypeDef; + + +typedef struct +{ + + /*! 外部时钟源模式 */ + uint32_t slaveMode; + /*! 输入触发信号选择 */ + uint32_t triggerSrc; + /*! Trigger 延迟*/ + uint32_t triggerDelay; + +} FL_ATIM_SlaveInitTypeDef; + +/** + * @brief TIM ETR configuration structure definition. + */ + +typedef struct +{ + /*! 外部触发使能 */ + uint32_t useExternalTrigger; + /*! 外部时钟滤波 */ + uint32_t ETRFilter; + /*! 外部时钟分频 */ + uint32_t ETRClockDivision; + /*! 外部时钟触发极性 */ + uint32_t ETRPolarity; + +} FL_ATIM_ETR_InitTypeDef; + +/** + * @brief TIM Output Compare configuration structure definition. + */ +typedef struct +{ + /*! 比较输出模式 */ + uint32_t OCMode; + /*! 正向比较通道输出使能 */ + uint32_t OCState; + /*! 比较互补通道输出使能 */ + uint32_t OCNState; + /*! 比较输出极性 */ + uint32_t OCPolarity; + /*! 比较互补输出极性 */ + uint32_t OCNPolarity; + /*! 比较输出通道快速模式使能 */ + uint32_t OCFastMode; + /*! 输出比较预装载 */ + uint32_t OCPreload; + /*! 通道比较值 */ + uint32_t compareValue; + /*! 输出空闲状态电平 */ + uint32_t OCIdleState; + /*! ETR清0使能 */ + uint32_t OCETRFStatus; + /*! 互补输出空闲状态电平 */ + uint32_t OCNIdleState; + +} FL_ATIM_OC_InitTypeDef; +/** + * @brief TIM Input Capture configuration structure definition. + */ + +typedef struct +{ + /*! 输入捕获使能 */ + uint32_t captureState; + /*! 输入捕获极性 */ + uint32_t ICPolarity; + /*! 通道映射激活的输入选择 */ + uint32_t ICActiveInput; + /*! 输入分频 */ + uint32_t ICPrescaler; + /*! 输入滤波 */ + uint32_t ICFilter; + +} FL_ATIM_IC_InitTypeDef; + +/** + * @brief BDTR (Break and Dead Time) structure definition + */ +typedef struct +{ + /*! 运行状态下的输出关闭状态 */ + uint32_t OSSRState; + /*! 空闲状态下的输出关闭状态 */ + uint32_t OSSIState; + /*! 寄存器写保护等级 */ + uint32_t lockLevel; + /*! 死区时间 */ + uint32_t deadTime; + /*! 刹车使能 */ + uint32_t breakState; + /*! 刹车信号滤波 */ + uint32_t breakFilter; + /*! 刹车信号极性 */ + uint32_t breakPolarity; + /*! 刹车后计数器重装后自动输出使能*/ + uint32_t automaticOutput; + /*! 刹车信号1门控 */ + uint32_t gatedBrakeSignal_1; + /*! 刹车信号2门控 */ + uint32_t gatedBrakeSignal_2; + /*! 两路刹车信号控制逻辑 */ + uint32_t brakeSignalCombined; + +} FL_ATIM_BDTR_InitTypeDef; +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup ATIM_FL_Exported_Constants ATIM Exported Constants + * @{ + */ + +#define ATIM_CR1_CKD_Pos (8U) +#define ATIM_CR1_CKD_Msk (0x3U << ATIM_CR1_CKD_Pos) +#define ATIM_CR1_CKD ATIM_CR1_CKD_Msk + +#define ATIM_CR1_ARPE_Pos (7U) +#define ATIM_CR1_ARPE_Msk (0x1U << ATIM_CR1_ARPE_Pos) +#define ATIM_CR1_ARPE ATIM_CR1_ARPE_Msk + +#define ATIM_CR1_CMS_Pos (5U) +#define ATIM_CR1_CMS_Msk (0x3U << ATIM_CR1_CMS_Pos) +#define ATIM_CR1_CMS ATIM_CR1_CMS_Msk + +#define ATIM_CR1_DIR_Pos (4U) +#define ATIM_CR1_DIR_Msk (0x1U << ATIM_CR1_DIR_Pos) +#define ATIM_CR1_DIR ATIM_CR1_DIR_Msk + +#define ATIM_CR1_OPM_Pos (3U) +#define ATIM_CR1_OPM_Msk (0x1U << ATIM_CR1_OPM_Pos) +#define ATIM_CR1_OPM ATIM_CR1_OPM_Msk + +#define ATIM_CR1_URS_Pos (2U) +#define ATIM_CR1_URS_Msk (0x1U << ATIM_CR1_URS_Pos) +#define ATIM_CR1_URS ATIM_CR1_URS_Msk + +#define ATIM_CR1_UDIS_Pos (1U) +#define ATIM_CR1_UDIS_Msk (0x1U << ATIM_CR1_UDIS_Pos) +#define ATIM_CR1_UDIS ATIM_CR1_UDIS_Msk + +#define ATIM_CR1_CEN_Pos (0U) +#define ATIM_CR1_CEN_Msk (0x1U << ATIM_CR1_CEN_Pos) +#define ATIM_CR1_CEN ATIM_CR1_CEN_Msk + +#define ATIM_CR2_OISN_Pos (9U) +#define ATIM_CR2_OISN_Msk (0x1U << ATIM_CR2_OISN_Pos) +#define ATIM_CR2_OISN ATIM_CR2_OISN_Msk + +#define ATIM_CR2_OIS_Pos (8U) +#define ATIM_CR2_OIS_Msk (0x1U << ATIM_CR2_OIS_Pos) +#define ATIM_CR2_OIS ATIM_CR2_OIS_Msk + +#define ATIM_CR2_TI1S_Pos (7U) +#define ATIM_CR2_TI1S_Msk (0x1U << ATIM_CR2_TI1S_Pos) +#define ATIM_CR2_TI1S ATIM_CR2_TI1S_Msk + +#define ATIM_CR2_MMS_Pos (4U) +#define ATIM_CR2_MMS_Msk (0x7U << ATIM_CR2_MMS_Pos) +#define ATIM_CR2_MMS ATIM_CR2_MMS_Msk + +#define ATIM_CR2_CCDS_Pos (3U) +#define ATIM_CR2_CCDS_Msk (0x1U << ATIM_CR2_CCDS_Pos) +#define ATIM_CR2_CCDS ATIM_CR2_CCDS_Msk + +#define ATIM_CR2_CCUS_Pos (2U) +#define ATIM_CR2_CCUS_Msk (0x1U << ATIM_CR2_CCUS_Pos) +#define ATIM_CR2_CCUS ATIM_CR2_CCUS_Msk + +#define ATIM_CR2_CCPC_Pos (0U) +#define ATIM_CR2_CCPC_Msk (0x1U << ATIM_CR2_CCPC_Pos) +#define ATIM_CR2_CCPC ATIM_CR2_CCPC_Msk + +#define ATIM_SMCR_ETP_Pos (15U) +#define ATIM_SMCR_ETP_Msk (0x1U << ATIM_SMCR_ETP_Pos) +#define ATIM_SMCR_ETP ATIM_SMCR_ETP_Msk + +#define ATIM_SMCR_ECE_Pos (14U) +#define ATIM_SMCR_ECE_Msk (0x1U << ATIM_SMCR_ECE_Pos) +#define ATIM_SMCR_ECE ATIM_SMCR_ECE_Msk + +#define ATIM_SMCR_ETPS_Pos (12U) +#define ATIM_SMCR_ETPS_Msk (0x3U << ATIM_SMCR_ETPS_Pos) +#define ATIM_SMCR_ETPS ATIM_SMCR_ETPS_Msk + +#define ATIM_SMCR_ETF_Pos (8U) +#define ATIM_SMCR_ETF_Msk (0xfU << ATIM_SMCR_ETF_Pos) +#define ATIM_SMCR_ETF ATIM_SMCR_ETF_Msk + +#define ATIM_SMCR_MSM_Pos (7U) +#define ATIM_SMCR_MSM_Msk (0x1U << ATIM_SMCR_MSM_Pos) +#define ATIM_SMCR_MSM ATIM_SMCR_MSM_Msk + +#define ATIM_SMCR_TS_Pos (4U) +#define ATIM_SMCR_TS_Msk (0x7U << ATIM_SMCR_TS_Pos) +#define ATIM_SMCR_TS ATIM_SMCR_TS_Msk + +#define ATIM_SMCR_SMS_Pos (0U) +#define ATIM_SMCR_SMS_Msk (0x7U << ATIM_SMCR_SMS_Pos) +#define ATIM_SMCR_SMS ATIM_SMCR_SMS_Msk + +#define ATIM_DIER_CC1BURSTEN_Pos (16U) +#define ATIM_DIER_CC1BURSTEN_Msk (0x1U << ATIM_DIER_CC1BURSTEN_Pos) +#define ATIM_DIER_CC1BURSTEN ATIM_DIER_CC1BURSTEN_Msk + +#define ATIM_DIER_CC2BURSTEN_Pos (17U) +#define ATIM_DIER_CC2BURSTEN_Msk (0x1U << ATIM_DIER_CC2BURSTEN_Pos) +#define ATIM_DIER_CC2BURSTEN ATIM_DIER_CC2BURSTEN_Msk + +#define ATIM_DIER_CC3BURSTEN_Pos (18U) +#define ATIM_DIER_CC3BURSTEN_Msk (0x1U << ATIM_DIER_CC3BURSTEN_Pos) +#define ATIM_DIER_CC3BURSTEN ATIM_DIER_CC3BURSTEN_Msk + +#define ATIM_DIER_CC4BURSTEN_Pos (19U) +#define ATIM_DIER_CC4BURSTEN_Msk (0x1U << ATIM_DIER_CC4BURSTEN_Pos) +#define ATIM_DIER_CC4BURSTEN ATIM_DIER_CC4BURSTEN_Msk + +#define ATIM_DIER_TDE_Pos (14U) +#define ATIM_DIER_TDE_Msk (0x1U << ATIM_DIER_TDE_Pos) +#define ATIM_DIER_TDE ATIM_DIER_TDE_Msk + +#define ATIM_DIER_COMDE_Pos (13U) +#define ATIM_DIER_COMDE_Msk (0x1U << ATIM_DIER_COMDE_Pos) +#define ATIM_DIER_COMDE ATIM_DIER_COMDE_Msk + +#define ATIM_DIER_CCDE_Pos (9U) +#define ATIM_DIER_CCDE_Msk (0x1U << ATIM_DIER_CCDE_Pos) +#define ATIM_DIER_CCDE ATIM_DIER_CCDE_Msk + +#define ATIM_DIER_UDE_Pos (8U) +#define ATIM_DIER_UDE_Msk (0x1U << ATIM_DIER_UDE_Pos) +#define ATIM_DIER_UDE ATIM_DIER_UDE_Msk + +#define ATIM_DIER_BIE_Pos (7U) +#define ATIM_DIER_BIE_Msk (0x1U << ATIM_DIER_BIE_Pos) +#define ATIM_DIER_BIE ATIM_DIER_BIE_Msk + +#define ATIM_DIER_TIE_Pos (6U) +#define ATIM_DIER_TIE_Msk (0x1U << ATIM_DIER_TIE_Pos) +#define ATIM_DIER_TIE ATIM_DIER_TIE_Msk + +#define ATIM_DIER_COMIE_Pos (5U) +#define ATIM_DIER_COMIE_Msk (0x1U << ATIM_DIER_COMIE_Pos) +#define ATIM_DIER_COMIE ATIM_DIER_COMIE_Msk + +#define ATIM_DIER_CCIE_Pos (1U) +#define ATIM_DIER_CCIE_Msk (0x1U << ATIM_DIER_CCIE_Pos) +#define ATIM_DIER_CCIE ATIM_DIER_CCIE_Msk + +#define ATIM_DIER_UIE_Pos (0U) +#define ATIM_DIER_UIE_Msk (0x1U << ATIM_DIER_UIE_Pos) +#define ATIM_DIER_UIE ATIM_DIER_UIE_Msk + +#define ATIM_ISR_CCOF_Pos (9U) +#define ATIM_ISR_CCOF_Msk (0x1U << ATIM_ISR_CCOF_Pos) +#define ATIM_ISR_CCOF ATIM_ISR_CCOF_Msk + +#define ATIM_ISR_BIF_Pos (7U) +#define ATIM_ISR_BIF_Msk (0x1U << ATIM_ISR_BIF_Pos) +#define ATIM_ISR_BIF ATIM_ISR_BIF_Msk + +#define ATIM_ISR_TIF_Pos (6U) +#define ATIM_ISR_TIF_Msk (0x1U << ATIM_ISR_TIF_Pos) +#define ATIM_ISR_TIF ATIM_ISR_TIF_Msk + +#define ATIM_ISR_COMIF_Pos (5U) +#define ATIM_ISR_COMIF_Msk (0x1U << ATIM_ISR_COMIF_Pos) +#define ATIM_ISR_COMIF ATIM_ISR_COMIF_Msk + +#define ATIM_ISR_CCIF_Pos (1U) +#define ATIM_ISR_CCIF_Msk (0x1U << ATIM_ISR_CCIF_Pos) +#define ATIM_ISR_CCIF ATIM_ISR_CCIF_Msk + +#define ATIM_ISR_UIF_Pos (0U) +#define ATIM_ISR_UIF_Msk (0x1U << ATIM_ISR_UIF_Pos) +#define ATIM_ISR_UIF ATIM_ISR_UIF_Msk + +#define ATIM_EGR_BG_Pos (7U) +#define ATIM_EGR_BG_Msk (0x1U << ATIM_EGR_BG_Pos) +#define ATIM_EGR_BG ATIM_EGR_BG_Msk + +#define ATIM_EGR_TG_Pos (6U) +#define ATIM_EGR_TG_Msk (0x1U << ATIM_EGR_TG_Pos) +#define ATIM_EGR_TG ATIM_EGR_TG_Msk + +#define ATIM_EGR_COMG_Pos (5U) +#define ATIM_EGR_COMG_Msk (0x1U << ATIM_EGR_COMG_Pos) +#define ATIM_EGR_COMG ATIM_EGR_COMG_Msk + +#define ATIM_EGR_CCG_Pos (1U) +#define ATIM_EGR_CCG_Msk (0x1U << ATIM_EGR_CCG_Pos) +#define ATIM_EGR_CCG ATIM_EGR_CCG_Msk + +#define ATIM_EGR_UG_Pos (0U) +#define ATIM_EGR_UG_Msk (0x1U << ATIM_EGR_UG_Pos) +#define ATIM_EGR_UG ATIM_EGR_UG_Msk + +#define ATIM_DCR_DBL_Pos (8U) +#define ATIM_DCR_DBL_Msk (0x1fU << ATIM_DCR_DBL_Pos) +#define ATIM_DCR_DBL ATIM_DCR_DBL_Msk + +#define ATIM_DCR_DBA_Pos (0U) +#define ATIM_DCR_DBA_Msk (0x1fU << ATIM_DCR_DBA_Pos) +#define ATIM_DCR_DBA ATIM_DCR_DBA_Msk + +#define ATIM_CCMR_OCCE_Pos (7U) +#define ATIM_CCMR_OCCE_Msk (0x1U << ATIM_CCMR_OCCE_Pos) +#define ATIM_CCMR_OCCE ATIM_CCMR_OCCE_Msk + +#define ATIM_CCMR_OCM_Pos (4U) +#define ATIM_CCMR_OCM_Msk (0x7U << ATIM_CCMR_OCM_Pos) +#define ATIM_CCMR_OCM ATIM_CCMR_OCM_Msk + +#define ATIM_CCMR_OCPE_Pos (3U) +#define ATIM_CCMR_OCPE_Msk (0x1U << ATIM_CCMR_OCPE_Pos) +#define ATIM_CCMR_OCPE ATIM_CCMR_OCPE_Msk + +#define ATIM_CCMR_OCFE_Pos (2U) +#define ATIM_CCMR_OCFE_Msk (0x1U << ATIM_CCMR_OCFE_Pos) +#define ATIM_CCMR_OCFE ATIM_CCMR_OCFE_Msk + +#define ATIM_CCMR_ICF_Pos (4U) +#define ATIM_CCMR_ICF_Msk (0xfU << ATIM_CCMR_ICF_Pos) +#define ATIM_CCMR_ICF ATIM_CCMR_ICF_Msk + +#define ATIM_CCMR_ICPSC_Pos (2U) +#define ATIM_CCMR_ICPSC_Msk (0x3U << ATIM_CCMR_ICPSC_Pos) +#define ATIM_CCMR_ICPSC ATIM_CCMR_ICPSC_Msk + +#define ATIM_CCMR_CCS_Pos (0U) +#define ATIM_CCMR_CCS_Msk (0x3U << ATIM_CCMR_CCS_Pos) +#define ATIM_CCMR_CCS ATIM_CCMR_CCS_Msk + +#define ATIM_CCER_CCNP_Pos (3U) +#define ATIM_CCER_CCNP_Msk (0x1U << ATIM_CCER_CCNP_Pos) +#define ATIM_CCER_CCNP ATIM_CCER_CCNP_Msk + +#define ATIM_CCER_CCNE_Pos (2U) +#define ATIM_CCER_CCNE_Msk (0x1U << ATIM_CCER_CCNE_Pos) +#define ATIM_CCER_CCNE ATIM_CCER_CCNE_Msk + +#define ATIM_CCER_CCOP_Pos (1U) +#define ATIM_CCER_CCOP_Msk (0x1U << ATIM_CCER_CCOP_Pos) +#define ATIM_CCER_CCOP ATIM_CCER_CCOP_Msk + +#define ATIM_CCER_CCIP_Pos (1U) +#define ATIM_CCER_CCIP_Msk (0x1U << ATIM_CCER_CCIP_Pos) +#define ATIM_CCER_CCIP ATIM_CCER_CCIP_Msk + +#define ATIM_CCER_CCOE_Pos (0U) +#define ATIM_CCER_CCOE_Msk (0x1U << ATIM_CCER_CCOE_Pos) +#define ATIM_CCER_CCOE ATIM_CCER_CCOE_Msk + +#define ATIM_CCER_CCIE_Pos (0U) +#define ATIM_CCER_CCIE_Msk (0x1U << ATIM_CCER_CCIE_Pos) +#define ATIM_CCER_CCIE ATIM_CCER_CCIE_Msk + +#define ATIM_BDTR_MOE_Pos (15U) +#define ATIM_BDTR_MOE_Msk (0x1U << ATIM_BDTR_MOE_Pos) +#define ATIM_BDTR_MOE ATIM_BDTR_MOE_Msk + +#define ATIM_BDTR_AOE_Pos (14U) +#define ATIM_BDTR_AOE_Msk (0x1U << ATIM_BDTR_AOE_Pos) +#define ATIM_BDTR_AOE ATIM_BDTR_AOE_Msk + +#define ATIM_BDTR_BKP_Pos (13U) +#define ATIM_BDTR_BKP_Msk (0x1U << ATIM_BDTR_BKP_Pos) +#define ATIM_BDTR_BKP ATIM_BDTR_BKP_Msk + +#define ATIM_BDTR_BKE_Pos (12U) +#define ATIM_BDTR_BKE_Msk (0x1U << ATIM_BDTR_BKE_Pos) +#define ATIM_BDTR_BKE ATIM_BDTR_BKE_Msk + +#define ATIM_BDTR_OSSR_Pos (11U) +#define ATIM_BDTR_OSSR_Msk (0x1U << ATIM_BDTR_OSSR_Pos) +#define ATIM_BDTR_OSSR ATIM_BDTR_OSSR_Msk + +#define ATIM_BDTR_OSSI_Pos (10U) +#define ATIM_BDTR_OSSI_Msk (0x1U << ATIM_BDTR_OSSI_Pos) +#define ATIM_BDTR_OSSI ATIM_BDTR_OSSI_Msk + +#define ATIM_BDTR_LOCK_Pos (8U) +#define ATIM_BDTR_LOCK_Msk (0x3U << ATIM_BDTR_LOCK_Pos) +#define ATIM_BDTR_LOCK ATIM_BDTR_LOCK_Msk + +#define ATIM_BDTR_DTG_Pos (0U) +#define ATIM_BDTR_DTG_Msk (0xffU << ATIM_BDTR_DTG_Pos) +#define ATIM_BDTR_DTG ATIM_BDTR_DTG_Msk + +#define ATIM_BKCR_BRK1GATE_Pos (8U) +#define ATIM_BKCR_BRK1GATE_Msk (0x1U << ATIM_BKCR_BRK1GATE_Pos) +#define ATIM_BKCR_BRK1GATE ATIM_BKCR_BRK1GATE_Msk + +#define ATIM_BKCR_BRK2GATE_Pos (9U) +#define ATIM_BKCR_BRK2GATE_Msk (0x1U << ATIM_BKCR_BRK2GATE_Pos) +#define ATIM_BKCR_BRK2GATE ATIM_BKCR_BRK2GATE_Msk + +#define ATIM_BKCR_BRKF_Pos (4U) +#define ATIM_BKCR_BRKF_Msk (0xfU << ATIM_BKCR_BRKF_Pos) +#define ATIM_BKCR_BRKF ATIM_BKCR_BRKF_Msk + +#define ATIM_BKCR_BRKCOMB_Pos (3U) +#define ATIM_BKCR_BRKCOMB_Msk (0x1U << ATIM_BKCR_BRKCOMB_Pos) +#define ATIM_BKCR_BRKCOMB ATIM_BKCR_BRKCOMB_Msk + +#define ATIM_BKCR_HFDET_BRKEN_Pos (2U) +#define ATIM_BKCR_HFDET_BRKEN_Msk (0x1U << ATIM_BKCR_HFDET_BRKEN_Pos) +#define ATIM_BKCR_HFDET_BRKEN ATIM_BKCR_HFDET_BRKEN_Msk + +#define ATIM_BKCR_SVD_BRKEN_Pos (1U) +#define ATIM_BKCR_SVD_BRKEN_Msk (0x1U << ATIM_BKCR_SVD_BRKEN_Pos) +#define ATIM_BKCR_SVD_BRKEN ATIM_BKCR_SVD_BRKEN_Msk + +#define ATIM_BKCR_COMP_BRKEN_Pos (0U) +#define ATIM_BKCR_COMP_BRKEN_Msk (0x1U << ATIM_BKCR_COMP_BRKEN_Pos) +#define ATIM_BKCR_COMP_BRKEN ATIM_BKCR_COMP_BRKEN_Msk + + + +#define FL_ATIM_CHANNEL_1 0x0U +#define FL_ATIM_CHANNEL_2 0x1U +#define FL_ATIM_CHANNEL_3 0x2U +#define FL_ATIM_CHANNEL_4 0x3U + + + +#define FL_ATIM_CLK_DIVISION_DIV1 (0x0U << ATIM_CR1_CKD_Pos) +#define FL_ATIM_CLK_DIVISION_DIV2 (0x1U << ATIM_CR1_CKD_Pos) +#define FL_ATIM_CLK_DIVISION_DIV4 (0x2U << ATIM_CR1_CKD_Pos) + + +#define FL_ATIM_COUNTER_ALIGNED_EDGE (0x0U << ATIM_CR1_CMS_Pos) +#define FL_ATIM_COUNTER_ALIGNED_CENTER_DOWN (0x1U << ATIM_CR1_CMS_Pos) +#define FL_ATIM_COUNTER_ALIGNED_CENTER_UP (0x2U << ATIM_CR1_CMS_Pos) +#define FL_ATIM_COUNTER_ALIGNED_CENTER_UP_DOWN (0x3U << ATIM_CR1_CMS_Pos) + + +#define FL_ATIM_COUNTER_DIR_UP (0x0U << ATIM_CR1_DIR_Pos) +#define FL_ATIM_COUNTER_DIR_DOWN (0x1U << ATIM_CR1_DIR_Pos) + + +#define FL_ATIM_ONE_PULSE_MODE_CONTINUOUS (0x0U << ATIM_CR1_OPM_Pos) +#define FL_ATIM_ONE_PULSE_MODE_SINGLE (0x1U << ATIM_CR1_OPM_Pos) + + +#define FL_ATIM_UPDATE_SOURCE_REGULAR (0x0U << ATIM_CR1_URS_Pos) +#define FL_ATIM_UPDATE_SOURCE_COUNTER (0x1U << ATIM_CR1_URS_Pos) + + +#define FL_ATIM_OCN_IDLE_STATE_LOW (0x0U << ATIM_CR2_OISN_Pos) +#define FL_ATIM_OCN_IDLE_STATE_HIGH (0x1U << ATIM_CR2_OISN_Pos) + + +#define FL_ATIM_OC_IDLE_STATE_LOW (0x0U << ATIM_CR2_OIS_Pos) +#define FL_ATIM_OC_IDLE_STATE_HIGH (0x1U << ATIM_CR2_OIS_Pos) + + +#define FL_ATIM_TRGO_RESET (0x0U << ATIM_CR2_MMS_Pos) +#define FL_ATIM_TRGO_ENABLE (0x1U << ATIM_CR2_MMS_Pos) +#define FL_ATIM_TRGO_UPDATE (0x2U << ATIM_CR2_MMS_Pos) +#define FL_ATIM_TRGO_CC1IF (0x3U << ATIM_CR2_MMS_Pos) +#define FL_ATIM_TRGO_OC1REF (0x4U << ATIM_CR2_MMS_Pos) +#define FL_ATIM_TRGO_OC2REF (0x5U << ATIM_CR2_MMS_Pos) +#define FL_ATIM_TRGO_OC3REF (0x6U << ATIM_CR2_MMS_Pos) +#define FL_ATIM_TRGO_OC4REF (0x7U << ATIM_CR2_MMS_Pos) + + +#define FL_ATIM_DMA_REQ_CC (0x0U << ATIM_CR2_CCDS_Pos) +#define FL_ATIM_DMA_REQ_UPDATE (0x1U << ATIM_CR2_CCDS_Pos) + + +#define FL_ATIM_UPDATE_SOURCE_COMG_ONLY (0x0U << ATIM_CR2_CCUS_Pos) +#define FL_ATIM_UPDATE_SOURCE_COMG_AND_TRGI (0x1U << ATIM_CR2_CCUS_Pos) + + +#define FL_ATIM_ETR_POLARITY_NORMAL (0x0U << ATIM_SMCR_ETP_Pos) +#define FL_ATIM_ETR_POLARITY_INVERT (0x1U << ATIM_SMCR_ETP_Pos) + + +#define FL_ATIM_ETR_PSC_DIV1 (0x0U << ATIM_SMCR_ETPS_Pos) +#define FL_ATIM_ETR_PSC_DIV2 (0x1U << ATIM_SMCR_ETPS_Pos) +#define FL_ATIM_ETR_PSC_DIV4 (0x2U << ATIM_SMCR_ETPS_Pos) +#define FL_ATIM_ETR_PSC_DIV8 (0x3U << ATIM_SMCR_ETPS_Pos) + + +#define FL_ATIM_ETR_FILTER_DIV1 (0x0U << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV1_N2 (0x1U << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV1_N4 (0x2U << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV1_N8 (0x3U << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV2_N6 (0x4U << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV2_N8 (0x5U << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV4_N6 (0x6U << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV4_N8 (0x7U << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV8_N6 (0x8U << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV8_N8 (0x9U << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV16_N5 (0xaU << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV16_N6 (0xbU << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV16_N8 (0xcU << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV32_N5 (0xdU << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV32_N6 (0xeU << ATIM_SMCR_ETF_Pos) +#define FL_ATIM_ETR_FILTER_DIV32_N8 (0xfU << ATIM_SMCR_ETF_Pos) + + +#define FL_ATIM_TRGI_ITR0 (0x0U << ATIM_SMCR_TS_Pos) +#define FL_ATIM_TRGI_ITR1 (0x1U << ATIM_SMCR_TS_Pos) +#define FL_ATIM_TRGI_ITR2 (0x2U << ATIM_SMCR_TS_Pos) +#define FL_ATIM_TRGI_ITR3 (0x3U << ATIM_SMCR_TS_Pos) +#define FL_ATIM_TRGI_TI1F_EDGE (0x4U << ATIM_SMCR_TS_Pos) +#define FL_ATIM_TRGI_TI1FP1 (0x5U << ATIM_SMCR_TS_Pos) +#define FL_ATIM_TRGI_TI2FP2 (0x6U << ATIM_SMCR_TS_Pos) +#define FL_ATIM_TRGI_ETRF (0x7U << ATIM_SMCR_TS_Pos) + + +#define FL_ATIM_SLAVE_MODE_PROHIBITED (0x0U << ATIM_SMCR_SMS_Pos) +#define FL_ATIM_SLAVE_MODE_ENCODER_X2_TI1 (0x1U << ATIM_SMCR_SMS_Pos) +#define FL_ATIM_SLAVE_MODE_ENCODER_X2_TI2 (0x2U << ATIM_SMCR_SMS_Pos) +#define FL_ATIM_SLAVE_MODE_ENCODER_X4_TI1TI2 (0x3U << ATIM_SMCR_SMS_Pos) +#define FL_ATIM_SLAVE_MODE_TRGI_RISE_RST (0x4U << ATIM_SMCR_SMS_Pos) +#define FL_ATIM_SLAVE_MODE_TRGI_HIGH_RUN (0x5U << ATIM_SMCR_SMS_Pos) +#define FL_ATIM_SLAVE_MODE_TRGI_RISE_RUN (0x6U << ATIM_SMCR_SMS_Pos) +#define FL_ATIM_SLAVE_MODE_TRGI_CLK (0x7U << ATIM_SMCR_SMS_Pos) + + +#define FL_ATIM_DMA_BURST_LENGTH_1 (0x0U << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_2 (0x1U << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_3 (0x2U << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_4 (0x3U << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_5 (0x4U << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_6 (0x5U << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_7 (0x6U << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_8 (0x7U << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_9 (0x8U << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_10 (0x9U << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_11 (0xaU << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_12 (0xbU << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_13 (0xcU << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_14 (0xdU << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_15 (0xeU << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_16 (0xfU << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_17 (0x10U << ATIM_DCR_DBL_Pos) +#define FL_ATIM_DMA_BURST_LENGTH_18 (0x11U << ATIM_DCR_DBL_Pos) + + +#define FL_ATIM_DMA_BURST_ADDR_CR1 (0x0U << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_CR2 (0x1U << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_SMCR (0x2U << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_DIER (0x3U << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_SR (0x4U << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_EGR (0x5U << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_CCMR1 (0x6U << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_CCMR2 (0x7U << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_CCER (0x8U << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_CNT (0x9U << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_PSC (0xaU << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_ARR (0xbU << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_RCR (0xcU << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_CCR1 (0xdU << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_CCR2 (0xeU << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_CCR3 (0xfU << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_CCR4 (0x10U << ATIM_DCR_DBA_Pos) +#define FL_ATIM_DMA_BURST_ADDR_BDTR (0x11U << ATIM_DCR_DBA_Pos) + + +#define FL_ATIM_OC_MODE_FROZEN (0x0U << ATIM_CCMR_OCM_Pos) +#define FL_ATIM_OC_MODE_ACTIVE (0x1U << ATIM_CCMR_OCM_Pos) +#define FL_ATIM_OC_MODE_INACTIVE (0x2U << ATIM_CCMR_OCM_Pos) +#define FL_ATIM_OC_MODE_TOGGLE (0x3U << ATIM_CCMR_OCM_Pos) +#define FL_ATIM_OC_MODE_FORCED_INACTIVE (0x4U << ATIM_CCMR_OCM_Pos) +#define FL_ATIM_OC_MODE_FORCED_ACTIVE (0x5U << ATIM_CCMR_OCM_Pos) +#define FL_ATIM_OC_MODE_PWM1 (0x6U << ATIM_CCMR_OCM_Pos) +#define FL_ATIM_OC_MODE_PWM2 (0x7U << ATIM_CCMR_OCM_Pos) + + +#define FL_ATIM_IC_FILTER_DIV1 (0x0U << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV1_N2 (0x1U << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV1_N4 (0x2U << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV1_N8 (0x3U << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV2_N6 (0x4U << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV2_N8 (0x5U << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV4_N6 (0x6U << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV4_N8 (0x7U << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV8_N6 (0x8U << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV8_N8 (0x9U << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV16_N5 (0xaU << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV16_N6 (0xbU << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV16_N8 (0xcU << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV32_N5 (0xdU << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV32_N6 (0xeU << ATIM_CCMR_ICF_Pos) +#define FL_ATIM_IC_FILTER_DIV32_N8 (0xfU << ATIM_CCMR_ICF_Pos) + + +#define FL_ATIM_IC_PSC_DIV1 (0x0U << ATIM_CCMR_ICPSC_Pos) +#define FL_ATIM_IC_PSC_DIV2 (0x1U << ATIM_CCMR_ICPSC_Pos) +#define FL_ATIM_IC_PSC_DIV4 (0x2U << ATIM_CCMR_ICPSC_Pos) +#define FL_ATIM_IC_PSC_DIV8 (0x3U << ATIM_CCMR_ICPSC_Pos) + + +#define FL_ATIM_CHANNEL_MODE_OUTPUT (0x0U << ATIM_CCMR_CCS_Pos) +#define FL_ATIM_CHANNEL_MODE_INPUT_NORMAL (0x1U << ATIM_CCMR_CCS_Pos) +#define FL_ATIM_CHANNEL_MODE_INPUT_CROSSOVER (0x2U << ATIM_CCMR_CCS_Pos) +#define FL_ATIM_CHANNEL_MODE_INPUT_TRC (0x3U << ATIM_CCMR_CCS_Pos) + + +#define FL_ATIM_OCN_POLARITY_NORMAL (0x0U << ATIM_CCER_CCNP_Pos) +#define FL_ATIM_OCN_POLARITY_INVERT (0x1U << ATIM_CCER_CCNP_Pos) + + +#define FL_ATIM_OC_POLARITY_NORMAL (0x0U << ATIM_CCER_CCOP_Pos) +#define FL_ATIM_OC_POLARITY_INVERT (0x1U << ATIM_CCER_CCOP_Pos) + + +#define FL_ATIM_IC_POLARITY_NORMAL (0x0U << ATIM_CCER_CCIP_Pos) +#define FL_ATIM_IC_POLARITY_INVERT (0x1U << ATIM_CCER_CCIP_Pos) + + +#define FL_ATIM_BREAK_POLARITY_LOW (0x0U << ATIM_BDTR_BKP_Pos) +#define FL_ATIM_BREAK_POLARITY_HIGH (0x1U << ATIM_BDTR_BKP_Pos) + + +#define FL_ATIM_OSSR_DISABLE (0x0U << ATIM_BDTR_OSSR_Pos) +#define FL_ATIM_OSSR_ENABLE (0x1U << ATIM_BDTR_OSSR_Pos) + + +#define FL_ATIM_OSSI_DISABLE (0x0U << ATIM_BDTR_OSSI_Pos) +#define FL_ATIM_OSSI_ENABLE (0x1U << ATIM_BDTR_OSSI_Pos) + + +#define FL_ATIM_LOCK_LEVEL_OFF (0x0U << ATIM_BDTR_LOCK_Pos) +#define FL_ATIM_LOCK_LEVEL_1 (0x1U << ATIM_BDTR_LOCK_Pos) +#define FL_ATIM_LOCK_LEVEL_2 (0x2U << ATIM_BDTR_LOCK_Pos) +#define FL_ATIM_LOCK_LEVEL_3 (0x3U << ATIM_BDTR_LOCK_Pos) + + +#define FL_ATIM_BREAK1_GATE_LOW (0x0U << ATIM_BKCR_BRK1GATE_Pos) +#define FL_ATIM_BREAK1_GATE_AUTO (0x1U << ATIM_BKCR_BRK1GATE_Pos) + + +#define FL_ATIM_BREAK2_GATE_LOW (0x0U << ATIM_BKCR_BRK2GATE_Pos) +#define FL_ATIM_BREAK2_GATE_AUTO (0x1U << ATIM_BKCR_BRK2GATE_Pos) + + +#define FL_ATIM_BREAK_FILTER_DIV1 (0x0U << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV1_N2 (0x1U << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV1_N4 (0x2U << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV1_N8 (0x3U << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV2_N6 (0x4U << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV2_N8 (0x5U << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV4_N6 (0x6U << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV4_N8 (0x7U << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV8_N6 (0x8U << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV8_N8 (0x9U << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV16_N5 (0xaU << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV16_N6 (0xbU << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV16_N8 (0xcU << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV32_N5 (0xdU << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV32_N6 (0xeU << ATIM_BKCR_BRKF_Pos) +#define FL_ATIM_BREAK_FILTER_DIV32_N8 (0xfU << ATIM_BKCR_BRKF_Pos) + + +#define FL_ATIM_BREAK_COMBINATION_OR (0x0U << ATIM_BKCR_BRKCOMB_Pos) +#define FL_ATIM_BREAK_COMBINATION_AND (0x1U << ATIM_BKCR_BRKCOMB_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup ATIM_FL_Exported_Functions ATIM Exported Functions + * @{ + */ + +/** + * @brief 设置时钟分频因子 + * @rmtoll CR1 CKD FL_ATIM_SetClockDivision + * @param TIMx TIM instance + * @param div This parameter can be one of the following values: + * @arg @ref FL_ATIM_CLK_DIVISION_DIV1 + * @arg @ref FL_ATIM_CLK_DIVISION_DIV2 + * @arg @ref FL_ATIM_CLK_DIVISION_DIV4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetClockDivision(ATIM_Type *TIMx, uint32_t div) +{ + MODIFY_REG(TIMx->CR1, ATIM_CR1_CKD_Msk, div); +} + +/** + * @brief 读取时钟分频因子 + * @rmtoll CR1 CKD FL_ATIM_GetClockDivision + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_CLK_DIVISION_DIV1 + * @arg @ref FL_ATIM_CLK_DIVISION_DIV2 + * @arg @ref FL_ATIM_CLK_DIVISION_DIV4 + */ +__STATIC_INLINE uint32_t FL_ATIM_GetClockDivision(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, ATIM_CR1_CKD_Msk)); +} + +/** + * @brief 自动重装载使能 + * @rmtoll CR1 ARPE FL_ATIM_EnableARRPreload + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableARRPreload(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->CR1, ATIM_CR1_ARPE_Msk); +} + +/** + * @brief 获取自动重装载使能状态 + * @rmtoll CR1 ARPE FL_ATIM_IsEnabledARRPreload + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledARRPreload(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, ATIM_CR1_ARPE_Msk) == ATIM_CR1_ARPE_Msk); +} + +/** + * @brief 自动重装载禁用 + * @rmtoll CR1 ARPE FL_ATIM_DisableARRPreload + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableARRPreload(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->CR1, ATIM_CR1_ARPE_Msk); +} + +/** + * @brief 计数器对齐模式设置 + * @rmtoll CR1 CMS FL_ATIM_SetCounterAlignedMode + * @param TIMx TIM instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_ATIM_COUNTER_ALIGNED_EDGE + * @arg @ref FL_ATIM_COUNTER_ALIGNED_CENTER_DOWN + * @arg @ref FL_ATIM_COUNTER_ALIGNED_CENTER_UP + * @arg @ref FL_ATIM_COUNTER_ALIGNED_CENTER_UP_DOWN + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetCounterAlignedMode(ATIM_Type *TIMx, uint32_t mode) +{ + MODIFY_REG(TIMx->CR1, ATIM_CR1_CMS_Msk, mode); +} + +/** + * @brief 读取计数器对齐模式 + * @rmtoll CR1 CMS FL_ATIM_GetCounterAlignedMode + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_COUNTER_ALIGNED_EDGE + * @arg @ref FL_ATIM_COUNTER_ALIGNED_CENTER_DOWN + * @arg @ref FL_ATIM_COUNTER_ALIGNED_CENTER_UP + * @arg @ref FL_ATIM_COUNTER_ALIGNED_CENTER_UP_DOWN + */ +__STATIC_INLINE uint32_t FL_ATIM_GetCounterAlignedMode(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, ATIM_CR1_CMS_Msk)); +} + +/** + * @brief 设置记数方向 + * @rmtoll CR1 DIR FL_ATIM_SetCounterDirection + * @param TIMx TIM instance + * @param dir This parameter can be one of the following values: + * @arg @ref FL_ATIM_COUNTER_DIR_UP + * @arg @ref FL_ATIM_COUNTER_DIR_DOWN + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetCounterDirection(ATIM_Type *TIMx, uint32_t dir) +{ + MODIFY_REG(TIMx->CR1, ATIM_CR1_DIR_Msk, dir); +} + +/** + * @brief 读取记数方向 + * @rmtoll CR1 DIR FL_ATIM_GetCounterDirection + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_COUNTER_DIR_UP + * @arg @ref FL_ATIM_COUNTER_DIR_DOWN + */ +__STATIC_INLINE uint32_t FL_ATIM_GetCounterDirection(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, ATIM_CR1_DIR_Msk)); +} + +/** + * @brief 设置单脉冲输出模式 + * @rmtoll CR1 OPM FL_ATIM_SetOnePulseMode + * @param TIMx TIM instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_ATIM_ONE_PULSE_MODE_CONTINUOUS + * @arg @ref FL_ATIM_ONE_PULSE_MODE_SINGLE + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetOnePulseMode(ATIM_Type *TIMx, uint32_t mode) +{ + MODIFY_REG(TIMx->CR1, ATIM_CR1_OPM_Msk, mode); +} + +/** + * @brief 读取单脉冲输出的模式 + * @rmtoll CR1 OPM FL_ATIM_GetOnePulseMode + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_ONE_PULSE_MODE_CONTINUOUS + * @arg @ref FL_ATIM_ONE_PULSE_MODE_SINGLE + */ +__STATIC_INLINE uint32_t FL_ATIM_GetOnePulseMode(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, ATIM_CR1_OPM_Msk)); +} + +/** + * @brief 设置更新请求源 + * @rmtoll CR1 URS FL_ATIM_SetUpdateSource + * @param TIMx TIM instance + * @param source This parameter can be one of the following values: + * @arg @ref FL_ATIM_UPDATE_SOURCE_REGULAR + * @arg @ref FL_ATIM_UPDATE_SOURCE_COUNTER + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetUpdateSource(ATIM_Type *TIMx, uint32_t source) +{ + MODIFY_REG(TIMx->CR1, ATIM_CR1_URS_Msk, source); +} + +/** + * @brief 读取更新请求源 + * @rmtoll CR1 URS FL_ATIM_GetUpdateSource + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_UPDATE_SOURCE_REGULAR + * @arg @ref FL_ATIM_UPDATE_SOURCE_COUNTER + */ +__STATIC_INLINE uint32_t FL_ATIM_GetUpdateSource(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, ATIM_CR1_URS_Msk)); +} + +/** + * @brief 使能更新事件 + * @rmtoll CR1 UDIS FL_ATIM_EnableUpdateEvent + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableUpdateEvent(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->CR1, ATIM_CR1_UDIS_Msk); +} + +/** + * @brief 读取更新事件状态 + * @rmtoll CR1 UDIS FL_ATIM_IsEnabledUpdateEvent + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledUpdateEvent(ATIM_Type *TIMx) +{ + return (uint32_t)!(READ_BIT(TIMx->CR1, ATIM_CR1_UDIS_Msk) == ATIM_CR1_UDIS_Msk); +} + +/** + * @brief 禁用更新事件 + * @rmtoll CR1 UDIS FL_ATIM_DisableUpdateEvent + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableUpdateEvent(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->CR1, ATIM_CR1_UDIS_Msk); +} + +/** + * @brief 计数器使能 + * @rmtoll CR1 CEN FL_ATIM_Enable + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_Enable(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->CR1, ATIM_CR1_CEN_Msk); +} + +/** + * @brief 读取计数器使能状态 + * @rmtoll CR1 CEN FL_ATIM_IsEnabled + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabled(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, ATIM_CR1_CEN_Msk) == ATIM_CR1_CEN_Msk); +} + +/** + * @brief 计数器关闭 + * @rmtoll CR1 CEN FL_ATIM_Disable + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_Disable(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->CR1, ATIM_CR1_CEN_Msk); +} + +/** + * @brief 设置OCN的输出空闲状态 + * @note + * @rmtoll CR2 OISN FL_ATIM_OC_SetReverseChannelIdleState + * @param TIMx TIM instance + * @param OCNIdleState This parameter can be one of the following values: + * @arg @ref FL_ATIM_OCN_IDLE_STATE_LOW + * @arg @ref FL_ATIM_OCN_IDLE_STATE_HIGH + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_SetReverseChannelIdleState(ATIM_Type *TIMx, uint32_t OCNIdleState, uint32_t channel) +{ + MODIFY_REG(TIMx->CR2, (ATIM_CR2_OISN_Msk << (channel * 2)), OCNIdleState << (channel * 2)); +} + +/** + * @brief 读取OCN的输出空闲状态 + * @note + * @rmtoll CR2 OISN FL_ATIM_OC_GetReverseChannelIdleState + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_OCN_IDLE_STATE_LOW + * @arg @ref FL_ATIM_OCN_IDLE_STATE_HIGH + */ +__STATIC_INLINE uint32_t FL_ATIM_OC_GetReverseChannelIdleState(ATIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->CR2, (ATIM_CR2_OISN_Msk << (channel * 2)))); +} + +/** + * @brief 设置OC的输出空闲状态 + * @note + * @rmtoll CR2 OIS FL_ATIM_OC_SetChannelIdleState + * @param TIMx TIM instance + * @param OCIdleState This parameter can be one of the following values: + * @arg @ref FL_ATIM_OC_IDLE_STATE_LOW + * @arg @ref FL_ATIM_OC_IDLE_STATE_HIGH + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_SetChannelIdleState(ATIM_Type *TIMx, uint32_t OCIdleState, uint32_t channel) +{ + MODIFY_REG(TIMx->CR2, (ATIM_CR2_OIS_Msk << (channel * 2)), OCIdleState << (channel * 2)); +} + +/** + * @brief 读取OC的输出空闲状态 + * @note + * @rmtoll CR2 OIS FL_ATIM_OC_GetChannelIdleState + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_OC_IDLE_STATE_LOW + * @arg @ref FL_ATIM_OC_IDLE_STATE_HIGH + */ +__STATIC_INLINE uint32_t FL_ATIM_OC_GetChannelIdleState(ATIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->CR2, (ATIM_CR2_OIS_Msk << (channel * 2)))); +} + +/** + * @brief 通道1输入源选择 + * @rmtoll CR2 TI1S FL_ATIM_IC_EnableXORCombination + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_IC_EnableXORCombination(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->CR2, ATIM_CR2_TI1S_Msk); +} + +/** + * @brief 读取通道1输入源 + * @rmtoll CR2 TI1S FL_ATIM_IC_IsEnabledXORCombination + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IC_IsEnabledXORCombination(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR2, ATIM_CR2_TI1S_Msk) == ATIM_CR2_TI1S_Msk); +} + +/** + * @brief 通道1输入源禁用XOR组合 + * @rmtoll CR2 TI1S FL_ATIM_IC_DisableXORCombination + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_IC_DisableXORCombination(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->CR2, ATIM_CR2_TI1S_Msk); +} + +/** + * @brief 设置同步触发信号源 + * @rmtoll CR2 MMS FL_ATIM_SetTriggerOutput + * @param TIMx TIM instance + * @param triggerOutput This parameter can be one of the following values: + * @arg @ref FL_ATIM_TRGO_RESET + * @arg @ref FL_ATIM_TRGO_ENABLE + * @arg @ref FL_ATIM_TRGO_UPDATE + * @arg @ref FL_ATIM_TRGO_CC1IF + * @arg @ref FL_ATIM_TRGO_OC1REF + * @arg @ref FL_ATIM_TRGO_OC2REF + * @arg @ref FL_ATIM_TRGO_OC3REF + * @arg @ref FL_ATIM_TRGO_OC4REF + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetTriggerOutput(ATIM_Type *TIMx, uint32_t triggerOutput) +{ + MODIFY_REG(TIMx->CR2, ATIM_CR2_MMS_Msk, triggerOutput); +} + +/** + * @brief 读取同步触发源 + * @rmtoll CR2 MMS FL_ATIM_GetTriggerOutput + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_TRGO_RESET + * @arg @ref FL_ATIM_TRGO_ENABLE + * @arg @ref FL_ATIM_TRGO_UPDATE + * @arg @ref FL_ATIM_TRGO_CC1IF + * @arg @ref FL_ATIM_TRGO_OC1REF + * @arg @ref FL_ATIM_TRGO_OC2REF + * @arg @ref FL_ATIM_TRGO_OC3REF + * @arg @ref FL_ATIM_TRGO_OC4REF + */ +__STATIC_INLINE uint32_t FL_ATIM_GetTriggerOutput(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR2, ATIM_CR2_MMS_Msk)); +} + +/** + * @brief 设置DMA请求触发 + * @rmtoll CR2 CCDS FL_ATIM_CC_SetDMAReqTrigger + * @param TIMx TIM instance + * @param trigger This parameter can be one of the following values: + * @arg @ref FL_ATIM_DMA_REQ_CC + * @arg @ref FL_ATIM_DMA_REQ_UPDATE + * @retval None + */ +__STATIC_INLINE void FL_ATIM_CC_SetDMAReqTrigger(ATIM_Type *TIMx, uint32_t trigger) +{ + MODIFY_REG(TIMx->CR2, ATIM_CR2_CCDS_Msk, trigger); +} + +/** + * @brief 读取DMA请求触发 + * @rmtoll CR2 CCDS FL_ATIM_CC_GetDMAReqTrigger + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_DMA_REQ_CC + * @arg @ref FL_ATIM_DMA_REQ_UPDATE + */ +__STATIC_INLINE uint32_t FL_ATIM_CC_GetDMAReqTrigger(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR2, ATIM_CR2_CCDS_Msk)); +} + +/** + * @brief 设置捕捉比较寄存器更新选择 + * @rmtoll CR2 CCUS FL_ATIM_CC_SetUpdateSource + * @param TIMx TIM instance + * @param updateSource This parameter can be one of the following values: + * @arg @ref FL_ATIM_UPDATE_SOURCE_COMG_ONLY + * @arg @ref FL_ATIM_UPDATE_SOURCE_COMG_AND_TRGI + * @retval None + */ +__STATIC_INLINE void FL_ATIM_CC_SetUpdateSource(ATIM_Type *TIMx, uint32_t updateSource) +{ + MODIFY_REG(TIMx->CR2, ATIM_CR2_CCUS_Msk, updateSource); +} + +/** + * @brief 读取捕捉比较寄存器更新源 + * @rmtoll CR2 CCUS FL_ATIM_CC_GetUpdateSource + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_UPDATE_SOURCE_COMG_ONLY + * @arg @ref FL_ATIM_UPDATE_SOURCE_COMG_AND_TRGI + */ +__STATIC_INLINE uint32_t FL_ATIM_CC_GetUpdateSource(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR2, ATIM_CR2_CCUS_Msk)); +} + +/** + * @brief 捕捉比较预装载使能 + * @rmtoll CR2 CCPC FL_ATIM_CC_EnablePreload + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_CC_EnablePreload(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->CR2, ATIM_CR2_CCPC_Msk); +} + +/** + * @brief 读取捕捉比较预装载使能状态 + * @rmtoll CR2 CCPC FL_ATIM_CC_IsEnabledPreload + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_CC_IsEnabledPreload(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR2, ATIM_CR2_CCPC_Msk) == ATIM_CR2_CCPC_Msk); +} + +/** + * @brief 捕捉比较预装载失能 + * @rmtoll CR2 CCPC FL_ATIM_CC_DisablePreload + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_CC_DisablePreload(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->CR2, ATIM_CR2_CCPC_Msk); +} + +/** + * @brief 设置外部触发信号极性 + * @rmtoll SMCR ETP FL_ATIM_SetETRPolarity + * @param TIMx TIM instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_ATIM_ETR_POLARITY_NORMAL + * @arg @ref FL_ATIM_ETR_POLARITY_INVERT + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetETRPolarity(ATIM_Type *TIMx, uint32_t polarity) +{ + MODIFY_REG(TIMx->SMCR, ATIM_SMCR_ETP_Msk, polarity); +} + +/** + * @brief 读取外部触发信号极性 + * @rmtoll SMCR ETP FL_ATIM_GetETRPolarity + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_ETR_POLARITY_NORMAL + * @arg @ref FL_ATIM_ETR_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_ATIM_GetETRPolarity(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, ATIM_SMCR_ETP_Msk)); +} + +/** + * @brief 外部时钟使能 + * @rmtoll SMCR ECE FL_ATIM_EnableExternalClock + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableExternalClock(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->SMCR, ATIM_SMCR_ECE_Msk); +} + +/** + * @brief 读取外部时钟使能状态 + * @rmtoll SMCR ECE FL_ATIM_IsEnabledExternalClock + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledExternalClock(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, ATIM_SMCR_ECE_Msk) == ATIM_SMCR_ECE_Msk); +} + +/** + * @brief 外部时钟禁用 + * @rmtoll SMCR ECE FL_ATIM_DisableExternalClock + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableExternalClock(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->SMCR, ATIM_SMCR_ECE_Msk); +} + +/** + * @brief 设置外部触发信号预分频 + * @rmtoll SMCR ETPS FL_ATIM_SetETRPrescaler + * @param TIMx TIM instance + * @param psc This parameter can be one of the following values: + * @arg @ref FL_ATIM_ETR_PSC_DIV1 + * @arg @ref FL_ATIM_ETR_PSC_DIV2 + * @arg @ref FL_ATIM_ETR_PSC_DIV4 + * @arg @ref FL_ATIM_ETR_PSC_DIV8 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetETRPrescaler(ATIM_Type *TIMx, uint32_t psc) +{ + MODIFY_REG(TIMx->SMCR, ATIM_SMCR_ETPS_Msk, psc); +} + +/** + * @brief 读取外部触发信号预分频 + * @rmtoll SMCR ETPS FL_ATIM_GetETRPrescaler + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_ETR_PSC_DIV1 + * @arg @ref FL_ATIM_ETR_PSC_DIV2 + * @arg @ref FL_ATIM_ETR_PSC_DIV4 + * @arg @ref FL_ATIM_ETR_PSC_DIV8 + */ +__STATIC_INLINE uint32_t FL_ATIM_GetETRPrescaler(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, ATIM_SMCR_ETPS_Msk)); +} + +/** + * @brief 设置外部触发信号滤波时钟和长度 + * @rmtoll SMCR ETF FL_ATIM_SetETRFilter + * @param TIMx TIM instance + * @param filter This parameter can be one of the following values: + * @arg @ref FL_ATIM_ETR_FILTER_DIV1 + * @arg @ref FL_ATIM_ETR_FILTER_DIV1_N2 + * @arg @ref FL_ATIM_ETR_FILTER_DIV1_N4 + * @arg @ref FL_ATIM_ETR_FILTER_DIV1_N8 + * @arg @ref FL_ATIM_ETR_FILTER_DIV2_N6 + * @arg @ref FL_ATIM_ETR_FILTER_DIV2_N8 + * @arg @ref FL_ATIM_ETR_FILTER_DIV4_N6 + * @arg @ref FL_ATIM_ETR_FILTER_DIV4_N8 + * @arg @ref FL_ATIM_ETR_FILTER_DIV8_N6 + * @arg @ref FL_ATIM_ETR_FILTER_DIV8_N8 + * @arg @ref FL_ATIM_ETR_FILTER_DIV16_N5 + * @arg @ref FL_ATIM_ETR_FILTER_DIV16_N6 + * @arg @ref FL_ATIM_ETR_FILTER_DIV16_N8 + * @arg @ref FL_ATIM_ETR_FILTER_DIV32_N5 + * @arg @ref FL_ATIM_ETR_FILTER_DIV32_N6 + * @arg @ref FL_ATIM_ETR_FILTER_DIV32_N8 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetETRFilter(ATIM_Type *TIMx, uint32_t filter) +{ + MODIFY_REG(TIMx->SMCR, ATIM_SMCR_ETF_Msk, filter); +} + +/** + * @brief 读取外部触发信号滤波时钟和长度 + * @rmtoll SMCR ETF FL_ATIM_GetETRFilter + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_ETR_FILTER_DIV1 + * @arg @ref FL_ATIM_ETR_FILTER_DIV1_N2 + * @arg @ref FL_ATIM_ETR_FILTER_DIV1_N4 + * @arg @ref FL_ATIM_ETR_FILTER_DIV1_N8 + * @arg @ref FL_ATIM_ETR_FILTER_DIV2_N6 + * @arg @ref FL_ATIM_ETR_FILTER_DIV2_N8 + * @arg @ref FL_ATIM_ETR_FILTER_DIV4_N6 + * @arg @ref FL_ATIM_ETR_FILTER_DIV4_N8 + * @arg @ref FL_ATIM_ETR_FILTER_DIV8_N6 + * @arg @ref FL_ATIM_ETR_FILTER_DIV8_N8 + * @arg @ref FL_ATIM_ETR_FILTER_DIV16_N5 + * @arg @ref FL_ATIM_ETR_FILTER_DIV16_N6 + * @arg @ref FL_ATIM_ETR_FILTER_DIV16_N8 + * @arg @ref FL_ATIM_ETR_FILTER_DIV32_N5 + * @arg @ref FL_ATIM_ETR_FILTER_DIV32_N6 + * @arg @ref FL_ATIM_ETR_FILTER_DIV32_N8 + */ +__STATIC_INLINE uint32_t FL_ATIM_GetETRFilter(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, ATIM_SMCR_ETF_Msk)); +} + +/** + * @brief 主/从模式使能 + * @rmtoll SMCR MSM FL_ATIM_EnableMasterSlaveMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableMasterSlaveMode(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->SMCR, ATIM_SMCR_MSM_Msk); +} + +/** + * @brief 读取主/从模式使能状态 + * @rmtoll SMCR MSM FL_ATIM_IsEnabledMasterSlaveMode + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledMasterSlaveMode(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, ATIM_SMCR_MSM_Msk) == ATIM_SMCR_MSM_Msk); +} + +/** + * @brief 定时器主/从模式禁用 + * @rmtoll SMCR MSM FL_ATIM_DisableMasterSlaveMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableMasterSlaveMode(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->SMCR, ATIM_SMCR_MSM_Msk); +} + +/** + * @brief 设置同步计数器触发源 + * @rmtoll SMCR TS FL_ATIM_SetTriggerInput + * @param TIMx TIM instance + * @param triggerInput This parameter can be one of the following values: + * @arg @ref FL_ATIM_TRGI_ITR0 + * @arg @ref FL_ATIM_TRGI_ITR1 + * @arg @ref FL_ATIM_TRGI_ITR2 + * @arg @ref FL_ATIM_TRGI_ITR3 + * @arg @ref FL_ATIM_TRGI_TI1F_EDGE + * @arg @ref FL_ATIM_TRGI_TI1FP1 + * @arg @ref FL_ATIM_TRGI_TI2FP2 + * @arg @ref FL_ATIM_TRGI_ETRF + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetTriggerInput(ATIM_Type *TIMx, uint32_t triggerInput) +{ + MODIFY_REG(TIMx->SMCR, ATIM_SMCR_TS_Msk, triggerInput); +} + +/** + * @brief 读取同步计数器的触发源 + * @rmtoll SMCR TS FL_ATIM_GetTriggerInput + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_TRGI_ITR0 + * @arg @ref FL_ATIM_TRGI_ITR1 + * @arg @ref FL_ATIM_TRGI_ITR2 + * @arg @ref FL_ATIM_TRGI_ITR3 + * @arg @ref FL_ATIM_TRGI_TI1F_EDGE + * @arg @ref FL_ATIM_TRGI_TI1FP1 + * @arg @ref FL_ATIM_TRGI_TI2FP2 + * @arg @ref FL_ATIM_TRGI_ETRF + */ +__STATIC_INLINE uint32_t FL_ATIM_GetTriggerInput(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, ATIM_SMCR_TS_Msk)); +} + +/** + * @brief 从机模式设置 + * @rmtoll SMCR SMS FL_ATIM_SetSlaveMode + * @param TIMx TIM instance + * @param encoderMode This parameter can be one of the following values: + * @arg @ref FL_ATIM_SLAVE_MODE_PROHIBITED + * @arg @ref FL_ATIM_SLAVE_MODE_ENCODER_X2_TI1 + * @arg @ref FL_ATIM_SLAVE_MODE_ENCODER_X2_TI2 + * @arg @ref FL_ATIM_SLAVE_MODE_ENCODER_X4_TI1TI2 + * @arg @ref FL_ATIM_SLAVE_MODE_TRGI_RISE_RST + * @arg @ref FL_ATIM_SLAVE_MODE_TRGI_HIGH_RUN + * @arg @ref FL_ATIM_SLAVE_MODE_TRGI_RISE_RUN + * @arg @ref FL_ATIM_SLAVE_MODE_TRGI_CLK + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetSlaveMode(ATIM_Type *TIMx, uint32_t encoderMode) +{ + MODIFY_REG(TIMx->SMCR, ATIM_SMCR_SMS_Msk, encoderMode); +} + +/** + * @brief 读取从机模式 + * @rmtoll SMCR SMS FL_ATIM_GetSlaveMode + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_SLAVE_MODE_PROHIBITED + * @arg @ref FL_ATIM_SLAVE_MODE_ENCODER_X2_TI1 + * @arg @ref FL_ATIM_SLAVE_MODE_ENCODER_X2_TI2 + * @arg @ref FL_ATIM_SLAVE_MODE_NCODER_X4_TI1TI2 + * @arg @ref FL_ATIM_SLAVE_MODE_TRGI_RISE_RST + * @arg @ref FL_ATIM_SLAVE_MODE_TRGI_HIGH_RUN + * @arg @ref FL_ATIM_SLAVE_MODE_TRGI_RISE_RUN + * @arg @ref FL_ATIM_SLAVE_MODE_TRGI_CLK + */ +__STATIC_INLINE uint32_t FL_ATIM_GetSlaveMode(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, ATIM_SMCR_SMS_Msk)); +} + +/** + * @brief 通道1的模式配置为Burst模式 + * @rmtoll DIER CC1BURSTEN FL_ATIM_EnableCC1DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableCC1DMABurstMode(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_CC1BURSTEN_Msk); +} + +/** + * @brief 读取通道1的模式配置 + * @rmtoll DIER CC1BURSTEN FL_ATIM_IsEnabledCC1DMABurstMode + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledCC1DMABurstMode(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ATIM_DIER_CC1BURSTEN_Msk) == ATIM_DIER_CC1BURSTEN_Msk); +} + +/** + * @brief 通道1的Burst模式禁用 + * @rmtoll DIER CC1BURSTEN FL_ATIM_DisableCC1DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableCC1DMABurstMode(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_CC1BURSTEN_Msk); +} + +/** + * @brief 通道2的模式配置为Burst模式 + * @rmtoll DIER CC2BURSTEN FL_ATIM_EnableCC2DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableCC2DMABurstMode(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_CC2BURSTEN_Msk); +} + +/** + * @brief 读取通道2的模式配置 + * @rmtoll DIER CC2BURSTEN FL_ATIM_IsEnabledCC2DMABurstMode + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledCC2DMABurstMode(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ATIM_DIER_CC2BURSTEN_Msk) == ATIM_DIER_CC2BURSTEN_Msk); +} + +/** + * @brief 通道2的Burst模式禁用 + * @rmtoll DIER CC2BURSTEN FL_ATIM_DisableCC2DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableCC2DMABurstMode(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_CC2BURSTEN_Msk); +} + +/** + * @brief 通道3的模式配置为Burst模式 + * @rmtoll DIER CC3BURSTEN FL_ATIM_EnableCC3DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableCC3DMABurstMode(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_CC3BURSTEN_Msk); +} + +/** + * @brief 读取通道3的模式配置 + * @rmtoll DIER CC3BURSTEN FL_ATIM_IsEnabledCC3DMABurstMode + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledCC3DMABurstMode(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ATIM_DIER_CC3BURSTEN_Msk) == ATIM_DIER_CC3BURSTEN_Msk); +} + +/** + * @brief 通道3的Burst模式禁用 + * @rmtoll DIER CC3BURSTEN FL_ATIM_DisableCC3DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableCC3DMABurstMode(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_CC3BURSTEN_Msk); +} + +/** + * @brief 通道4的模式配置为Burst模式 + * @rmtoll DIER CC4BURSTEN FL_ATIM_EnableCC4DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableCC4DMABurstMode(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_CC4BURSTEN_Msk); +} + +/** + * @brief 读取通道4的模式配置 + * @rmtoll DIER CC4BURSTEN FL_ATIM_IsEnabledCC4DMABurstMode + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledCC4DMABurstMode(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ATIM_DIER_CC4BURSTEN_Msk) == ATIM_DIER_CC4BURSTEN_Msk); +} + +/** + * @brief 通道4的Burst模式禁用 + * @rmtoll DIER CC4BURSTEN FL_ATIM_DisableCC4DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableCC4DMABurstMode(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_CC4BURSTEN_Msk); +} + +/** + * @brief 外部触发DMA请求使能 + * @rmtoll DIER TDE FL_ATIM_EnableDMAReq_Trigger + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableDMAReq_Trigger(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_TDE_Msk); +} + +/** + * @brief 读取外部触发DMA请求使能状态 + * @rmtoll DIER TDE FL_ATIM_IsEnabledDMAReq_Trigger + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledDMAReq_Trigger(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ATIM_DIER_TDE_Msk) == ATIM_DIER_TDE_Msk); +} + +/** + * @brief 外部触发DMA请求禁用 + * @rmtoll DIER TDE FL_ATIM_DisableDMAReq_Trigger + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableDMAReq_Trigger(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_TDE_Msk); +} + +/** + * @brief COM事件DMA请求使能 + * @note + * @rmtoll DIER COMDE FL_ATIM_EnableDMAReq_COM + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableDMAReq_COM(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_COMDE_Msk); +} + +/** + * @brief 读取COM事件DMA请求使能状态 + * @note + * @rmtoll DIER COMDE FL_ATIM_IsEnabledDMAReq_COM + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledDMAReq_COM(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ATIM_DIER_COMDE_Msk) == ATIM_DIER_COMDE_Msk); +} + +/** + * @brief COM事件DMA请求禁用 + * @note + * @rmtoll DIER COMDE FL_ATIM_DisableDMAReq_COM + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableDMAReq_COM(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_COMDE_Msk); +} + +/** + * @brief 捕捉比较通道的DMA请求使能 + * @rmtoll DIER CCDE FL_ATIM_EnableDMAReq_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableDMAReq_CC(ATIM_Type *TIMx, uint32_t channel) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_CCDE_Msk << channel); +} + +/** + * @brief 读取捕捉比较通道的DMA请求使能 + * @rmtoll DIER CCDE FL_ATIM_IsEnabledDMAReq_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledDMAReq_CC(ATIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, (ATIM_DIER_CCDE_Msk << channel)) == (ATIM_DIER_CCDE_Msk << channel)); +} + +/** + * @brief 捕捉比较通道的DMA请求禁用 + * @rmtoll DIER CCDE FL_ATIM_DisableDMAReq_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableDMAReq_CC(ATIM_Type *TIMx, uint32_t channel) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_CCDE_Msk << channel); +} + +/** + * @brief 更新事件DMA请求使能 + * @rmtoll DIER UDE FL_ATIM_EnableDMAReq_Update + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableDMAReq_Update(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_UDE_Msk); +} + +/** + * @brief 读取更新事件DMA请求使能状态 + * @rmtoll DIER UDE FL_ATIM_IsEnabledDMAReq_Update + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledDMAReq_Update(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ATIM_DIER_UDE_Msk) == ATIM_DIER_UDE_Msk); +} + +/** + * @brief 更新事件DMA请求禁用 + * @rmtoll DIER UDE FL_ATIM_DisableDMAReq_Update + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableDMAReq_Update(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_UDE_Msk); +} + +/** + * @brief 刹车事件中断使能 + * @note + * @rmtoll DIER BIE FL_ATIM_EnableIT_Break + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableIT_Break(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_BIE_Msk); +} + +/** + * @brief 读取刹车事件中断使能状态 + * @note + * @rmtoll DIER BIE FL_ATIM_IsEnabledIT_Break + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledIT_Break(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ATIM_DIER_BIE_Msk) == ATIM_DIER_BIE_Msk); +} + +/** + * @brief 刹车事件中断禁用 + * @note + * @rmtoll DIER BIE FL_ATIM_DisableIT_Break + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableIT_Break(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_BIE_Msk); +} + +/** + * @brief 触发事件中断使能 + * @rmtoll DIER TIE FL_ATIM_EnableIT_Trigger + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableIT_Trigger(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_TIE_Msk); +} + +/** + * @brief 读取触发事件中断使能 + * @rmtoll DIER TIE FL_ATIM_IsEnabledIT_Trigger + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledIT_Trigger(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ATIM_DIER_TIE_Msk) == ATIM_DIER_TIE_Msk); +} + +/** + * @brief 触发事件中断禁用 + * @rmtoll DIER TIE FL_ATIM_DisableIT_Trigger + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableIT_Trigger(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_TIE_Msk); +} + +/** + * @brief COM事件中断使能 + * @note + * @rmtoll DIER COMIE FL_ATIM_EnableIT_COM + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableIT_COM(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_COMIE_Msk); +} + +/** + * @brief 读取COM事件中断使能状态 + * @note + * @rmtoll DIER COMIE FL_ATIM_IsEnabledIT_COM + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledIT_COM(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ATIM_DIER_COMIE_Msk) == ATIM_DIER_COMIE_Msk); +} + +/** + * @brief COM事件中断禁用 + * @note + * @rmtoll DIER COMIE FL_ATIM_DisableIT_COM + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableIT_COM(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_COMIE_Msk); +} + +/** + * @brief 捕捉/比较通道中断使能 + * @rmtoll DIER CCIE FL_ATIM_EnableIT_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableIT_CC(ATIM_Type *TIMx, uint32_t channel) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_CCIE_Msk << channel); +} + +/** + * @brief 读取捕捉/比较通道中断使能状态 + * @rmtoll DIER CCIE FL_ATIM_IsEnabledIT_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledIT_CC(ATIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, (ATIM_DIER_CCIE_Msk << channel)) == (ATIM_DIER_CCIE_Msk << channel)); +} + +/** + * @brief 捕捉/比较通道中断禁用 + * @rmtoll DIER CCIE FL_ATIM_DisableIT_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableIT_CC(ATIM_Type *TIMx, uint32_t channel) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_CCIE_Msk << channel); +} + +/** + * @brief 更新事件中断使能 + * @rmtoll DIER UIE FL_ATIM_EnableIT_Update + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableIT_Update(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, ATIM_DIER_UIE_Msk); +} + +/** + * @brief 读取更新事件中断使能状态 + * @rmtoll DIER UIE FL_ATIM_IsEnabledIT_Update + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledIT_Update(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ATIM_DIER_UIE_Msk) == ATIM_DIER_UIE_Msk); +} + +/** + * @brief 更新事件中断禁用 + * @rmtoll DIER UIE FL_ATIM_DisableIT_Update + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableIT_Update(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, ATIM_DIER_UIE_Msk); +} + +/** + * @brief 捕捉/比较通道的Overcapture中断标志 + * @rmtoll ISR CCOF FL_ATIM_IsActiveFlag_CCOverflow + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsActiveFlag_CCOverflow(ATIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->ISR, (ATIM_ISR_CCOF_Msk << channel)) == (ATIM_ISR_CCOF_Msk << channel)); +} + +/** + * @brief 清除Overcapture中断标志 + * @rmtoll ISR CCOF FL_ATIM_ClearFlag_CCOverflow + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_ClearFlag_CCOverflow(ATIM_Type *TIMx, uint32_t channel) +{ + WRITE_REG(TIMx->ISR, (ATIM_ISR_CCOF_Msk << channel)); +} + +/** + * @brief 读取刹车事件中断标志 + * @note + * @rmtoll ISR BIF FL_ATIM_IsActiveFlag_Break + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsActiveFlag_Break(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->ISR, ATIM_ISR_BIF_Msk) == (ATIM_ISR_BIF_Msk)); +} + +/** + * @brief 清除刹车事件中断标志 + * @note + * @rmtoll ISR BIF FL_ATIM_ClearFlag_Break + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_ClearFlag_Break(ATIM_Type *TIMx) +{ + WRITE_REG(TIMx->ISR, ATIM_ISR_BIF_Msk); +} + +/** + * @brief 触发事件中断标志 + * @rmtoll ISR TIF FL_ATIM_IsActiveFlag_Trigger + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsActiveFlag_Trigger(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->ISR, ATIM_ISR_TIF_Msk) == (ATIM_ISR_TIF_Msk)); +} + +/** + * @brief 清除触发事件中断标志 + * @rmtoll ISR TIF FL_ATIM_ClearFlag_Trigger + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_ClearFlag_Trigger(ATIM_Type *TIMx) +{ + WRITE_REG(TIMx->ISR, ATIM_ISR_TIF_Msk); +} + +/** + * @brief 读取COM事件中断标志 + * @note + * @rmtoll ISR COMIF FL_ATIM_IsActiveFlag_COM + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsActiveFlag_COM(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->ISR, ATIM_ISR_COMIF_Msk) == (ATIM_ISR_COMIF_Msk)); +} + +/** + * @brief 清除COM事件中断标志 + * @note + * @rmtoll ISR COMIF FL_ATIM_ClearFlag_COM + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_ClearFlag_COM(ATIM_Type *TIMx) +{ + WRITE_REG(TIMx->ISR, ATIM_ISR_COMIF_Msk); +} + +/** + * @brief 读取捕捉/比较通道中断标志 + * @rmtoll ISR CCIF FL_ATIM_IsActiveFlag_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsActiveFlag_CC(ATIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->ISR, (ATIM_ISR_CCIF_Msk << channel)) == (ATIM_ISR_CCIF_Msk << channel)); +} + +/** + * @brief 清除捕捉/比较通道中断标志 + * @rmtoll ISR CCIF FL_ATIM_ClearFlag_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_ClearFlag_CC(ATIM_Type *TIMx, uint32_t channel) +{ + WRITE_REG(TIMx->ISR, (ATIM_ISR_CCIF_Msk << channel)); +} + +/** + * @brief 读取更新事件中断标志 + * @rmtoll ISR UIF FL_ATIM_IsActiveFlag_Update + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsActiveFlag_Update(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->ISR, ATIM_ISR_UIF_Msk) == (ATIM_ISR_UIF_Msk)); +} + +/** + * @brief 清除更新事件中断标志 + * @rmtoll ISR UIF FL_ATIM_ClearFlag_Update + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_ClearFlag_Update(ATIM_Type *TIMx) +{ + WRITE_REG(TIMx->ISR, ATIM_ISR_UIF_Msk); +} + +/** + * @brief 软件刹车使能 + * @note + * @rmtoll EGR BG FL_ATIM_GenerateBreakEvent + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_GenerateBreakEvent(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->EGR, ATIM_EGR_BG_Msk); +} + +/** + * @brief 软件触发使能 + * @rmtoll EGR TG FL_ATIM_GenerateTriggerEvent + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_GenerateTriggerEvent(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->EGR, ATIM_EGR_TG_Msk); +} + +/** + * @brief 软件COM事件使能 + * @note + * @rmtoll EGR COMG FL_ATIM_GenerateCOMEvent + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_GenerateCOMEvent(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->EGR, ATIM_EGR_COMG_Msk); +} + +/** + * @brief 捕捉/比较通道软件触发使能 + * @rmtoll EGR CCG FL_ATIM_GenerateCCEvent + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_GenerateCCEvent(ATIM_Type *TIMx, uint32_t channel) +{ + SET_BIT(TIMx->EGR, ATIM_EGR_CCG_Msk << channel); +} + +/** + * @brief 软件更新事件使能 + * @rmtoll EGR UG FL_ATIM_GenerateUpdateEvent + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_GenerateUpdateEvent(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->EGR, ATIM_EGR_UG_Msk); +} + +/** + * @brief 设置计数器值 + * @rmtoll CNT FL_ATIM_WriteCounter + * @param TIMx TIM instance + * @param counter + * @retval None + */ +__STATIC_INLINE void FL_ATIM_WriteCounter(ATIM_Type *TIMx, uint32_t counter) +{ + MODIFY_REG(TIMx->CNT, (0xffffU << 0U), (counter << 0U)); +} + +/** + * @brief 读取计数器值 + * @rmtoll CNT FL_ATIM_ReadCounter + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ATIM_ReadCounter(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CNT, 0xffffU) >> 0U); +} + +/** + * @brief 设置计数器时钟预分频值 + * @rmtoll PSC FL_ATIM_WritePrescaler + * @param TIMx TIM instance + * @param psc + * @retval None + */ +__STATIC_INLINE void FL_ATIM_WritePrescaler(ATIM_Type *TIMx, uint32_t psc) +{ + MODIFY_REG(TIMx->PSC, (0xffffU << 0U), (psc << 0U)); +} + +/** + * @brief 读取计数器时钟预分频值 + * @rmtoll PSC FL_ATIM_ReadPrescaler + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ATIM_ReadPrescaler(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->PSC, 0xffffU) >> 0U); +} + +/** + * @brief 设置计数溢出时的自动重载值 + * @rmtoll ARR FL_ATIM_WriteAutoReload + * @param TIMx TIM instance + * @param autoReload + * @retval None + */ +__STATIC_INLINE void FL_ATIM_WriteAutoReload(ATIM_Type *TIMx, uint32_t autoReload) +{ + MODIFY_REG(TIMx->ARR, (0xffffU << 0U), (autoReload << 0U)); +} + +/** + * @brief 读取计数溢出时的自动重载值 + * @rmtoll ARR FL_ATIM_ReadAutoReload + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ATIM_ReadAutoReload(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->ARR, 0xffffU) >> 0U); +} + +/** + * @brief 捕捉/比较通道1寄存器配置 + * @rmtoll CCR1 FL_ATIM_WriteCompareCH1 + * @param TIMx TIM instance + * @param compareValue + * @retval None + */ +__STATIC_INLINE void FL_ATIM_WriteCompareCH1(ATIM_Type *TIMx, uint32_t compareValue) +{ + MODIFY_REG(TIMx->CCR1, (0xffffU << 0U), (compareValue << 0U)); +} + +/** + * @brief 读取捕捉/比较通道1寄存器值 + * @rmtoll CCR1 FL_ATIM_ReadCompareCH1 + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ATIM_ReadCompareCH1(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CCR1, 0xffffU) >> 0U); +} + +/** + * @brief 捕捉/比较通道2寄存器配置 + * @rmtoll CCR2 FL_ATIM_WriteCompareCH2 + * @param TIMx TIM instance + * @param compareValue + * @retval None + */ +__STATIC_INLINE void FL_ATIM_WriteCompareCH2(ATIM_Type *TIMx, uint32_t compareValue) +{ + MODIFY_REG(TIMx->CCR2, (0xffffU << 0U), (compareValue << 0U)); +} + +/** + * @brief 读取捕捉/比较通道2寄存器值 + * @rmtoll CCR2 FL_ATIM_ReadCompareCH2 + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ATIM_ReadCompareCH2(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CCR2, 0xffffU) >> 0U); +} + +/** + * @brief 捕捉/比较通道3寄存器配置 + * @rmtoll CCR3 FL_ATIM_WriteCompareCH3 + * @param TIMx TIM instance + * @param compareValue + * @retval None + */ +__STATIC_INLINE void FL_ATIM_WriteCompareCH3(ATIM_Type *TIMx, uint32_t compareValue) +{ + MODIFY_REG(TIMx->CCR3, (0xffffU << 0U), (compareValue << 0U)); +} + +/** + * @brief 读取捕捉/比较通道3寄存器值 + * @rmtoll CCR3 FL_ATIM_ReadCompareCH3 + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ATIM_ReadCompareCH3(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CCR3, 0xffffU) >> 0U); +} + +/** + * @brief 捕捉/比较通道4寄存器配置 + * @rmtoll CCR4 FL_ATIM_WriteCompareCH4 + * @param TIMx TIM instance + * @param compareValue + * @retval None + */ +__STATIC_INLINE void FL_ATIM_WriteCompareCH4(ATIM_Type *TIMx, uint32_t compareValue) +{ + MODIFY_REG(TIMx->CCR4, (0xffffU << 0U), (compareValue << 0U)); +} + +/** + * @brief 读取捕捉/比较通道4寄存器值 + * @rmtoll CCR4 FL_ATIM_ReadCompareCH4 + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ATIM_ReadCompareCH4(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CCR4, 0xffffU) >> 0U); +} + +/** + * @brief 设置DMA Burst长度 + * @rmtoll DCR DBL FL_ATIM_SetDMABurstLength + * @param TIMx TIM instance + * @param length This parameter can be one of the following values: + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_1 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_2 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_3 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_4 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_5 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_6 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_7 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_8 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_9 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_10 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_11 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_12 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_13 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_14 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_15 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_16 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_17 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_18 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetDMABurstLength(ATIM_Type *TIMx, uint32_t length) +{ + MODIFY_REG(TIMx->DCR, ATIM_DCR_DBL_Msk, length); +} + +/** + * @brief 读取DMA Burst长度 + * @rmtoll DCR DBL FL_ATIM_GetDMABurstLength + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_1 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_2 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_3 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_4 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_5 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_6 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_7 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_8 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_9 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_10 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_11 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_12 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_13 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_14 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_15 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_16 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_17 + * @arg @ref FL_ATIM_DMA_BURST_LENGTH_18 + */ +__STATIC_INLINE uint32_t FL_ATIM_GetDMABurstLength(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DCR, ATIM_DCR_DBL_Msk)); +} + +/** + * @brief 设置指向DMA寄存器的偏移地址 + * @rmtoll DCR DBA FL_ATIM_SetDMABurstAddress + * @param TIMx TIM instance + * @param address This parameter can be one of the following values: + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CR1 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CR2 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_SMCR + * @arg @ref FL_ATIM_DMA_BURST_ADDR_DIER + * @arg @ref FL_ATIM_DMA_BURST_ADDR_SR + * @arg @ref FL_ATIM_DMA_BURST_ADDR_EGR + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCMR1 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCMR2 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCER + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CNT + * @arg @ref FL_ATIM_DMA_BURST_ADDR_PSC + * @arg @ref FL_ATIM_DMA_BURST_ADDR_ARR + * @arg @ref FL_ATIM_DMA_BURST_ADDR_RCR + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCR1 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCR2 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCR3 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCR4 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_BDTR + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetDMABurstAddress(ATIM_Type *TIMx, uint32_t address) +{ + MODIFY_REG(TIMx->DCR, ATIM_DCR_DBA_Msk, address); +} + +/** + * @brief 读取指向DMA寄存器的偏移地址 + * @rmtoll DCR DBA FL_ATIM_GetDMABurstAddress + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CR1 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CR2 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_SMCR + * @arg @ref FL_ATIM_DMA_BURST_ADDR_DIER + * @arg @ref FL_ATIM_DMA_BURST_ADDR_SR + * @arg @ref FL_ATIM_DMA_BURST_ADDR_EGR + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCMR1 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCMR2 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCER + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CNT + * @arg @ref FL_ATIM_DMA_BURST_ADDR_PSC + * @arg @ref FL_ATIM_DMA_BURST_ADDR_ARR + * @arg @ref FL_ATIM_DMA_BURST_ADDR_RCR + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCR1 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCR2 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCR3 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_CCR4 + * @arg @ref FL_ATIM_DMA_BURST_ADDR_BDTR + */ +__STATIC_INLINE uint32_t FL_ATIM_GetDMABurstAddress(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DCR, ATIM_DCR_DBA_Msk)); +} + +/** + * @brief 配置DMA burst访问寄存器 + * @rmtoll DMAR FL_ATIM_WriteDMAAddress + * @param TIMx TIM instance + * @param address + * @retval None + */ +__STATIC_INLINE void FL_ATIM_WriteDMAAddress(ATIM_Type *TIMx, uint32_t address) +{ + MODIFY_REG(TIMx->DMAR, (0xffffffffU << 0U), (address << 0U)); +} + +/** + * @brief 读取DMA burst访问寄存器值 + * @rmtoll DMAR FL_ATIM_ReadDMAAddress + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ATIM_ReadDMAAddress(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DMAR, 0xffffffffU) >> 0U); +} + +/** + * @brief 输出比较清零使能 + * @rmtoll CCMR OCCE FL_ATIM_OC_EnableClear + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_EnableClear(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + SET_BIT(TIMx->CCMR1, (ATIM_CCMR_OCCE_Msk << (channel * 8))); + } + else + { + SET_BIT(TIMx->CCMR2, (ATIM_CCMR_OCCE_Msk << ((channel - 2) * 8))); + } +} + +/** + * @brief 读取输出比较清零使能状态 + * @rmtoll CCMR OCCE FL_ATIM_OC_IsEnabledClear + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_OC_IsEnabledClear(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + return (uint32_t)(READ_BIT(TIMx->CCMR1, (ATIM_CCMR_OCCE_Msk << (channel * 8))) == (ATIM_CCMR_OCCE_Msk << (channel * 8))); + } + else + { + return (uint32_t)(READ_BIT(TIMx->CCMR2, (ATIM_CCMR_OCCE_Msk << ((channel - 2) * 8))) == (ATIM_CCMR_OCCE_Msk << ((channel - 2) * 8))); + } +} + +/** + * @brief 输出比较清零禁用 + * @rmtoll CCMR OCCE FL_ATIM_OC_DisableClear + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_DisableClear(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + CLEAR_BIT(TIMx->CCMR1, (ATIM_CCMR_OCCE_Msk << (channel * 8))); + } + else + { + CLEAR_BIT(TIMx->CCMR2, (ATIM_CCMR_OCCE_Msk << ((channel - 2) * 8))); + } +} + +/** + * @brief 输出比较模式配置 + * @rmtoll CCMR OCM FL_ATIM_OC_SetMode + * @param TIMx TIM instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_ATIM_OC_MODE_FROZEN + * @arg @ref FL_ATIM_OC_MODE_ACTIVE + * @arg @ref FL_ATIM_OC_MODE_INACTIVE + * @arg @ref FL_ATIM_OC_MODE_TOGGLE + * @arg @ref FL_ATIM_OC_MODE_FORCED_INACTIVE + * @arg @ref FL_ATIM_OC_MODE_FORCED_ACTIVE + * @arg @ref FL_ATIM_OC_MODE_PWM1 + * @arg @ref FL_ATIM_OC_MODE_PWM2 + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_SetMode(ATIM_Type *TIMx, uint32_t mode, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + MODIFY_REG(TIMx->CCMR1, (ATIM_CCMR_OCM_Msk << (channel * 8)), (mode << (channel * 8))); + } + else + { + MODIFY_REG(TIMx->CCMR2, (ATIM_CCMR_OCM_Msk << ((channel - 2) * 8)), (mode << ((channel - 2) * 8))); + } +} + +/** + * @brief 读取输出比较模式配置值 + * @rmtoll CCMR OCM FL_ATIM_OC_GetMode + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_OC_MODE_FROZEN + * @arg @ref FL_ATIM_OC_MODE_ACTIVE + * @arg @ref FL_ATIM_OC_MODE_INACTIVE + * @arg @ref FL_ATIM_OC_MODE_TOGGLE + * @arg @ref FL_ATIM_OC_MODE_FORCED_INACTIVE + * @arg @ref FL_ATIM_OC_MODE_FORCED_ACTIVE + * @arg @ref FL_ATIM_OC_MODE_PWM1 + * @arg @ref FL_ATIM_OC_MODE_PWM2 + */ +__STATIC_INLINE uint32_t FL_ATIM_OC_GetMode(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + return (uint32_t)(READ_BIT(TIMx->CCMR1, (ATIM_CCMR_OCM_Msk << (channel * 8)))); + } + else + { + return (uint32_t)(READ_BIT(TIMx->CCMR2, (ATIM_CCMR_OCM_Msk << ((channel - 2) * 8)))); + } +} + +/** + * @brief 输出比较预装载使能 + * @rmtoll CCMR OCPE FL_ATIM_OC_EnablePreload + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_EnablePreload(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + SET_BIT(TIMx->CCMR1, (ATIM_CCMR_OCPE_Msk << (channel * 8))); + } + else + { + SET_BIT(TIMx->CCMR2, (ATIM_CCMR_OCPE_Msk << ((channel - 2) * 8))); + } +} + +/** + * @brief 读取输出比较预装载使能状态 + * @rmtoll CCMR OCPE FL_ATIM_OC_IsEnabledPreload + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_OC_IsEnabledPreload(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + return (uint32_t)(READ_BIT(TIMx->CCMR1, (ATIM_CCMR_OCPE_Msk << (channel * 8))) == (ATIM_CCMR_OCPE_Msk << (channel * 8))); + } + else + { + return (uint32_t)(READ_BIT(TIMx->CCMR2, (ATIM_CCMR_OCPE_Msk << ((channel - 2) * 8))) == (ATIM_CCMR_OCPE_Msk << ((channel - 2) * 8))); + } +} + +/** + * @brief 输出比较预装载禁用 + * @rmtoll CCMR OCPE FL_ATIM_OC_DisablePreload + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_DisablePreload(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + CLEAR_BIT(TIMx->CCMR1, (ATIM_CCMR_OCPE_Msk << (channel * 8))); + } + else + { + CLEAR_BIT(TIMx->CCMR2, (ATIM_CCMR_OCPE_Msk << ((channel - 2) * 8))); + } +} + +/** + * @brief 输出比较快速使能 + * @rmtoll CCMR OCFE FL_ATIM_OC_EnableFastMode + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_EnableFastMode(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + SET_BIT(TIMx->CCMR1, (ATIM_CCMR_OCFE_Msk << (channel * 8))); + } + else + { + SET_BIT(TIMx->CCMR2, (ATIM_CCMR_OCFE_Msk << ((channel - 2) * 8))); + } +} + +/** + * @brief 获取输出比较快速使能状态 + * @rmtoll CCMR OCFE FL_ATIM_OC_IsEnabledFastMode + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_OC_IsEnabledFastMode(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + return (uint32_t)(READ_BIT(TIMx->CCMR1, (ATIM_CCMR_OCFE_Msk << (channel * 8))) == (ATIM_CCMR_OCFE_Msk << (channel * 8))); + } + else + { + return (uint32_t)(READ_BIT(TIMx->CCMR2, (ATIM_CCMR_OCFE_Msk << ((channel - 2) * 8))) == (ATIM_CCMR_OCFE_Msk << ((channel - 2) * 8))); + } +} + +/** + * @brief 输出比较快速禁用 + * @rmtoll CCMR OCFE FL_ATIM_OC_DisableFastMode + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_DisableFastMode(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + CLEAR_BIT(TIMx->CCMR1, (ATIM_CCMR_OCFE_Msk << (channel * 8))); + } + else + { + CLEAR_BIT(TIMx->CCMR2, (ATIM_CCMR_OCFE_Msk << ((channel - 2) * 8))); + } +} + +/** + * @brief 设置输入捕捉滤波器 + * @rmtoll CCMR ICF FL_ATIM_IC_SetFilter + * @param TIMx TIM instance + * @param filter This parameter can be one of the following values: + * @arg @ref FL_ATIM_IC_FILTER_DIV1 + * @arg @ref FL_ATIM_IC_FILTER_DIV1_N2 + * @arg @ref FL_ATIM_IC_FILTER_DIV1_N4 + * @arg @ref FL_ATIM_IC_FILTER_DIV1_N8 + * @arg @ref FL_ATIM_IC_FILTER_DIV2_N6 + * @arg @ref FL_ATIM_IC_FILTER_DIV2_N8 + * @arg @ref FL_ATIM_IC_FILTER_DIV4_N6 + * @arg @ref FL_ATIM_IC_FILTER_DIV4_N8 + * @arg @ref FL_ATIM_IC_FILTER_DIV8_N6 + * @arg @ref FL_ATIM_IC_FILTER_DIV8_N8 + * @arg @ref FL_ATIM_IC_FILTER_DIV16_N5 + * @arg @ref FL_ATIM_IC_FILTER_DIV16_N6 + * @arg @ref FL_ATIM_IC_FILTER_DIV16_N8 + * @arg @ref FL_ATIM_IC_FILTER_DIV32_N5 + * @arg @ref FL_ATIM_IC_FILTER_DIV32_N6 + * @arg @ref FL_ATIM_IC_FILTER_DIV32_N8 + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_IC_SetFilter(ATIM_Type *TIMx, uint32_t filter, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + MODIFY_REG(TIMx->CCMR1, (ATIM_CCMR_ICF_Msk << (channel * 8)), (filter << (channel * 8))); + } + else + { + MODIFY_REG(TIMx->CCMR2, (ATIM_CCMR_ICF_Msk << ((channel - 2) * 8)), (filter << ((channel - 2) * 8))); + } +} + +/** + * @brief 读取输入滤波器值 + * @rmtoll CCMR ICF FL_ATIM_IC_GetFilter + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_IC_FILTER_DIV1 + * @arg @ref FL_ATIM_IC_FILTER_DIV1_N2 + * @arg @ref FL_ATIM_IC_FILTER_DIV1_N4 + * @arg @ref FL_ATIM_IC_FILTER_DIV1_N8 + * @arg @ref FL_ATIM_IC_FILTER_DIV2_N6 + * @arg @ref FL_ATIM_IC_FILTER_DIV2_N8 + * @arg @ref FL_ATIM_IC_FILTER_DIV4_N6 + * @arg @ref FL_ATIM_IC_FILTER_DIV4_N8 + * @arg @ref FL_ATIM_IC_FILTER_DIV8_N6 + * @arg @ref FL_ATIM_IC_FILTER_DIV8_N8 + * @arg @ref FL_ATIM_IC_FILTER_DIV16_N5 + * @arg @ref FL_ATIM_IC_FILTER_DIV16_N6 + * @arg @ref FL_ATIM_IC_FILTER_DIV16_N8 + * @arg @ref FL_ATIM_IC_FILTER_DIV32_N5 + * @arg @ref FL_ATIM_IC_FILTER_DIV32_N6 + * @arg @ref FL_ATIM_IC_FILTER_DIV32_N8 + */ +__STATIC_INLINE uint32_t FL_ATIM_IC_GetFilter(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + return (uint32_t)(READ_BIT(TIMx->CCMR1, (ATIM_CCMR_ICF_Msk << (channel * 8)))); + } + else + { + return (uint32_t)(READ_BIT(TIMx->CCMR2, (ATIM_CCMR_ICF_Msk << ((channel - 2) * 8)))); + } +} + +/** + * @brief 设置输入捕捉预分频 + * @rmtoll CCMR ICPSC FL_ATIM_IC_SetPrescaler + * @param TIMx TIM instance + * @param psc This parameter can be one of the following values: + * @arg @ref FL_ATIM_IC_PSC_DIV1 + * @arg @ref FL_ATIM_IC_PSC_DIV2 + * @arg @ref FL_ATIM_IC_PSC_DIV4 + * @arg @ref FL_ATIM_IC_PSC_DIV8 + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_IC_SetPrescaler(ATIM_Type *TIMx, uint32_t psc, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + MODIFY_REG(TIMx->CCMR1, (ATIM_CCMR_ICPSC_Msk << (channel * 8)), (psc << (channel * 8))); + } + else + { + MODIFY_REG(TIMx->CCMR2, (ATIM_CCMR_ICPSC_Msk << ((channel - 2) * 8)), (psc << ((channel - 2) * 8))); + } +} + +/** + * @brief 读取输入捕捉预分频值 + * @rmtoll CCMR ICPSC FL_ATIM_IC_GetPrescaler + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_IC_PSC_DIV1 + * @arg @ref FL_ATIM_IC_PSC_DIV2 + * @arg @ref FL_ATIM_IC_PSC_DIV4 + * @arg @ref FL_ATIM_IC_PSC_DIV8 + */ +__STATIC_INLINE uint32_t FL_ATIM_IC_GetPrescaler(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + return (uint32_t)(READ_BIT(TIMx->CCMR1, (ATIM_CCMR_ICPSC_Msk << (channel * 8)))); + } + else + { + return (uint32_t)(READ_BIT(TIMx->CCMR2, (ATIM_CCMR_ICPSC_Msk << ((channel - 2) * 8)))); + } +} + +/** + * @brief 捕捉/比较通道选择 + * @rmtoll CCMR CCS FL_ATIM_CC_SetChannelMode + * @param TIMx TIM instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_MODE_OUTPUT + * @arg @ref FL_ATIM_CHANNEL_MODE_INPUT_NORMAL + * @arg @ref FL_ATIM_CHANNEL_MODE_INPUT_CROSSOVER + * @arg @ref FL_ATIM_CHANNEL_MODE_INPUT_TRC + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_CC_SetChannelMode(ATIM_Type *TIMx, uint32_t mode, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + MODIFY_REG(TIMx->CCMR1, (ATIM_CCMR_CCS_Msk << (channel * 8)), (mode << (channel * 8))); + } + else + { + MODIFY_REG(TIMx->CCMR2, (ATIM_CCMR_CCS_Msk << ((channel - 2) * 8)), (mode << ((channel - 2) * 8))); + } +} + +/** + * @brief 获取捕捉/比较通道 + * @rmtoll CCMR CCS FL_ATIM_CC_GetChannelMode + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_MODE_OUTPUT + * @arg @ref FL_ATIM_CHANNEL_MODE_INPUT_NORMAL + * @arg @ref FL_ATIM_CHANNEL_MODE_INPUT_CROSSOVER + * @arg @ref FL_ATIM_CHANNEL_MODE_INPUT_TRC + */ +__STATIC_INLINE uint32_t FL_ATIM_CC_GetChannelMode(ATIM_Type *TIMx, uint32_t channel) +{ + if(channel < FL_ATIM_CHANNEL_3) + { + return (uint32_t)(READ_BIT(TIMx->CCMR1, (ATIM_CCMR_CCS_Msk << (channel * 8)))); + } + else + { + return (uint32_t)(READ_BIT(TIMx->CCMR2, (ATIM_CCMR_CCS_Msk << ((channel - 2) * 8)))); + } +} + +/** + * @brief 设置捕捉/比较互补输出极性 + * @note + * @rmtoll CCER CCNP FL_ATIM_OC_SetReverseChannelPolarity + * @param TIMx TIM instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_ATIM_OCN_POLARITY_NORMAL + * @arg @ref FL_ATIM_OCN_POLARITY_INVERT + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_SetReverseChannelPolarity(ATIM_Type *TIMx, uint32_t polarity, uint32_t channel) +{ + MODIFY_REG(TIMx->CCER, (ATIM_CCER_CCNP_Msk << (channel * 4)), (polarity << (channel * 4))); +} + +/** + * @brief 读取捕捉/比较互补输出极性 + * @note + * @rmtoll CCER CCNP FL_ATIM_OC_GetReverseChannelPolarity + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_OCN_POLARITY_NORMAL + * @arg @ref FL_ATIM_OCN_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_ATIM_OC_GetReverseChannelPolarity(ATIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->CCER, (ATIM_CCER_CCNP_Msk << (channel * 4)))); +} + +/** + * @brief 捕捉/比较互补输出使能 + * @note + * @rmtoll CCER CCNE FL_ATIM_OC_EnableReverseChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_EnableReverseChannel(ATIM_Type *TIMx, uint32_t channel) +{ + SET_BIT(TIMx->CCER, (ATIM_CCER_CCNE_Msk << (channel * 4))); +} + +/** + * @brief 读取捕捉/比较互补输出使能状态 + * @note + * @rmtoll CCER CCNE FL_ATIM_OC_IsEnabledReverseChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_OC_IsEnabledReverseChannel(ATIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->CCER, (ATIM_CCER_CCNE_Msk << (channel * 4))) == (ATIM_CCER_CCNE_Msk << (channel * 4))); +} + +/** + * @brief 捕捉/比较互补输出禁用 + * @note + * @rmtoll CCER CCNE FL_ATIM_OC_DisableReverseChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_DisableReverseChannel(ATIM_Type *TIMx, uint32_t channel) +{ + CLEAR_BIT(TIMx->CCER, (ATIM_CCER_CCNE_Msk << (channel * 4))); +} + +/** + * @brief CC1通道配置为输出时,设置捕捉/比较输出极性 + * @rmtoll CCER CCOP FL_ATIM_OC_SetChannelPolarity + * @param TIMx TIM instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_ATIM_OC_POLARITY_NORMAL + * @arg @ref FL_ATIM_OC_POLARITY_INVERT + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_SetChannelPolarity(ATIM_Type *TIMx, uint32_t polarity, uint32_t channel) +{ + MODIFY_REG(TIMx->CCER, (ATIM_CCER_CCOP_Msk << (channel * 4)), (polarity << (channel * 4))); +} + +/** + * @brief CC1通道配置为输出时,读取捕捉/比较输出极性 + * @rmtoll CCER CCOP FL_ATIM_OC_GetChannelPolarity + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_OC_POLARITY_NORMAL + * @arg @ref FL_ATIM_OC_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_ATIM_OC_GetChannelPolarity(ATIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->CCER, (ATIM_CCER_CCOP_Msk << (channel * 4)))); +} + +/** + * @brief CC1通道配置为输入时,设置捕捉/比较输出极性 + * @rmtoll CCER CCIP FL_ATIM_IC_SetChannelPolarity + * @param TIMx TIM instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_ATIM_IC_POLARITY_NORMAL + * @arg @ref FL_ATIM_IC_POLARITY_INVERT + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_IC_SetChannelPolarity(ATIM_Type *TIMx, uint32_t polarity, uint32_t channel) +{ + MODIFY_REG(TIMx->CCER, (ATIM_CCER_CCIP_Msk << (channel * 4)), (polarity << (channel * 4))); +} + +/** + * @brief CC1通道配置为输入时,设置捕捉/比较输出极性 + * @rmtoll CCER CCIP FL_ATIM_IC_GetChannelPolarity + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_IC_POLARITY_NORMAL + * @arg @ref FL_ATIM_IC_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_ATIM_IC_GetChannelPolarity(ATIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->CCER, (ATIM_CCER_CCIP_Msk << (channel * 4)))); +} + +/** + * @brief CC1通道配置为输出时,捕捉/比较输出使能 + * @rmtoll CCER CCOE FL_ATIM_OC_EnableChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_EnableChannel(ATIM_Type *TIMx, uint32_t channel) +{ + SET_BIT(TIMx->CCER, (ATIM_CCER_CCOE_Msk << (channel * 4))); +} + +/** + * @brief CC1通道配置为输出时,读取捕捉/比较输出使能状态 + * @rmtoll CCER CCOE FL_ATIM_OC_IsEnabledChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_OC_IsEnabledChannel(ATIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->CCER, (ATIM_CCER_CCOE_Msk << (channel * 4))) == (ATIM_CCER_CCOE_Msk << (channel * 4))); +} + +/** + * @brief CC1通道配置为输出时,捕捉/比较输出禁用 + * @rmtoll CCER CCOE FL_ATIM_OC_DisableChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_OC_DisableChannel(ATIM_Type *TIMx, uint32_t channel) +{ + CLEAR_BIT(TIMx->CCER, (ATIM_CCER_CCOE_Msk << (channel * 4))); +} + +/** + * @brief CC1通道配置为输入时,捕捉/比较输出使能 + * @rmtoll CCER CCIE FL_ATIM_IC_EnableChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_IC_EnableChannel(ATIM_Type *TIMx, uint32_t channel) +{ + SET_BIT(TIMx->CCER, (ATIM_CCER_CCIE_Msk << (channel * 4))); +} + +/** + * @brief CC1通道配置为输入时,读取捕捉/比较输出使能状态 + * @rmtoll CCER CCIE FL_ATIM_IC_IsEnabledChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IC_IsEnabledChannel(ATIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->CCER, (ATIM_CCER_CCIE_Msk << (channel * 4))) == (ATIM_CCER_CCIE_Msk << (channel * 4))); +} + +/** + * @brief CC1通道配置为输入时,捕捉/比较输出禁用 + * @rmtoll CCER CCIE FL_ATIM_IC_DisableChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_IC_DisableChannel(ATIM_Type *TIMx, uint32_t channel) +{ + CLEAR_BIT(TIMx->CCER, (ATIM_CCER_CCIE_Msk << (channel * 4))); +} + +/** + * @brief 设置重复计数值 + * @note + * @rmtoll RCR FL_ATIM_WriteRepetitionCounter + * @param TIMx TIM instance + * @param repeatCounter + * @retval None + */ +__STATIC_INLINE void FL_ATIM_WriteRepetitionCounter(ATIM_Type *TIMx, uint32_t repeatCounter) +{ + MODIFY_REG(TIMx->RCR, (0xffU << 0U), (repeatCounter << 0U)); +} + +/** + * @brief 读取重复计数值 + * @note + * @rmtoll RCR FL_ATIM_ReadRepetitionCounter + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ATIM_ReadRepetitionCounter(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->RCR, 0xffU) >> 0U); +} + +/** + * @brief 主控输出使能 + * @note + * @rmtoll BDTR MOE FL_ATIM_EnableALLOutput + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableALLOutput(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->BDTR, ATIM_BDTR_MOE_Msk); +} + +/** + * @brief 读取主控输出使能状态 + * @note + * @rmtoll BDTR MOE FL_ATIM_IsEnabledALLOutput + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledALLOutput(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BDTR, ATIM_BDTR_MOE_Msk) == ATIM_BDTR_MOE_Msk); +} + +/** + * @brief 主控输出禁用 + * @note + * @rmtoll BDTR MOE FL_ATIM_DisableALLOutput + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableALLOutput(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->BDTR, ATIM_BDTR_MOE_Msk); +} + +/** + * @brief 自动输出使能 + * @note + * @rmtoll BDTR AOE FL_ATIM_EnableAutomaticOutput + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableAutomaticOutput(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->BDTR, ATIM_BDTR_AOE_Msk); +} + +/** + * @brief 读取自动输出使能状态 + * @note + * @rmtoll BDTR AOE FL_ATIM_IsEnabledAutomaticOutput + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledAutomaticOutput(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BDTR, ATIM_BDTR_AOE_Msk) == ATIM_BDTR_AOE_Msk); +} + +/** + * @brief 自动输出禁用 + * @note + * @rmtoll BDTR AOE FL_ATIM_DisableAutomaticOutput + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableAutomaticOutput(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->BDTR, ATIM_BDTR_AOE_Msk); +} + +/** + * @brief 设置刹车极性 + * @note + * @rmtoll BDTR BKP FL_ATIM_SetBreakPolarity + * @param TIMx TIM instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_ATIM_BREAK_POLARITY_LOW + * @arg @ref FL_ATIM_BREAK_POLARITY_HIGH + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetBreakPolarity(ATIM_Type *TIMx, uint32_t polarity) +{ + MODIFY_REG(TIMx->BDTR, ATIM_BDTR_BKP_Msk, polarity); +} + +/** + * @brief 读取刹车极性 + * @note + * @rmtoll BDTR BKP FL_ATIM_GetBreakPolarity + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_BREAK_POLARITY_LOW + * @arg @ref FL_ATIM_BREAK_POLARITY_HIGH + */ +__STATIC_INLINE uint32_t FL_ATIM_GetBreakPolarity(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BDTR, ATIM_BDTR_BKP_Msk)); +} + +/** + * @brief 刹车使能 + * @note + * @rmtoll BDTR BKE FL_ATIM_EnableBreak + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableBreak(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->BDTR, ATIM_BDTR_BKE_Msk); +} + +/** + * @brief 读取刹车使能状态 + * @note + * @rmtoll BDTR BKE FL_ATIM_IsEnabledBreak + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledBreak(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BDTR, ATIM_BDTR_BKE_Msk) == ATIM_BDTR_BKE_Msk); +} + +/** + * @brief 刹车禁用 + * @note + * @rmtoll BDTR BKE FL_ATIM_DisableBreak + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableBreak(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->BDTR, ATIM_BDTR_BKE_Msk); +} + +/** + * @brief 运行状态下的输出关闭状态选择 + * @note + * @rmtoll BDTR OSSR FL_ATIM_SetOffStateRun + * @param TIMx TIM instance + * @param state This parameter can be one of the following values: + * @arg @ref FL_ATIM_OSSR_DISABLE + * @arg @ref FL_ATIM_OSSR_ENABLE + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetOffStateRun(ATIM_Type *TIMx, uint32_t state) +{ + MODIFY_REG(TIMx->BDTR, ATIM_BDTR_OSSR_Msk, state); +} + +/** + * @brief 读取运行状态下的输出关闭状态选择 + * @note + * @rmtoll BDTR OSSR FL_ATIM_GetOffStateRun + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_OSSR_DISABLE + * @arg @ref FL_ATIM_OSSR_ENABLE + */ +__STATIC_INLINE uint32_t FL_ATIM_GetOffStateRun(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BDTR, ATIM_BDTR_OSSR_Msk)); +} + +/** + * @brief IDLE状态下的输出关闭状态选择 + * @note + * @rmtoll BDTR OSSI FL_ATIM_SetOffStateIdle + * @param TIMx TIM instance + * @param state This parameter can be one of the following values: + * @arg @ref FL_ATIM_OSSI_DISABLE + * @arg @ref FL_ATIM_OSSI_ENABLE + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetOffStateIdle(ATIM_Type *TIMx, uint32_t state) +{ + MODIFY_REG(TIMx->BDTR, ATIM_BDTR_OSSI_Msk, state); +} + +/** + * @brief IDLE状态下的输出关闭状态选择 + * @note + * @rmtoll BDTR OSSI FL_ATIM_GetOffStateIdle + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_OSSI_DISABLE + * @arg @ref FL_ATIM_OSSI_ENABLE + */ +__STATIC_INLINE uint32_t FL_ATIM_GetOffStateIdle(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BDTR, ATIM_BDTR_OSSI_Msk)); +} + +/** + * @brief 设置寄存器写保护等级 + * @note + * @rmtoll BDTR LOCK FL_ATIM_SetLockLevel + * @param TIMx TIM instance + * @param lockLevel This parameter can be one of the following values: + * @arg @ref FL_ATIM_LOCK_LEVEL_OFF + * @arg @ref FL_ATIM_LOCK_LEVEL_1 + * @arg @ref FL_ATIM_LOCK_LEVEL_2 + * @arg @ref FL_ATIM_LOCK_LEVEL_3 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetLockLevel(ATIM_Type *TIMx, uint32_t lockLevel) +{ + MODIFY_REG(TIMx->BDTR, ATIM_BDTR_LOCK_Msk, lockLevel); +} + +/** + * @brief 读取寄存器写保护配置状态 + * @note + * @rmtoll BDTR LOCK FL_ATIM_GetLockLevel + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_LOCK_LEVEL_OFF + * @arg @ref FL_ATIM_LOCK_LEVEL_1 + * @arg @ref FL_ATIM_LOCK_LEVEL_2 + * @arg @ref FL_ATIM_LOCK_LEVEL_3 + */ +__STATIC_INLINE uint32_t FL_ATIM_GetLockLevel(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BDTR, ATIM_BDTR_LOCK_Msk)); +} + +/** + * @brief 设置死区时间长度 + * @note + * @rmtoll BDTR DTG FL_ATIM_WriteDeadTime + * @param TIMx TIM instance + * @param deadTime + * @retval None + */ +__STATIC_INLINE void FL_ATIM_WriteDeadTime(ATIM_Type *TIMx, uint32_t deadTime) +{ + MODIFY_REG(TIMx->BDTR, (0xffU << 0U), (deadTime << 0U)); +} + +/** + * @brief 读取死区时间长度 + * @note + * @rmtoll BDTR DTG FL_ATIM_ReadDeadTime + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_ATIM_ReadDeadTime(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BDTR, 0xffU) >> 0U); +} + +/** + * @brief 设置ATIM_BRK1引脚输入门控信号 + * @note + * @rmtoll BKCR BRK1GATE FL_ATIM_SetBreak1GateState + * @param TIMx TIM instance + * @param state This parameter can be one of the following values: + * @arg @ref FL_ATIM_BREAK1_GATE_LOW + * @arg @ref FL_ATIM_BREAK1_GATE_AUTO + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetBreak1GateState(ATIM_Type *TIMx, uint32_t state) +{ + MODIFY_REG(TIMx->BKCR, ATIM_BKCR_BRK1GATE_Msk, state); +} + +/** + * @brief 读取ATIM_BRK1引脚输入门控信号 + * @note + * @rmtoll BKCR BRK1GATE FL_ATIM_GetBreak1GateState + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_BREAK1_GATE_LOW + * @arg @ref FL_ATIM_BREAK1_GATE_AUTO + */ +__STATIC_INLINE uint32_t FL_ATIM_GetBreak1GateState(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BKCR, ATIM_BKCR_BRK1GATE_Msk)); +} + +/** + * @brief 设置ATIM_BRK2引脚输入门控信号 + * @note + * @rmtoll BKCR BRK2GATE FL_ATIM_SetBreak2GateState + * @param TIMx TIM instance + * @param state This parameter can be one of the following values: + * @arg @ref FL_ATIM_BREAK2_GATE_LOW + * @arg @ref FL_ATIM_BREAK2_GATE_AUTO + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetBreak2GateState(ATIM_Type *TIMx, uint32_t state) +{ + MODIFY_REG(TIMx->BKCR, ATIM_BKCR_BRK2GATE_Msk, state); +} + +/** + * @brief 读取ATIM_BRK2引脚输入门控信号 + * @note + * @rmtoll BKCR BRK2GATE FL_ATIM_GetBreak2GateState + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_BREAK2_GATE_LOW + * @arg @ref FL_ATIM_BREAK2_GATE_AUTO + */ +__STATIC_INLINE uint32_t FL_ATIM_GetBreak2GateState(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BKCR, ATIM_BKCR_BRK2GATE_Msk)); +} + +/** + * @brief 设置刹车信号的滤波时钟和长度选择 + * @note + * @rmtoll BKCR BRKF FL_ATIM_SetBreakFilter + * @param TIMx TIM instance + * @param filter This parameter can be one of the following values: + * @arg @ref FL_ATIM_BREAK_FILTER_DIV1 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV1_N2 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV1_N4 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV1_N8 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV2_N6 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV2_N8 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV4_N6 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV4_N8 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV8_N6 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV8_N8 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV16_N5 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV16_N6 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV16_N8 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV32_N5 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV32_N6 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV32_N8 + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetBreakFilter(ATIM_Type *TIMx, uint32_t filter) +{ + MODIFY_REG(TIMx->BKCR, ATIM_BKCR_BRKF_Msk, filter); +} + +/** + * @brief 读取刹车信号的滤波时钟和长度选择 + * @note + * @rmtoll BKCR BRKF FL_ATIM_GetBreakFilter + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_BREAK_FILTER_DIV1 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV1_N2 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV1_N4 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV1_N8 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV2_N6 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV2_N8 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV4_N6 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV4_N8 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV8_N6 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV8_N8 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV16_N5 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV16_N6 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV16_N8 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV32_N5 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV32_N6 + * @arg @ref FL_ATIM_BREAK_FILTER_DIV32_N8 + */ +__STATIC_INLINE uint32_t FL_ATIM_GetBreakFilter(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BKCR, ATIM_BKCR_BRKF_Msk)); +} + +/** + * @brief 刹车组合控制 + * @note + * @rmtoll BKCR BRKCOMB FL_ATIM_SetBreakSignalCombination + * @param TIMx TIM instance + * @param filter This parameter can be one of the following values: + * @arg @ref FL_ATIM_BREAK_COMBINATION_OR + * @arg @ref FL_ATIM_BREAK_COMBINATION_AND + * @retval None + */ +__STATIC_INLINE void FL_ATIM_SetBreakSignalCombination(ATIM_Type *TIMx, uint32_t filter) +{ + MODIFY_REG(TIMx->BKCR, ATIM_BKCR_BRKCOMB_Msk, filter); +} + +/** + * @brief 读取刹车组合控制状态 + * @note + * @rmtoll BKCR BRKCOMB FL_ATIM_GetBreakSignalCombination + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_ATIM_BREAK_COMBINATION_OR + * @arg @ref FL_ATIM_BREAK_COMBINATION_AND + */ +__STATIC_INLINE uint32_t FL_ATIM_GetBreakSignalCombination(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BKCR, ATIM_BKCR_BRKCOMB_Msk)); +} + +/** + * @brief XTHF停振检测刹车信号使能 + * @note + * @rmtoll BKCR HFDET_BRKEN FL_ATIM_EnableHFDETBreak + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableHFDETBreak(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->BKCR, ATIM_BKCR_HFDET_BRKEN_Msk); +} + +/** + * @brief 读取XTHF停振检测刹车信号使能状态 + * @note + * @rmtoll BKCR HFDET_BRKEN FL_ATIM_IsEnabledHFDETBreak + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledHFDETBreak(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BKCR, ATIM_BKCR_HFDET_BRKEN_Msk) == ATIM_BKCR_HFDET_BRKEN_Msk); +} + +/** + * @brief XTHF停振检测刹车信号禁用 + * @note + * @rmtoll BKCR HFDET_BRKEN FL_ATIM_DisableHFDETBreak + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableHFDETBreak(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->BKCR, ATIM_BKCR_HFDET_BRKEN_Msk); +} + +/** + * @brief SVD刹车信号使能 + * @note + * @rmtoll BKCR SVD_BRKEN FL_ATIM_EnableSVDBreak + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableSVDBreak(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->BKCR, ATIM_BKCR_SVD_BRKEN_Msk); +} + +/** + * @brief 读取SVD刹车信号使能状态 + * @note + * @rmtoll BKCR SVD_BRKEN FL_ATIM_IsEnabledSVDBreak + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledSVDBreak(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BKCR, ATIM_BKCR_SVD_BRKEN_Msk) == ATIM_BKCR_SVD_BRKEN_Msk); +} + +/** + * @brief SVD刹车信号禁用 + * @note + * @rmtoll BKCR SVD_BRKEN FL_ATIM_DisableSVDBreak + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableSVDBreak(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->BKCR, ATIM_BKCR_SVD_BRKEN_Msk); +} + +/** + * @brief 比较器输出刹车信号使能 + * @note + * @rmtoll BKCR COMP_BRKEN FL_ATIM_EnableCOMPBreak + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_EnableCOMPBreak(ATIM_Type *TIMx) +{ + SET_BIT(TIMx->BKCR, ATIM_BKCR_COMP_BRKEN_Msk); +} + +/** + * @brief 读取比较器输出刹车信号使能状态 + * @note + * @rmtoll BKCR COMP_BRKEN FL_ATIM_IsEnabledCOMPBreak + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_ATIM_IsEnabledCOMPBreak(ATIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->BKCR, ATIM_BKCR_COMP_BRKEN_Msk) == ATIM_BKCR_COMP_BRKEN_Msk); +} + +/** + * @brief 比较器输出刹车信号禁用 + * @note + * @rmtoll BKCR COMP_BRKEN FL_ATIM_DisableCOMPBreak + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_ATIM_DisableCOMPBreak(ATIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->BKCR, ATIM_BKCR_COMP_BRKEN_Msk); +} + +/** + * @} + */ + +/** @defgroup ATIM_FL_EF_Init Initialization and de-initialization functions + * @{ + */ + +FL_ErrorStatus FL_ATIM_DeInit(ATIM_Type *TIMx); + +void FL_ATIM_StructInit(FL_ATIM_InitTypeDef *TIM_InitStruct); +void FL_ATIM_SlaveModeStructInit(FL_ATIM_SlaveInitTypeDef *TIM_InitStruct); +void FL_ATIM_IC_StructInit(FL_ATIM_IC_InitTypeDef *TIM_ICInitStruct); +void FL_ATIM_OC_StructInit(FL_ATIM_OC_InitTypeDef *TIM_OC_InitStruct); +void FL_ATIM_ETRStructInit(FL_ATIM_ETR_InitTypeDef *TIM_InitStruct); +void FL_ATIM_BDTR_StructInit(FL_ATIM_BDTR_InitTypeDef *TIM_BDTR_InitStruct); + +FL_ErrorStatus FL_ATIM_Init(ATIM_Type *TIMx, FL_ATIM_InitTypeDef *TIM_InitStruct); +FL_ErrorStatus FL_ATIM_IC_Init(ATIM_Type *TIMx, uint32_t Channel, FL_ATIM_IC_InitTypeDef *IC_InitStruct); +FL_ErrorStatus FL_ATIM_ETR_Init(ATIM_Type *TIMx, FL_ATIM_ETR_InitTypeDef *TIM_InitStruct); +FL_ErrorStatus FL_ATIM_SlaveMode_Init(ATIM_Type *TIMx, FL_ATIM_SlaveInitTypeDef *TIM_InitStruct); +FL_ErrorStatus FL_ATIM_OC_Init(ATIM_Type *TIMx, uint32_t Channel, FL_ATIM_OC_InitTypeDef *TIM_OC_InitStruct); +FL_ErrorStatus FL_ATIM_BDTR_Init(ATIM_Type *TIMx, FL_ATIM_BDTR_InitTypeDef *TIM_BDTR_InitStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_ATIM_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-12*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_bstim16.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_bstim16.h new file mode 100644 index 0000000..17d90b1 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_bstim16.h @@ -0,0 +1,481 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_bstim16.h + * @author FMSH Application Team + * @brief Head file of BSTIM16 FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_BSTIM16_H +#define __FM33LG0XX_FL_BSTIM16_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup BSTIM16 BSTIM16 + * @brief BSTIM16 FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup BSTIM16_FL_ES_INIT BSTIM16 Exported Init structures + * @{ + */ + +/** + * @brief FL BSTIM16 Init Sturcture definition + */ + +typedef struct +{ + /* 预分频系数 */ + uint32_t prescaler; + /* 自动重装载值 */ + uint32_t autoReload; + /* 自动重装载值 */ + uint32_t autoReloadState; + + uint32_t clockSource; + +} FL_BSTIM16_InitTypeDef; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup BSTIM16_FL_Exported_Constants BSTIM16 Exported Constants + * @{ + */ + +#define BSTIM16_CR1_ARPE_Pos (7U) +#define BSTIM16_CR1_ARPE_Msk (0x1U << BSTIM16_CR1_ARPE_Pos) +#define BSTIM16_CR1_ARPE BSTIM16_CR1_ARPE_Msk + +#define BSTIM16_CR1_OPM_Pos (3U) +#define BSTIM16_CR1_OPM_Msk (0x1U << BSTIM16_CR1_OPM_Pos) +#define BSTIM16_CR1_OPM BSTIM16_CR1_OPM_Msk + +#define BSTIM16_CR1_URS_Pos (2U) +#define BSTIM16_CR1_URS_Msk (0x1U << BSTIM16_CR1_URS_Pos) +#define BSTIM16_CR1_URS BSTIM16_CR1_URS_Msk + +#define BSTIM16_CR1_UDIS_Pos (1U) +#define BSTIM16_CR1_UDIS_Msk (0x1U << BSTIM16_CR1_UDIS_Pos) +#define BSTIM16_CR1_UDIS BSTIM16_CR1_UDIS_Msk + +#define BSTIM16_CR1_CEN_Pos (0U) +#define BSTIM16_CR1_CEN_Msk (0x1U << BSTIM16_CR1_CEN_Pos) +#define BSTIM16_CR1_CEN BSTIM16_CR1_CEN_Msk + +#define BSTIM16_CR2_MMS_Pos (4U) +#define BSTIM16_CR2_MMS_Msk (0x7U << BSTIM16_CR2_MMS_Pos) +#define BSTIM16_CR2_MMS BSTIM16_CR2_MMS_Msk + +#define BSTIM16_IER_UIE_Pos (0U) +#define BSTIM16_IER_UIE_Msk (0x1U << BSTIM16_IER_UIE_Pos) +#define BSTIM16_IER_UIE BSTIM16_IER_UIE_Msk + +#define BSTIM16_ISR_UIF_Pos (0U) +#define BSTIM16_ISR_UIF_Msk (0x1U << BSTIM16_ISR_UIF_Pos) +#define BSTIM16_ISR_UIF BSTIM16_ISR_UIF_Msk + +#define BSTIM16_EGR_UG_Pos (0U) +#define BSTIM16_EGR_UG_Msk (0x1U << BSTIM16_EGR_UG_Pos) +#define BSTIM16_EGR_UG BSTIM16_EGR_UG_Msk + + + + + + +#define FL_BSTIM16_ONE_PULSE_MODE_CONTINUOUS (0x0U << BSTIM16_CR1_OPM_Pos) +#define FL_BSTIM16_ONE_PULSE_MODE_SINGLE (0x1U << BSTIM16_CR1_OPM_Pos) + + +#define FL_BSTIM16_UPDATE_SOURCE_REGULAR (0x0U << BSTIM16_CR1_URS_Pos) +#define FL_BSTIM16_UPDATE_SOURCE_COUNTER (0x1U << BSTIM16_CR1_URS_Pos) + + +#define FL_BSTIM16_TRGO_UG (0x0U << BSTIM16_CR2_MMS_Pos) +#define FL_BSTIM16_TRGO_ENABLE (0x1U << BSTIM16_CR2_MMS_Pos) +#define FL_BSTIM16_TRGO_UPDATE (0x2U << BSTIM16_CR2_MMS_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup BSTIM16_FL_Exported_Functions BSTIM16 Exported Functions + * @{ + */ + +/** + * @brief Auto-Reload preload enable + * @rmtoll CR1 ARPE FL_BSTIM16_EnableARRPreload + * @param BSTIM16x BSTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_EnableARRPreload(BSTIM16_Type *BSTIM16x) +{ + SET_BIT(BSTIM16x->CR1, BSTIM16_CR1_ARPE_Msk); +} + +/** + * @brief Get Auto-Reload preload enable status + * @rmtoll CR1 ARPE FL_BSTIM16_IsEnabledARRPreload + * @param BSTIM16x BSTIM16 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_BSTIM16_IsEnabledARRPreload(BSTIM16_Type *BSTIM16x) +{ + return (uint32_t)(READ_BIT(BSTIM16x->CR1, BSTIM16_CR1_ARPE_Msk) == BSTIM16_CR1_ARPE_Msk); +} + +/** + * @brief Auto-Reload preload disable + * @rmtoll CR1 ARPE FL_BSTIM16_DisableARRPreload + * @param BSTIM16x BSTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_DisableARRPreload(BSTIM16_Type *BSTIM16x) +{ + CLEAR_BIT(BSTIM16x->CR1, BSTIM16_CR1_ARPE_Msk); +} + +/** + * @brief Set one pulse mode + * @rmtoll CR1 OPM FL_BSTIM16_SetOnePulseMode + * @param BSTIM16x BSTIM16 instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_BSTIM16_ONE_PULSE_MODE_CONTINUOUS + * @arg @ref FL_BSTIM16_ONE_PULSE_MODE_SINGLE + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_SetOnePulseMode(BSTIM16_Type *BSTIM16x, uint32_t mode) +{ + MODIFY_REG(BSTIM16x->CR1, BSTIM16_CR1_OPM_Msk, mode); +} + +/** + * @brief Get one pulse mode + * @rmtoll CR1 OPM FL_BSTIM16_GetOnePulseMode + * @param BSTIM16x BSTIM16 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_BSTIM16_ONE_PULSE_MODE_CONTINUOUS + * @arg @ref FL_BSTIM16_ONE_PULSE_MODE_SINGLE + */ +__STATIC_INLINE uint32_t FL_BSTIM16_GetOnePulseMode(BSTIM16_Type *BSTIM16x) +{ + return (uint32_t)(READ_BIT(BSTIM16x->CR1, BSTIM16_CR1_OPM_Msk)); +} + +/** + * @brief Set update request + * @rmtoll CR1 URS FL_BSTIM16_SetUpdateSource + * @param BSTIM16x BSTIM16 instance + * @param source This parameter can be one of the following values: + * @arg @ref FL_BSTIM16_UPDATE_SOURCE_REGULAR + * @arg @ref FL_BSTIM16_UPDATE_SOURCE_COUNTER + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_SetUpdateSource(BSTIM16_Type *BSTIM16x, uint32_t source) +{ + MODIFY_REG(BSTIM16x->CR1, BSTIM16_CR1_URS_Msk, source); +} + +/** + * @brief Get update request status + * @rmtoll CR1 URS FL_BSTIM16_GetUpdateSource + * @param BSTIM16x BSTIM16 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_BSTIM16_UPDATE_SOURCE_REGULAR + * @arg @ref FL_BSTIM16_UPDATE_SOURCE_COUNTER + */ +__STATIC_INLINE uint32_t FL_BSTIM16_GetUpdateSource(BSTIM16_Type *BSTIM16x) +{ + return (uint32_t)(READ_BIT(BSTIM16x->CR1, BSTIM16_CR1_URS_Msk)); +} + +/** + * @brief Update event enable + * @rmtoll CR1 UDIS FL_BSTIM16_EnableUpdateEvent + * @param BSTIM16x BSTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_EnableUpdateEvent(BSTIM16_Type *BSTIM16x) +{ + CLEAR_BIT(BSTIM16x->CR1, BSTIM16_CR1_UDIS_Msk); +} + +/** + * @brief Get update event disable status + * @rmtoll CR1 UDIS FL_BSTIM16_IsEnabledUpdateEvent + * @param BSTIM16x BSTIM16 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_BSTIM16_IsEnabledUpdateEvent(BSTIM16_Type *BSTIM16x) +{ + return (uint32_t)!(READ_BIT(BSTIM16x->CR1, BSTIM16_CR1_UDIS_Msk) == BSTIM16_CR1_UDIS_Msk); +} + +/** + * @brief Update event disable + * @rmtoll CR1 UDIS FL_BSTIM16_DisableUpdateEvent + * @param BSTIM16x BSTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_DisableUpdateEvent(BSTIM16_Type *BSTIM16x) +{ + SET_BIT(BSTIM16x->CR1, BSTIM16_CR1_UDIS_Msk); +} + +/** + * @brief Counter enable + * @rmtoll CR1 CEN FL_BSTIM16_Enable + * @param BSTIM16x BSTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_Enable(BSTIM16_Type *BSTIM16x) +{ + SET_BIT(BSTIM16x->CR1, BSTIM16_CR1_CEN_Msk); +} + +/** + * @brief Get counter enable status + * @rmtoll CR1 CEN FL_BSTIM16_IsEnabled + * @param BSTIM16x BSTIM16 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_BSTIM16_IsEnabled(BSTIM16_Type *BSTIM16x) +{ + return (uint32_t)(READ_BIT(BSTIM16x->CR1, BSTIM16_CR1_CEN_Msk) == BSTIM16_CR1_CEN_Msk); +} + +/** + * @brief Counter disable + * @rmtoll CR1 CEN FL_BSTIM16_Disable + * @param BSTIM16x BSTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_Disable(BSTIM16_Type *BSTIM16x) +{ + CLEAR_BIT(BSTIM16x->CR1, BSTIM16_CR1_CEN_Msk); +} + +/** + * @brief Set master Trigger Output mode + * @rmtoll CR2 MMS FL_BSTIM16_SetTriggerOutput + * @param BSTIM16x BSTIM16 instance + * @param triggerOutput This parameter can be one of the following values: + * @arg @ref FL_BSTIM16_TRGO_UG + * @arg @ref FL_BSTIM16_TRGO_ENABLE + * @arg @ref FL_BSTIM16_TRGO_UPDATE + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_SetTriggerOutput(BSTIM16_Type *BSTIM16x, uint32_t triggerOutput) +{ + MODIFY_REG(BSTIM16x->CR2, BSTIM16_CR2_MMS_Msk, triggerOutput); +} + +/** + * @brief Get master Trigger Output mode + * @rmtoll CR2 MMS FL_BSTIM16_GetTriggerOutput + * @param BSTIM16x BSTIM16 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_BSTIM16_TRGO_UG + * @arg @ref FL_BSTIM16_TRGO_ENABLE + * @arg @ref FL_BSTIM16_TRGO_UPDATE + */ +__STATIC_INLINE uint32_t FL_BSTIM16_GetTriggerOutput(BSTIM16_Type *BSTIM16x) +{ + return (uint32_t)(READ_BIT(BSTIM16x->CR2, BSTIM16_CR2_MMS_Msk)); +} + +/** + * @brief Update event interrupt disable + * @rmtoll IER UIE FL_BSTIM16_DisableIT_Update + * @param BSTIM16x BSTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_DisableIT_Update(BSTIM16_Type *BSTIM16x) +{ + CLEAR_BIT(BSTIM16x->IER, BSTIM16_IER_UIE_Msk); +} + +/** + * @brief Update event interrupt enable + * @rmtoll IER UIE FL_BSTIM16_EnableIT_Update + * @param BSTIM16x BSTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_EnableIT_Update(BSTIM16_Type *BSTIM16x) +{ + SET_BIT(BSTIM16x->IER, BSTIM16_IER_UIE_Msk); +} + +/** + * @brief Get update event interrupt enable status + * @rmtoll IER UIE FL_BSTIM16_IsEnabledIT_Update + * @param BSTIM16x BSTIM16 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_BSTIM16_IsEnabledIT_Update(BSTIM16_Type *BSTIM16x) +{ + return (uint32_t)(READ_BIT(BSTIM16x->IER, BSTIM16_IER_UIE_Msk) == BSTIM16_IER_UIE_Msk); +} + +/** + * @brief Get update event interrupt flag + * @rmtoll ISR UIF FL_BSTIM16_IsActiveFlag_Update + * @param BSTIM16x BSTIM16 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_BSTIM16_IsActiveFlag_Update(BSTIM16_Type *BSTIM16x) +{ + return (uint32_t)(READ_BIT(BSTIM16x->ISR, BSTIM16_ISR_UIF_Msk) == (BSTIM16_ISR_UIF_Msk)); +} + +/** + * @brief Clear update event interrupt flag + * @rmtoll ISR UIF FL_BSTIM16_ClearFlag_Update + * @param BSTIM16x BSTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_ClearFlag_Update(BSTIM16_Type *BSTIM16x) +{ + WRITE_REG(BSTIM16x->ISR, BSTIM16_ISR_UIF_Msk); +} + +/** + * @brief Software update event enable + * @rmtoll EGR UG FL_BSTIM16_GenerateUpdateEvent + * @param BSTIM16x BSTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_GenerateUpdateEvent(BSTIM16_Type *BSTIM16x) +{ + SET_BIT(BSTIM16x->EGR, BSTIM16_EGR_UG_Msk); +} + +/** + * @brief Set counter value + * @rmtoll CNT FL_BSTIM16_WriteCounter + * @param BSTIM16x BSTIM16 instance + * @param count + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_WriteCounter(BSTIM16_Type *BSTIM16x, uint32_t count) +{ + MODIFY_REG(BSTIM16x->CNT, (0xffffU << 0U), (count << 0U)); +} + +/** + * @brief Get counter value + * @rmtoll CNT FL_BSTIM16_ReadCounter + * @param BSTIM16x BSTIM16 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_BSTIM16_ReadCounter(BSTIM16_Type *BSTIM16x) +{ + return (uint32_t)(READ_BIT(BSTIM16x->CNT, 0xffffU) >> 0U); +} + +/** + * @brief Set counter Clock prescaler value + * @rmtoll PSC FL_BSTIM16_WritePrescaler + * @param BSTIM16x BSTIM16 instance + * @param psc + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_WritePrescaler(BSTIM16_Type *BSTIM16x, uint32_t psc) +{ + MODIFY_REG(BSTIM16x->PSC, (0xffffU << 0U), (psc << 0U)); +} + +/** + * @brief Get counter Clock prescaler value + * @rmtoll PSC FL_BSTIM16_ReadPrescaler + * @param BSTIM16x BSTIM16 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_BSTIM16_ReadPrescaler(BSTIM16_Type *BSTIM16x) +{ + return (uint32_t)(READ_BIT(BSTIM16x->PSC, 0xffffU) >> 0U); +} + +/** + * @brief Set Auto-Reload register value + * @rmtoll ARR FL_BSTIM16_WriteAutoReload + * @param BSTIM16x BSTIM16 instance + * @param value + * @retval None + */ +__STATIC_INLINE void FL_BSTIM16_WriteAutoReload(BSTIM16_Type *BSTIM16x, uint32_t value) +{ + MODIFY_REG(BSTIM16x->ARR, (0xffffU << 0U), (value << 0U)); +} + +/** + * @brief Get Auto-Reload register value + * @rmtoll ARR FL_BSTIM16_ReadAutoReload + * @param BSTIM16x BSTIM16 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_BSTIM16_ReadAutoReload(BSTIM16_Type *BSTIM16x) +{ + return (uint32_t)(READ_BIT(BSTIM16x->ARR, 0xffffU) >> 0U); +} + +/** + * @} + */ + +/** @defgroup BSTIM16_FL_EF_Init Initialization and de-initialization functions + * @{ + */ + +FL_ErrorStatus FL_BSTIM16_DeInit(BSTIM16_Type *BSTIM16x); +FL_ErrorStatus FL_BSTIM16_Init(BSTIM16_Type *BSTIM16x, FL_BSTIM16_InitTypeDef *init); +void FL_BSTIM16_StructInit(FL_BSTIM16_InitTypeDef *init); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_BSTIM16_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-12*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_bstim32.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_bstim32.h new file mode 100644 index 0000000..5c46c81 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_bstim32.h @@ -0,0 +1,484 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_bstim32.h + * @author FMSH Application Team + * @brief Head file of BSTIM32 FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_BSTIM32_H +#define __FM33LG0XX_FL_BSTIM32_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup BSTIM32 BSTIM32 + * @brief BSTIM32 FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup BSTIM32_FL_ES_INIT BSTIM32 Exported Init structures + * @{ + */ + +/** + * @brief FL BSTIM32 Init Sturcture definition + */ + +typedef struct +{ + /* 时钟源 */ + uint32_t clockSource; + + /* 预分频系数 */ + uint32_t prescaler; + + /* 自动重装载值 */ + uint32_t autoReload; + + /* 自动重装载值 */ + uint32_t autoReloadState; + +} FL_BSTIM32_InitTypeDef; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup BSTIM32_FL_Exported_Constants BSTIM32 Exported Constants + * @{ + */ + +#define BSTIM32_CR1_ARPE_Pos (7U) +#define BSTIM32_CR1_ARPE_Msk (0x1U << BSTIM32_CR1_ARPE_Pos) +#define BSTIM32_CR1_ARPE BSTIM32_CR1_ARPE_Msk + +#define BSTIM32_CR1_OPM_Pos (3U) +#define BSTIM32_CR1_OPM_Msk (0x1U << BSTIM32_CR1_OPM_Pos) +#define BSTIM32_CR1_OPM BSTIM32_CR1_OPM_Msk + +#define BSTIM32_CR1_URS_Pos (2U) +#define BSTIM32_CR1_URS_Msk (0x1U << BSTIM32_CR1_URS_Pos) +#define BSTIM32_CR1_URS BSTIM32_CR1_URS_Msk + +#define BSTIM32_CR1_UDIS_Pos (1U) +#define BSTIM32_CR1_UDIS_Msk (0x1U << BSTIM32_CR1_UDIS_Pos) +#define BSTIM32_CR1_UDIS BSTIM32_CR1_UDIS_Msk + +#define BSTIM32_CR1_CEN_Pos (0U) +#define BSTIM32_CR1_CEN_Msk (0x1U << BSTIM32_CR1_CEN_Pos) +#define BSTIM32_CR1_CEN BSTIM32_CR1_CEN_Msk + +#define BSTIM32_CR2_MMS_Pos (4U) +#define BSTIM32_CR2_MMS_Msk (0x7U << BSTIM32_CR2_MMS_Pos) +#define BSTIM32_CR2_MMS BSTIM32_CR2_MMS_Msk + +#define BSTIM32_IER_UIE_Pos (0U) +#define BSTIM32_IER_UIE_Msk (0x1U << BSTIM32_IER_UIE_Pos) +#define BSTIM32_IER_UIE BSTIM32_IER_UIE_Msk + +#define BSTIM32_ISR_UIF_Pos (0U) +#define BSTIM32_ISR_UIF_Msk (0x1U << BSTIM32_ISR_UIF_Pos) +#define BSTIM32_ISR_UIF BSTIM32_ISR_UIF_Msk + +#define BSTIM32_EGR_UG_Pos (0U) +#define BSTIM32_EGR_UG_Msk (0x1U << BSTIM32_EGR_UG_Pos) +#define BSTIM32_EGR_UG BSTIM32_EGR_UG_Msk + + + + + + +#define FL_BSTIM32_ONE_PULSE_MODE_CONTINUOUS (0x0U << BSTIM32_CR1_OPM_Pos) +#define FL_BSTIM32_ONE_PULSE_MODE_SINGLE (0x1U << BSTIM32_CR1_OPM_Pos) + + +#define FL_BSTIM32_UPDATE_SOURCE_REGULAR (0x0U << BSTIM32_CR1_URS_Pos) +#define FL_BSTIM32_UPDATE_SOURCE_COUNTER (0x1U << BSTIM32_CR1_URS_Pos) + + +#define FL_BSTIM32_TRGO_UG (0x0U << BSTIM32_CR2_MMS_Pos) +#define FL_BSTIM32_TRGO_ENABLE (0x1U << BSTIM32_CR2_MMS_Pos) +#define FL_BSTIM32_TRGO_UPDATE (0x2U << BSTIM32_CR2_MMS_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup BSTIM32_FL_Exported_Functions BSTIM32 Exported Functions + * @{ + */ + +/** + * @brief Auto-Reload preload enable + * @rmtoll CR1 ARPE FL_BSTIM32_EnableARRPreload + * @param BSTIM32x BSTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_EnableARRPreload(BSTIM32_Type *BSTIM32x) +{ + SET_BIT(BSTIM32x->CR1, BSTIM32_CR1_ARPE_Msk); +} + +/** + * @brief Get Auto-Reload preload enable status + * @rmtoll CR1 ARPE FL_BSTIM32_IsEnabledARRPreload + * @param BSTIM32x BSTIM32 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_BSTIM32_IsEnabledARRPreload(BSTIM32_Type *BSTIM32x) +{ + return (uint32_t)(READ_BIT(BSTIM32x->CR1, BSTIM32_CR1_ARPE_Msk) == BSTIM32_CR1_ARPE_Msk); +} + +/** + * @brief Auto-Reload preload disable + * @rmtoll CR1 ARPE FL_BSTIM32_DisableARRPreload + * @param BSTIM32x BSTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_DisableARRPreload(BSTIM32_Type *BSTIM32x) +{ + CLEAR_BIT(BSTIM32x->CR1, BSTIM32_CR1_ARPE_Msk); +} + +/** + * @brief Set one pulse mode + * @rmtoll CR1 OPM FL_BSTIM32_SetOnePulseMode + * @param BSTIM32x BSTIM32 instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_BSTIM32_ONE_PULSE_MODE_CONTINUOUS + * @arg @ref FL_BSTIM32_ONE_PULSE_MODE_SINGLE + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_SetOnePulseMode(BSTIM32_Type *BSTIM32x, uint32_t mode) +{ + MODIFY_REG(BSTIM32x->CR1, BSTIM32_CR1_OPM_Msk, mode); +} + +/** + * @brief Get one pulse mode + * @rmtoll CR1 OPM FL_BSTIM32_GetOnePulseMode + * @param BSTIM32x BSTIM32 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_BSTIM32_ONE_PULSE_MODE_CONTINUOUS + * @arg @ref FL_BSTIM32_ONE_PULSE_MODE_SINGLE + */ +__STATIC_INLINE uint32_t FL_BSTIM32_GetOnePulseMode(BSTIM32_Type *BSTIM32x) +{ + return (uint32_t)(READ_BIT(BSTIM32x->CR1, BSTIM32_CR1_OPM_Msk)); +} + +/** + * @brief Set update request + * @rmtoll CR1 URS FL_BSTIM32_SetUpdateSource + * @param BSTIM32x BSTIM32 instance + * @param source This parameter can be one of the following values: + * @arg @ref FL_BSTIM32_UPDATE_SOURCE_REGULAR + * @arg @ref FL_BSTIM32_UPDATE_SOURCE_COUNTER + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_SetUpdateSource(BSTIM32_Type *BSTIM32x, uint32_t source) +{ + MODIFY_REG(BSTIM32x->CR1, BSTIM32_CR1_URS_Msk, source); +} + +/** + * @brief Get update request status + * @rmtoll CR1 URS FL_BSTIM32_GetUpdateSource + * @param BSTIM32x BSTIM32 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_BSTIM32_UPDATE_SOURCE_REGULAR + * @arg @ref FL_BSTIM32_UPDATE_SOURCE_COUNTER + */ +__STATIC_INLINE uint32_t FL_BSTIM32_GetUpdateSource(BSTIM32_Type *BSTIM32x) +{ + return (uint32_t)(READ_BIT(BSTIM32x->CR1, BSTIM32_CR1_URS_Msk)); +} + +/** + * @brief Update event enable + * @rmtoll CR1 UDIS FL_BSTIM32_EnableUpdateEvent + * @param BSTIM32x BSTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_EnableUpdateEvent(BSTIM32_Type *BSTIM32x) +{ + CLEAR_BIT(BSTIM32x->CR1, BSTIM32_CR1_UDIS_Msk); +} + +/** + * @brief Get update event disable status + * @rmtoll CR1 UDIS FL_BSTIM32_IsEnabledUpdateEvent + * @param BSTIM32x BSTIM32 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_BSTIM32_IsEnabledUpdateEvent(BSTIM32_Type *BSTIM32x) +{ + return (uint32_t)!(READ_BIT(BSTIM32x->CR1, BSTIM32_CR1_UDIS_Msk) == BSTIM32_CR1_UDIS_Msk); +} + +/** + * @brief Update event disable + * @rmtoll CR1 UDIS FL_BSTIM32_DisableUpdateEvent + * @param BSTIM32x BSTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_DisableUpdateEvent(BSTIM32_Type *BSTIM32x) +{ + SET_BIT(BSTIM32x->CR1, BSTIM32_CR1_UDIS_Msk); +} + +/** + * @brief Counter enable + * @rmtoll CR1 CEN FL_BSTIM32_Enable + * @param BSTIM32x BSTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_Enable(BSTIM32_Type *BSTIM32x) +{ + SET_BIT(BSTIM32x->CR1, BSTIM32_CR1_CEN_Msk); +} + +/** + * @brief Get counter enable status + * @rmtoll CR1 CEN FL_BSTIM32_IsEnabled + * @param BSTIM32x BSTIM32 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_BSTIM32_IsEnabled(BSTIM32_Type *BSTIM32x) +{ + return (uint32_t)(READ_BIT(BSTIM32x->CR1, BSTIM32_CR1_CEN_Msk) == BSTIM32_CR1_CEN_Msk); +} + +/** + * @brief Counter disable + * @rmtoll CR1 CEN FL_BSTIM32_Disable + * @param BSTIM32x BSTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_Disable(BSTIM32_Type *BSTIM32x) +{ + CLEAR_BIT(BSTIM32x->CR1, BSTIM32_CR1_CEN_Msk); +} + +/** + * @brief Set master trigger mode + * @rmtoll CR2 MMS FL_BSTIM32_SetTriggerOutput + * @param BSTIM32x BSTIM32 instance + * @param triggerOutput This parameter can be one of the following values: + * @arg @ref FL_BSTIM32_TRGO_UG + * @arg @ref FL_BSTIM32_TRGO_ENABLE + * @arg @ref FL_BSTIM32_TRGO_UPDATE + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_SetTriggerOutput(BSTIM32_Type *BSTIM32x, uint32_t triggerOutput) +{ + MODIFY_REG(BSTIM32x->CR2, BSTIM32_CR2_MMS_Msk, triggerOutput); +} + +/** + * @brief Get master trigger mode status + * @rmtoll CR2 MMS FL_BSTIM32_GetTriggerOutput + * @param BSTIM32x BSTIM32 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_BSTIM32_TRGO_UG + * @arg @ref FL_BSTIM32_TRGO_ENABLE + * @arg @ref FL_BSTIM32_TRGO_UPDATE + */ +__STATIC_INLINE uint32_t FL_BSTIM32_GetTriggerOutput(BSTIM32_Type *BSTIM32x) +{ + return (uint32_t)(READ_BIT(BSTIM32x->CR2, BSTIM32_CR2_MMS_Msk)); +} + +/** + * @brief Update event interrupt disable + * @rmtoll IER UIE FL_BSTIM32_DisableIT_Update + * @param BSTIM32x BSTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_DisableIT_Update(BSTIM32_Type *BSTIM32x) +{ + CLEAR_BIT(BSTIM32x->IER, BSTIM32_IER_UIE_Msk); +} + +/** + * @brief Update event interrupt enable + * @rmtoll IER UIE FL_BSTIM32_EnableIT_Update + * @param BSTIM32x BSTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_EnableIT_Update(BSTIM32_Type *BSTIM32x) +{ + SET_BIT(BSTIM32x->IER, BSTIM32_IER_UIE_Msk); +} + +/** + * @brief Get update event interrupt enable status + * @rmtoll IER UIE FL_BSTIM32_IsEnabledIT_Update + * @param BSTIM32x BSTIM32 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_BSTIM32_IsEnabledIT_Update(BSTIM32_Type *BSTIM32x) +{ + return (uint32_t)(READ_BIT(BSTIM32x->IER, BSTIM32_IER_UIE_Msk) == BSTIM32_IER_UIE_Msk); +} + +/** + * @brief Get update event interrupt flag + * @rmtoll ISR UIF FL_BSTIM32_IsActiveFlag_Update + * @param BSTIM32x BSTIM32 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_BSTIM32_IsActiveFlag_Update(BSTIM32_Type *BSTIM32x) +{ + return (uint32_t)(READ_BIT(BSTIM32x->ISR, BSTIM32_ISR_UIF_Msk) == (BSTIM32_ISR_UIF_Msk)); +} + +/** + * @brief Clear update event interrupt flag + * @rmtoll ISR UIF FL_BSTIM32_ClearFlag_Update + * @param BSTIM32x BSTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_ClearFlag_Update(BSTIM32_Type *BSTIM32x) +{ + WRITE_REG(BSTIM32x->ISR, BSTIM32_ISR_UIF_Msk); +} + +/** + * @brief Software update event enable + * @rmtoll EGR UG FL_BSTIM32_GenerateUpdateEvent + * @param BSTIM32x BSTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_GenerateUpdateEvent(BSTIM32_Type *BSTIM32x) +{ + SET_BIT(BSTIM32x->EGR, BSTIM32_EGR_UG_Msk); +} + +/** + * @brief Set counter value + * @rmtoll CNT FL_BSTIM32_WriteCounter + * @param BSTIM32x BSTIM32 instance + * @param count + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_WriteCounter(BSTIM32_Type *BSTIM32x, uint32_t count) +{ + MODIFY_REG(BSTIM32x->CNT, (0xffffffffU << 0U), (count << 0U)); +} + +/** + * @brief Get counter value + * @rmtoll CNT FL_BSTIM32_ReadCounter + * @param BSTIM32x BSTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_BSTIM32_ReadCounter(BSTIM32_Type *BSTIM32x) +{ + return (uint32_t)(READ_BIT(BSTIM32x->CNT, 0xffffffffU) >> 0U); +} + +/** + * @brief Set counter Clock prescaler value + * @rmtoll PSC FL_BSTIM32_WritePrescaler + * @param BSTIM32x BSTIM32 instance + * @param psc + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_WritePrescaler(BSTIM32_Type *BSTIM32x, uint32_t psc) +{ + MODIFY_REG(BSTIM32x->PSC, (0xffffffffU << 0U), (psc << 0U)); +} + +/** + * @brief Get counter Clock prescaler value + * @rmtoll PSC FL_BSTIM32_ReadPrescaler + * @param BSTIM32x BSTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_BSTIM32_ReadPrescaler(BSTIM32_Type *BSTIM32x) +{ + return (uint32_t)(READ_BIT(BSTIM32x->PSC, 0xffffffffU) >> 0U); +} + +/** + * @brief Set Auto-Reload register value + * @rmtoll ARR FL_BSTIM32_WriteAutoReload + * @param BSTIM32x BSTIM32 instance + * @param value + * @retval None + */ +__STATIC_INLINE void FL_BSTIM32_WriteAutoReload(BSTIM32_Type *BSTIM32x, uint32_t value) +{ + MODIFY_REG(BSTIM32x->ARR, (0xffffffffU << 0U), (value << 0U)); +} + +/** + * @brief Get Auto-Reload register value + * @rmtoll ARR FL_BSTIM32_ReadAutoReload + * @param BSTIM32x BSTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_BSTIM32_ReadAutoReload(BSTIM32_Type *BSTIM32x) +{ + return (uint32_t)(READ_BIT(BSTIM32x->ARR, 0xffffffffU) >> 0U); +} + +/** + * @} + */ + +/** @defgroup BSTIM32_FL_EF_Init Initialization and de-initialization functions + * @{ + */ + +FL_ErrorStatus FL_BSTIM32_DeInit(BSTIM32_Type *BSTIM32x); +FL_ErrorStatus FL_BSTIM32_Init(BSTIM32_Type *BSTIM32x, FL_BSTIM32_InitTypeDef *init); +void FL_BSTIM32_StructInit(FL_BSTIM32_InitTypeDef *init); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_BSTIM32_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-12*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_can.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_can.h new file mode 100644 index 0000000..c566631 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_can.h @@ -0,0 +1,2215 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_can.h + * @author FMSH Application Team + * @brief Head file of CAN FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_CAN_H +#define __FM33LG0XX_FL_CAN_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup CAN CAN + * @brief CAN FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup CAN_FL_ES_INIT CAN Exported Init structures + * @{ + */ + +/** + * @brief FL CAN Init Sturcture definition + */ +typedef struct +{ + /*工作模式*/ + uint8_t mode; + /*同步段长度*/ + uint8_t SJW; + /*时间段1*/ + uint8_t TS1; + /*时间段2*/ + uint8_t TS2; + /*波特率预分频*/ + uint8_t BRP; + /*时钟源选择*/ + uint8_t clockSource; + +} FL_CAN_InitTypeDef; + +/** + * @brief CAN filter init structure definition + */ +typedef struct +{ + + /*滤波器SRR位*/ + uint32_t filterIdSRR; + /*滤波器IDE位*/ + uint32_t filterIdIDE; + /*滤波器RTR位*/ + uint32_t filterIdRTR; + /*滤波器使能*/ + uint32_t filterEn; + /*滤波器标准ID*/ + uint32_t filterIdStandard; + /*滤波器扩展ID*/ + uint32_t filterIdExtend; + /*滤波器ID高11位掩码*/ + uint32_t filterMaskIdHigh; + /*滤波器SRR位掩码*/ + uint32_t filterMaskIdSRR; + /*滤波器IDE位掩码*/ + uint32_t filterMaskIdIDE; + /*滤波器ID低18位掩码*/ + uint32_t filterMaskIdLow; + /*滤波器RTR位掩码*/ + uint32_t filterMaskIdRTR; + +} FL_CAN_FilterInitTypeDef; + + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup CAN_FL_Exported_Constants CAN Exported Constants + * @{ + */ + +#define CAN_CR_CEN_Pos (1U) +#define CAN_CR_CEN_Msk (0x1U << CAN_CR_CEN_Pos) +#define CAN_CR_CEN CAN_CR_CEN_Msk + +#define CAN_CR_SRST_Pos (0U) +#define CAN_CR_SRST_Msk (0x1U << CAN_CR_SRST_Pos) +#define CAN_CR_SRST CAN_CR_SRST_Msk + +#define CAN_MSR_LPBACK_Pos (1U) +#define CAN_MSR_LPBACK_Msk (0x1U << CAN_MSR_LPBACK_Pos) +#define CAN_MSR_LPBACK CAN_MSR_LPBACK_Msk + +#define CAN_BRPR_BRP_Pos (0U) +#define CAN_BRPR_BRP_Msk (0xffU << CAN_BRPR_BRP_Pos) +#define CAN_BRPR_BRP CAN_BRPR_BRP_Msk + +#define CAN_BTR_SJW_Pos (7U) +#define CAN_BTR_SJW_Msk (0x3U << CAN_BTR_SJW_Pos) +#define CAN_BTR_SJW CAN_BTR_SJW_Msk + +#define CAN_BTR_TS2_Pos (4U) +#define CAN_BTR_TS2_Msk (0x7U << CAN_BTR_TS2_Pos) +#define CAN_BTR_TS2 CAN_BTR_TS2_Msk + +#define CAN_BTR_TS1_Pos (0U) +#define CAN_BTR_TS1_Msk (0xfU << CAN_BTR_TS1_Pos) +#define CAN_BTR_TS1 CAN_BTR_TS1_Msk + +#define CAN_ECR_REC_Pos (8U) +#define CAN_ECR_REC_Msk (0xffU << CAN_ECR_REC_Pos) +#define CAN_ECR_REC CAN_ECR_REC_Msk + +#define CAN_ECR_TEC_Pos (0U) +#define CAN_ECR_TEC_Msk (0xffU << CAN_ECR_TEC_Pos) +#define CAN_ECR_TEC CAN_ECR_TEC_Msk + +#define CAN_ESR_ACKER_Pos (4U) +#define CAN_ESR_ACKER_Msk (0x1U << CAN_ESR_ACKER_Pos) +#define CAN_ESR_ACKER CAN_ESR_ACKER_Msk + +#define CAN_ESR_BERR_Pos (3U) +#define CAN_ESR_BERR_Msk (0x1U << CAN_ESR_BERR_Pos) +#define CAN_ESR_BERR CAN_ESR_BERR_Msk + +#define CAN_ESR_STER_Pos (2U) +#define CAN_ESR_STER_Msk (0x1U << CAN_ESR_STER_Pos) +#define CAN_ESR_STER CAN_ESR_STER_Msk + +#define CAN_ESR_FMER_Pos (1U) +#define CAN_ESR_FMER_Msk (0x1U << CAN_ESR_FMER_Pos) +#define CAN_ESR_FMER CAN_ESR_FMER_Msk + +#define CAN_ESR_CRCER_Pos (0U) +#define CAN_ESR_CRCER_Msk (0x1U << CAN_ESR_CRCER_Pos) +#define CAN_ESR_CRCER CAN_ESR_CRCER_Msk + +#define CAN_SR_ACFBSY_Pos (11U) +#define CAN_SR_ACFBSY_Msk (0x1U << CAN_SR_ACFBSY_Pos) +#define CAN_SR_ACFBSY CAN_SR_ACFBSY_Msk + +#define CAN_SR_TXFLL_Pos (10U) +#define CAN_SR_TXFLL_Msk (0x1U << CAN_SR_TXFLL_Pos) +#define CAN_SR_TXFLL CAN_SR_TXFLL_Msk + +#define CAN_SR_TXBFLL_Pos (9U) +#define CAN_SR_TXBFLL_Msk (0x1U << CAN_SR_TXBFLL_Pos) +#define CAN_SR_TXBFLL CAN_SR_TXBFLL_Msk + +#define CAN_SR_ESTAT_Pos (7U) +#define CAN_SR_ESTAT_Msk (0x3U << CAN_SR_ESTAT_Pos) +#define CAN_SR_ESTAT CAN_SR_ESTAT_Msk + +#define CAN_SR_ERRWRN_Pos (6U) +#define CAN_SR_ERRWRN_Msk (0x1U << CAN_SR_ERRWRN_Pos) +#define CAN_SR_ERRWRN CAN_SR_ERRWRN_Msk + +#define CAN_SR_BBSY_Pos (5U) +#define CAN_SR_BBSY_Msk (0x1U << CAN_SR_BBSY_Pos) +#define CAN_SR_BBSY CAN_SR_BBSY_Msk + +#define CAN_SR_BIDLE_Pos (4U) +#define CAN_SR_BIDLE_Msk (0x1U << CAN_SR_BIDLE_Pos) +#define CAN_SR_BIDLE CAN_SR_BIDLE_Msk + +#define CAN_SR_NORMAL_Pos (3U) +#define CAN_SR_NORMAL_Msk (0x1U << CAN_SR_NORMAL_Pos) +#define CAN_SR_NORMAL CAN_SR_NORMAL_Msk + +#define CAN_SR_LBACK_Pos (1U) +#define CAN_SR_LBACK_Msk (0x1U << CAN_SR_LBACK_Pos) +#define CAN_SR_LBACK CAN_SR_LBACK_Msk + +#define CAN_SR_CONFIG_Pos (0U) +#define CAN_SR_CONFIG_Msk (0x1U << CAN_SR_CONFIG_Pos) +#define CAN_SR_CONFIG CAN_SR_CONFIG_Msk + +#define CAN_ISR_BSOFF_Pos (9U) +#define CAN_ISR_BSOFF_Msk (0x1U << CAN_ISR_BSOFF_Pos) +#define CAN_ISR_BSOFF CAN_ISR_BSOFF_Msk + +#define CAN_ISR_ERROR_Pos (8U) +#define CAN_ISR_ERROR_Msk (0x1U << CAN_ISR_ERROR_Pos) +#define CAN_ISR_ERROR CAN_ISR_ERROR_Msk + +#define CAN_ISR_RXNEMP_Pos (7U) +#define CAN_ISR_RXNEMP_Msk (0x1U << CAN_ISR_RXNEMP_Pos) +#define CAN_ISR_RXNEMP CAN_ISR_RXNEMP_Msk + +#define CAN_ISR_RXOFLW_Pos (6U) +#define CAN_ISR_RXOFLW_Msk (0x1U << CAN_ISR_RXOFLW_Pos) +#define CAN_ISR_RXOFLW CAN_ISR_RXOFLW_Msk + +#define CAN_ISR_RXUFLW_Pos (5U) +#define CAN_ISR_RXUFLW_Msk (0x1U << CAN_ISR_RXUFLW_Pos) +#define CAN_ISR_RXUFLW CAN_ISR_RXUFLW_Msk + +#define CAN_ISR_RXOK_Pos (4U) +#define CAN_ISR_RXOK_Msk (0x1U << CAN_ISR_RXOK_Pos) +#define CAN_ISR_RXOK CAN_ISR_RXOK_Msk + +#define CAN_ISR_TXBFLL_Pos (3U) +#define CAN_ISR_TXBFLL_Msk (0x1U << CAN_ISR_TXBFLL_Pos) +#define CAN_ISR_TXBFLL CAN_ISR_TXBFLL_Msk + +#define CAN_ISR_TXFLL_Pos (2U) +#define CAN_ISR_TXFLL_Msk (0x1U << CAN_ISR_TXFLL_Pos) +#define CAN_ISR_TXFLL CAN_ISR_TXFLL_Msk + +#define CAN_ISR_TXOK_Pos (1U) +#define CAN_ISR_TXOK_Msk (0x1U << CAN_ISR_TXOK_Pos) +#define CAN_ISR_TXOK CAN_ISR_TXOK_Msk + +#define CAN_ISR_ARBLST_Pos (0U) +#define CAN_ISR_ARBLST_Msk (0x1U << CAN_ISR_ARBLST_Pos) +#define CAN_ISR_ARBLST CAN_ISR_ARBLST_Msk + +#define CAN_IER_BSOFFIE_Pos (9U) +#define CAN_IER_BSOFFIE_Msk (0x1U << CAN_IER_BSOFFIE_Pos) +#define CAN_IER_BSOFFIE CAN_IER_BSOFFIE_Msk + +#define CAN_IER_ERRORIE_Pos (8U) +#define CAN_IER_ERRORIE_Msk (0x1U << CAN_IER_ERRORIE_Pos) +#define CAN_IER_ERRORIE CAN_IER_ERRORIE_Msk + +#define CAN_IER_RXNEMPIE_Pos (7U) +#define CAN_IER_RXNEMPIE_Msk (0x1U << CAN_IER_RXNEMPIE_Pos) +#define CAN_IER_RXNEMPIE CAN_IER_RXNEMPIE_Msk + +#define CAN_IER_RXOFLWIE_Pos (6U) +#define CAN_IER_RXOFLWIE_Msk (0x1U << CAN_IER_RXOFLWIE_Pos) +#define CAN_IER_RXOFLWIE CAN_IER_RXOFLWIE_Msk + +#define CAN_IER_RXUFLWIE_Pos (5U) +#define CAN_IER_RXUFLWIE_Msk (0x1U << CAN_IER_RXUFLWIE_Pos) +#define CAN_IER_RXUFLWIE CAN_IER_RXUFLWIE_Msk + +#define CAN_IER_RXOKIE_Pos (4U) +#define CAN_IER_RXOKIE_Msk (0x1U << CAN_IER_RXOKIE_Pos) +#define CAN_IER_RXOKIE CAN_IER_RXOKIE_Msk + +#define CAN_IER_TXBFLLIE_Pos (3U) +#define CAN_IER_TXBFLLIE_Msk (0x1U << CAN_IER_TXBFLLIE_Pos) +#define CAN_IER_TXBFLLIE CAN_IER_TXBFLLIE_Msk + +#define CAN_IER_TXFLLIE_Pos (2U) +#define CAN_IER_TXFLLIE_Msk (0x1U << CAN_IER_TXFLLIE_Pos) +#define CAN_IER_TXFLLIE CAN_IER_TXFLLIE_Msk + +#define CAN_IER_TXOKIE_Pos (1U) +#define CAN_IER_TXOKIE_Msk (0x1U << CAN_IER_TXOKIE_Pos) +#define CAN_IER_TXOKIE CAN_IER_TXOKIE_Msk + +#define CAN_IER_ARBLSTIE_Pos (0U) +#define CAN_IER_ARBLSTIE_Msk (0x1U << CAN_IER_ARBLSTIE_Pos) +#define CAN_IER_ARBLSTIE CAN_IER_ARBLSTIE_Msk + +#define CAN_ICR_CBSOFF_Pos (9U) +#define CAN_ICR_CBSOFF_Msk (0x1U << CAN_ICR_CBSOFF_Pos) +#define CAN_ICR_CBSOFF CAN_ICR_CBSOFF_Msk + +#define CAN_ICR_CERROR_Pos (8U) +#define CAN_ICR_CERROR_Msk (0x1U << CAN_ICR_CERROR_Pos) +#define CAN_ICR_CERROR CAN_ICR_CERROR_Msk + +#define CAN_ICR_CRXNEMP_Pos (7U) +#define CAN_ICR_CRXNEMP_Msk (0x1U << CAN_ICR_CRXNEMP_Pos) +#define CAN_ICR_CRXNEMP CAN_ICR_CRXNEMP_Msk + +#define CAN_ICR_CRXOFLW_Pos (6U) +#define CAN_ICR_CRXOFLW_Msk (0x1U << CAN_ICR_CRXOFLW_Pos) +#define CAN_ICR_CRXOFLW CAN_ICR_CRXOFLW_Msk + +#define CAN_ICR_CRXUFLW_Pos (5U) +#define CAN_ICR_CRXUFLW_Msk (0x1U << CAN_ICR_CRXUFLW_Pos) +#define CAN_ICR_CRXUFLW CAN_ICR_CRXUFLW_Msk + +#define CAN_ICR_CRXOK_Pos (4U) +#define CAN_ICR_CRXOK_Msk (0x1U << CAN_ICR_CRXOK_Pos) +#define CAN_ICR_CRXOK CAN_ICR_CRXOK_Msk + +#define CAN_ICR_CTXBFLL_Pos (3U) +#define CAN_ICR_CTXBFLL_Msk (0x1U << CAN_ICR_CTXBFLL_Pos) +#define CAN_ICR_CTXBFLL CAN_ICR_CTXBFLL_Msk + +#define CAN_ICR_CTXFLL_Pos (2U) +#define CAN_ICR_CTXFLL_Msk (0x1U << CAN_ICR_CTXFLL_Pos) +#define CAN_ICR_CTXFLL CAN_ICR_CTXFLL_Msk + +#define CAN_ICR_CTXOK_Pos (1U) +#define CAN_ICR_CTXOK_Msk (0x1U << CAN_ICR_CTXOK_Pos) +#define CAN_ICR_CTXOK CAN_ICR_CTXOK_Msk + +#define CAN_ICR_CARBLST_Pos (0U) +#define CAN_ICR_CARBLST_Msk (0x1U << CAN_ICR_CARBLST_Pos) +#define CAN_ICR_CARBLST CAN_ICR_CARBLST_Msk + +#define CAN_TXFIDR_IDR_Pos (0U) +#define CAN_TXFIDR_IDR_Msk (0xffffffffU << CAN_TXFIDR_IDR_Pos) +#define CAN_TXFIDR_IDR CAN_TXFIDR_IDR_Msk + +#define CAN_TXFDLCR_DLC_Pos (0U) +#define CAN_TXFDLCR_DLC_Msk (0xfU << CAN_TXFDLCR_DLC_Pos) +#define CAN_TXFDLCR_DLC CAN_TXFDLCR_DLC_Msk + +#define CAN_TXFDW1R_DB_Pos (0U) +#define CAN_TXFDW1R_DB_Msk (0xffffffffU << CAN_TXFDW1R_DB_Pos) +#define CAN_TXFDW1R_DB CAN_TXFDW1R_DB_Msk + +#define CAN_TXFDW2R_DB_Pos (0U) +#define CAN_TXFDW2R_DB_Msk (0xffffffffU << CAN_TXFDW2R_DB_Pos) +#define CAN_TXFDW2R_DB CAN_TXFDW2R_DB_Msk + +#define CAN_HPBIDR_IDR_Pos (0U) +#define CAN_HPBIDR_IDR_Msk (0xffffffffU << CAN_HPBIDR_IDR_Pos) +#define CAN_HPBIDR_IDR CAN_HPBIDR_IDR_Msk + +#define CAN_HPBDLCR_DLC_Pos (0U) +#define CAN_HPBDLCR_DLC_Msk (0xfU << CAN_HPBDLCR_DLC_Pos) +#define CAN_HPBDLCR_DLC CAN_HPBDLCR_DLC_Msk + +#define CAN_HPBDW1R_DB_Pos (0U) +#define CAN_HPBDW1R_DB_Msk (0xffffffffU << CAN_HPBDW1R_DB_Pos) +#define CAN_HPBDW1R_DB CAN_HPBDW1R_DB_Msk + +#define CAN_HPBDW2R_DB_Pos (0U) +#define CAN_HPBDW2R_DB_Msk (0xffffffffU << CAN_HPBDW2R_DB_Pos) +#define CAN_HPBDW2R_DB CAN_HPBDW2R_DB_Msk + +#define CAN_RXFIDR_IDR_Pos (0U) +#define CAN_RXFIDR_IDR_Msk (0xffffffffU << CAN_RXFIDR_IDR_Pos) +#define CAN_RXFIDR_IDR CAN_RXFIDR_IDR_Msk + +#define CAN_RXFDLCR_DLC_Pos (0U) +#define CAN_RXFDLCR_DLC_Msk (0xfU << CAN_RXFDLCR_DLC_Pos) +#define CAN_RXFDLCR_DLC CAN_RXFDLCR_DLC_Msk + +#define CAN_RXFDW1R_DB_Pos (0U) +#define CAN_RXFDW1R_DB_Msk (0xffffffffU << CAN_RXFDW1R_DB_Pos) +#define CAN_RXFDW1R_DB CAN_RXFDW1R_DB_Msk + +#define CAN_RXFDW2R_DB_Pos (0U) +#define CAN_RXFDW2R_DB_Msk (0xffffffffU << CAN_RXFDW2R_DB_Pos) +#define CAN_RXFDW2R_DB CAN_RXFDW2R_DB_Msk + +#define CAN_AFR_UAF_Pos (0U) +#define CAN_AFR_UAF_Msk (0xfU << CAN_AFR_UAF_Pos) +#define CAN_AFR_UAF CAN_AFR_UAF_Msk + +#define CAN_AFMR_AMRTR_Pos (31U) +#define CAN_AFMR_AMRTR_Msk (0x1U << CAN_AFMR_AMRTR_Pos) +#define CAN_AFMR_AMRTR CAN_AFMR_AMRTR_Msk + +#define CAN_AFMR_AMID18_Pos (13U) +#define CAN_AFMR_AMID18_Msk (0x3ffffU << CAN_AFMR_AMID18_Pos) +#define CAN_AFMR_AMID18 CAN_AFMR_AMID18_Msk + +#define CAN_AFMR_AMIDE_Pos (12U) +#define CAN_AFMR_AMIDE_Msk (0x1U << CAN_AFMR_AMIDE_Pos) +#define CAN_AFMR_AMIDE CAN_AFMR_AMIDE_Msk + +#define CAN_AFMR_AMSRR_Pos (11U) +#define CAN_AFMR_AMSRR_Msk (0x1U << CAN_AFMR_AMSRR_Pos) +#define CAN_AFMR_AMSRR CAN_AFMR_AMSRR_Msk + +#define CAN_AFMR_AMID11_Pos (0U) +#define CAN_AFMR_AMID11_Msk (0x7ffU << CAN_AFMR_AMID11_Pos) +#define CAN_AFMR_AMID11 CAN_AFMR_AMID11_Msk + +#define CAN_AFIR_AIRTR_Pos (31U) +#define CAN_AFIR_AIRTR_Msk (0x1U << CAN_AFIR_AIRTR_Pos) +#define CAN_AFIR_AIRTR CAN_AFIR_AIRTR_Msk + +#define CAN_AFIR_AIID18_Pos (13U) +#define CAN_AFIR_AIID18_Msk (0x3ffffU << CAN_AFIR_AIID18_Pos) +#define CAN_AFIR_AIID18 CAN_AFIR_AIID18_Msk + +#define CAN_AFIR_AIIDE_Pos (12U) +#define CAN_AFIR_AIIDE_Msk (0x1U << CAN_AFIR_AIIDE_Pos) +#define CAN_AFIR_AIIDE CAN_AFIR_AIIDE_Msk + +#define CAN_AFIR_AISRR_Pos (11U) +#define CAN_AFIR_AISRR_Msk (0x1U << CAN_AFIR_AISRR_Pos) +#define CAN_AFIR_AISRR CAN_AFIR_AISRR_Msk + +#define CAN_AFIR_AIID11_Pos (0U) +#define CAN_AFIR_AIID11_Msk (0x7ffU << CAN_AFIR_AIID11_Pos) +#define CAN_AFIR_AIID11 CAN_AFIR_AIID11_Msk + + + +#define FL_CAN_ERROR_STATUS_CONFIG (0x0U << CAN_SR_ESTAT_Pos) +#define FL_CAN_ERROR_STATUS_ACTIVE (0x1U << CAN_SR_ESTAT_Pos) +#define FL_CAN_ERROR_STATUS_BUSOFF (0x2U << CAN_SR_ESTAT_Pos) +#define FL_CAN_ERROR_STATUS_PASSIVE (0x3U << CAN_SR_ESTAT_Pos) + + +#define FL_CAN_RTR_BIT_LOW (0x0U << CAN_AFIR_AIRTR_Pos) +#define FL_CAN_RTR_BIT_HIGH (0x1U << CAN_AFIR_AIRTR_Pos) + + +#define FL_CAN_IDE_BIT_LOW (0x0U << CAN_AFIR_AIIDE_Pos) +#define FL_CAN_IDE_BIT_HIGH (0x1U << CAN_AFIR_AIIDE_Pos) + +#define FL_CAN_SRR_BIT_LOW (0x0U << CAN_AFIR_AISRR_Pos) +#define FL_CAN_SRR_BIT_HIGH (0x1U << CAN_AFIR_AISRR_Pos) + + +#define FL_CAN_SOFTWARE_NO_RESET (0x0U << CAN_CR_SRST_Pos) +#define FL_CAN_SOFTWARE_RESET (0x1U << CAN_CR_SRST_Pos) + + + +#define FL_CAN_TS1_1Tq (0U) +#define FL_CAN_TS1_2Tq (1U) +#define FL_CAN_TS1_3Tq (2U) +#define FL_CAN_TS1_4Tq (3U) +#define FL_CAN_TS1_5Tq (4U) +#define FL_CAN_TS1_6Tq (5U) +#define FL_CAN_TS1_7Tq (6U) +#define FL_CAN_TS1_8Tq (7U) +#define FL_CAN_TS1_9Tq (8U) +#define FL_CAN_TS1_10Tq (9U) +#define FL_CAN_TS1_11Tq (10U) +#define FL_CAN_TS1_12Tq (11U) +#define FL_CAN_TS1_13Tq (12U) +#define FL_CAN_TS1_14Tq (13U) +#define FL_CAN_TS1_15Tq (14U) +#define FL_CAN_TS1_16Tq (15U) + +#define FL_CAN_TS2_1Tq (0U) +#define FL_CAN_TS2_2Tq (1U) +#define FL_CAN_TS2_3Tq (2U) +#define FL_CAN_TS2_4Tq (3U) +#define FL_CAN_TS2_5Tq (4U) +#define FL_CAN_TS2_6Tq (5U) +#define FL_CAN_TS2_7Tq (6U) +#define FL_CAN_TS2_8Tq (7U) + + +#define FL_CAN_SJW_1Tq (0U) +#define FL_CAN_SJW_2Tq (1U) +#define FL_CAN_SJW_3Tq (2U) +#define FL_CAN_SJW_4Tq (3U) + +#define FL_CAN_MODE_NORMAL (0U) +#define FL_CAN_MODE_LOOPBACK (1U) +#define FL_CAN_MODE_CONFIG (2U) + +#define FL_CAN_FIL1_EN (1U << 0U) +#define FL_CAN_FIL2_EN (1U << 1U) +#define FL_CAN_FIL3_EN (1U << 2U) +#define FL_CAN_FIL4_EN (1U << 3U) + +#define FL_CAN_FIL1_MSK (1U << 0U) +#define FL_CAN_FIL2_MSK (1U << 1U) +#define FL_CAN_FIL3_MSK (1U << 2U) +#define FL_CAN_FIL4_MSK (1U << 3U) + + +#define FL_CAN_FILTER1 (0x0U << 0U) +#define FL_CAN_FILTER2 (0x1U << 0U) +#define FL_CAN_FILTER3 (0x2U << 0U) +#define FL_CAN_FILTER4 (0x3U << 0U) + + + +#define FL_CAN_FORMAT_STANDARD_DATA (0U) +#define FL_CAN_FORMAT_STANDARD_REMOTE (1U) +#define FL_CAN_FORMAT_EXTEND_DATA (2U) +#define FL_CAN_FORMAT_EXTEND_REMOTE (3U) + + +#define CAN_TIMEOUT 0xFFFFFU + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup CAN_FL_Exported_Functions CAN Exported Functions + * @{ + */ + +/** + * @brief CAN enable + * @rmtoll CR CEN FL_CAN_Enable + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_Enable(CAN_Type *CANx) +{ + SET_BIT(CANx->CR, CAN_CR_CEN_Msk); +} + +/** + * @brief Get CAN enable status + * @rmtoll CR CEN FL_CAN_IsEnabled + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsEnabled(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->CR, CAN_CR_CEN_Msk) == CAN_CR_CEN_Msk); +} + +/** + * @brief CAN disable + * @rmtoll CR CEN FL_CAN_Disable + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_Disable(CAN_Type *CANx) +{ + CLEAR_BIT(CANx->CR, CAN_CR_CEN_Msk); +} + +/** + * @brief Set CAN software reset + * @rmtoll CR SRST FL_CAN_SetSoftwareReset + * @param CANx CAN instance + * @param reset This parameter can be one of the following values: + * @arg @ref FL_CAN_SOFTWARE_NO_RESET + * @arg @ref FL_CAN_SOFTWARE_RESET + * @retval None + */ +__STATIC_INLINE void FL_CAN_SetSoftwareReset(CAN_Type *CANx, uint32_t reset) +{ + MODIFY_REG(CANx->CR, CAN_CR_SRST_Msk, reset); +} + +/** + * @brief Get CAN software reset + * @rmtoll CR SRST FL_CAN_GetSoftwareReset + * @param CANx CAN instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_CAN_SOFTWARE_NO_RESET + * @arg @ref FL_CAN_SOFTWARE_RESET + */ +__STATIC_INLINE uint32_t FL_CAN_GetSoftwareReset(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->CR, CAN_CR_SRST_Msk)); +} + +/** + * @brief Enable loop back mode + * @rmtoll MSR LPBACK FL_CAN_EnableLoopBackMode + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_EnableLoopBackMode(CAN_Type *CANx) +{ + SET_BIT(CANx->MSR, CAN_MSR_LPBACK_Msk); +} +/** + * @brief CAN disable + * @rmtoll CR CEN FL_CAN_Disable + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_DisableLoopBackMode(CAN_Type *CANx) +{ + CLEAR_BIT(CANx->MSR, CAN_MSR_LPBACK_Msk); +} +/** + * @brief Get loop back mode Enable Status + * @rmtoll MSR LPBACK FL_CAN_IsEnabledLoopBackMode + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsEnabledLoopBackMode(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->MSR, CAN_MSR_LPBACK_Msk) == CAN_MSR_LPBACK_Msk); +} + +/** + * @brief Set baud rate prescaler + * @rmtoll BRPR BRP FL_CAN_WriteBaudRatePrescaler + * @param CANx CAN instance + * @param psc + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteBaudRatePrescaler(CAN_Type *CANx, uint32_t psc) +{ + MODIFY_REG(CANx->BRPR, CAN_BRPR_BRP_Msk, (psc << CAN_BRPR_BRP_Pos)); +} + +/** + * @brief Get baud rate prescaler + * @rmtoll BRPR BRP FL_CAN_ReadBaudRatePrescaler + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadBaudRatePrescaler(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->BRPR, CAN_BRPR_BRP_Msk) >> CAN_BRPR_BRP_Pos); +} + +/** + * @brief Set synchronization jump width + * @rmtoll BTR SJW FL_CAN_WriteSyncJumpWidth + * @param CANx CAN instance + * @param width + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteSyncJumpWidth(CAN_Type *CANx, uint32_t width) +{ + MODIFY_REG(CANx->BTR, CAN_BTR_SJW_Msk, (width << CAN_BTR_SJW_Pos)); +} + +/** + * @brief Get synchronization jump width + * @rmtoll BTR SJW FL_CAN_ReadSyncJumpWidth + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadSyncJumpWidth(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->BTR, CAN_BTR_SJW_Msk) >> CAN_BTR_SJW_Pos); +} + +/** + * @brief Set time segment2 length + * @rmtoll BTR TS2 FL_CAN_WriteTimeSegment2Length + * @param CANx CAN instance + * @param length + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteTimeSegment2Length(CAN_Type *CANx, uint32_t length) +{ + MODIFY_REG(CANx->BTR, CAN_BTR_TS2_Msk, (length << CAN_BTR_TS2_Pos)); +} + +/** + * @brief Get time segment2 length + * @rmtoll BTR TS2 FL_CAN_ReadTimeSegment2Length + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadTimeSegment2Length(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->BTR, CAN_BTR_TS2_Msk) >> CAN_BTR_TS2_Pos); +} + +/** + * @brief Set time segment2 length + * @rmtoll BTR TS1 FL_CAN_WriteTimeSegment1Length + * @param CANx CAN instance + * @param length + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteTimeSegment1Length(CAN_Type *CANx, uint32_t length) +{ + MODIFY_REG(CANx->BTR, CAN_BTR_TS1_Msk, (length << CAN_BTR_TS1_Pos)); +} + +/** + * @brief Get time segment2 length + * @rmtoll BTR TS1 FL_CAN_ReadTimeSegment1Length + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadTimeSegment1Length(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->BTR, CAN_BTR_TS1_Msk) >> CAN_BTR_TS1_Pos); +} + +/** + * @brief Get receive error number + * @rmtoll ECR REC FL_CAN_ReadRXErrorCount + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadRXErrorCount(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ECR, CAN_ECR_REC_Msk) >> CAN_ECR_REC_Pos); +} + +/** + * @brief Get transmit error number + * @rmtoll ECR TEC FL_CAN_ReadTXErrorCount + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadTXErrorCount(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ECR, CAN_ECR_TEC_Msk) >> CAN_ECR_TEC_Pos); +} + +/** + * @brief Get ACK error flag + * @rmtoll ESR ACKER FL_CAN_IsActiveFlag_AckError + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_AckError(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ESR, CAN_ESR_ACKER_Msk) == (CAN_ESR_ACKER_Msk)); +} + +/** + * @brief Clear ACK error flag + * @rmtoll ESR ACKER FL_CAN_ClearFlag_AckError + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_AckError(CAN_Type *CANx) +{ + WRITE_REG(CANx->ESR, CAN_ESR_ACKER_Msk); +} + +/** + * @brief Get receive bit error flag + * @rmtoll ESR BERR FL_CAN_IsActiveFlag_BitError + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_BitError(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ESR, CAN_ESR_BERR_Msk) == (CAN_ESR_BERR_Msk)); +} + +/** + * @brief Clear receive bit error flag + * @rmtoll ESR BERR FL_CAN_ClearFlag_BitError + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_BitError(CAN_Type *CANx) +{ + WRITE_REG(CANx->ESR, CAN_ESR_BERR_Msk); +} + +/** + * @brief Get stuffing error flag + * @rmtoll ESR STER FL_CAN_IsActiveFlag_StuffError + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_StuffError(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ESR, CAN_ESR_STER_Msk) == (CAN_ESR_STER_Msk)); +} + +/** + * @brief Clear stuffing error flag + * @rmtoll ESR STER FL_CAN_ClearFlag_StuffError + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_StuffError(CAN_Type *CANx) +{ + WRITE_REG(CANx->ESR, CAN_ESR_STER_Msk); +} + +/** + * @brief Get form error flag + * @rmtoll ESR FMER FL_CAN_IsActiveFlag_FormatError + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_FormatError(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ESR, CAN_ESR_FMER_Msk) == (CAN_ESR_FMER_Msk)); +} + +/** + * @brief Clear form error flag + * @rmtoll ESR FMER FL_CAN_ClearFlag_FormatError + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_FormatError(CAN_Type *CANx) +{ + WRITE_REG(CANx->ESR, CAN_ESR_FMER_Msk); +} + +/** + * @brief Get CRC error fiag + * @rmtoll ESR CRCER FL_CAN_IsActiveFlag_CRCError + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_CRCError(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ESR, CAN_ESR_CRCER_Msk) == (CAN_ESR_CRCER_Msk)); +} + +/** + * @brief Clear CRC error flag + * @rmtoll ESR CRCER FL_CAN_ClearFlag_CRCError + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_CRCError(CAN_Type *CANx) +{ + WRITE_REG(CANx->ESR, CAN_ESR_CRCER_Msk); +} + +/** + * @brief Get acceptance filter busy flag + * @rmtoll SR ACFBSY FL_CAN_IsActiveFlag_FilterBusy + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_FilterBusy(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->SR, CAN_SR_ACFBSY_Msk) == (CAN_SR_ACFBSY_Msk)); +} + +/** + * @brief Get transmit FIFO FULL interrupt flag + * @rmtoll SR TXFLL FL_CAN_IsActiveFlag_TXBuffFullSignal + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_TXBuffFullSignal(CAN_Type* CANx) +{ + return (uint32_t)(READ_BIT(CANx->SR, CAN_SR_TXFLL_Msk) == (CAN_SR_TXFLL_Msk)); +} + +/** + * @brief Get high priority transmit buffer FULL interrupt flag + * @rmtoll SR TXBFLL FL_CAN_IsActiveFlag_TXHighPriorBuffFullSignal + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_TXHighPriorBuffFullSignal(CAN_Type* CANx) +{ + return (uint32_t)(READ_BIT(CANx->SR, CAN_SR_TXBFLL_Msk) == (CAN_SR_TXBFLL_Msk)); +} + +/** + * @brief Get error status flag + * @rmtoll SR ESTAT FL_CAN_GetErrorStatus + * @param CANx CAN instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_CAN_ERROR_STATUS_CONFIG + * @arg @ref FL_CAN_ERROR_STATUS_ACTIVE + * @arg @ref FL_CAN_ERROR_STATUS_BUSOFF + * @arg @ref FL_CAN_ERROR_STATUS_PASSIVE + */ +__STATIC_INLINE uint32_t FL_CAN_GetErrorStatus(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->SR, CAN_SR_ESTAT_Msk)); +} + +/** + * @brief Get error warning + * @rmtoll SR ERRWRN FL_CAN_IsActiveFlag_ErrorWarning + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_ErrorWarning(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->SR, CAN_SR_ERRWRN_Msk) == (CAN_SR_ERRWRN_Msk)); +} + +/** + * @brief Get bus busy flag + * @rmtoll SR BBSY FL_CAN_IsActiveFlag_BusBusy + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_BusBusy(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->SR, CAN_SR_BBSY_Msk) == (CAN_SR_BBSY_Msk)); +} + +/** + * @brief Get bus IDLE flag + * @rmtoll SR BIDLE FL_CAN_IsActiveFlag_BusIdle + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_BusIdle(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->SR, CAN_SR_BIDLE_Msk) == (CAN_SR_BIDLE_Msk)); +} + +/** + * @brief Get normal mode flag + * @rmtoll SR NORMAL FL_CAN_IsActiveFlag_NormalMode + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_NormalMode(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->SR, CAN_SR_NORMAL_Msk) == (CAN_SR_NORMAL_Msk)); +} + +/** + * @brief Get loop back mode flag + * @rmtoll SR LBACK FL_CAN_IsActiveFlag_LoopbackMode + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_LoopbackMode(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->SR, CAN_SR_LBACK_Msk) == (CAN_SR_LBACK_Msk)); +} + +/** + * @brief Get configuration mode flag + * @rmtoll SR CONFIG FL_CAN_IsActiveFlag_ConfigMode + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_ConfigMode(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->SR, CAN_SR_CONFIG_Msk) == (CAN_SR_CONFIG_Msk)); +} + +/** + * @brief Get bus off interrupt flag + * @rmtoll ISR BSOFF FL_CAN_IsActiveFlag_BusOff + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_BusOff(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ISR, CAN_ISR_BSOFF_Msk) == (CAN_ISR_BSOFF_Msk)); +} + +/** + * @brief Get error interrupt flag + * @rmtoll ISR ERROR FL_CAN_IsActiveFlag_Error + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_Error(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ISR, CAN_ISR_ERROR_Msk) == (CAN_ISR_ERROR_Msk)); +} + +/** + * @brief Get receive FIFO not empty interrupt flag + * @rmtoll ISR RXNEMP FL_CAN_IsActiveFlag_RXNotEmpty + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_RXNotEmpty(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ISR, CAN_ISR_RXNEMP_Msk) == (CAN_ISR_RXNEMP_Msk)); +} + +/** + * @brief Get receive FIFO overflow interrupt flag + * @rmtoll ISR RXOFLW FL_CAN_IsActiveFlag_RXOverflow + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_RXOverflow(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ISR, CAN_ISR_RXOFLW_Msk) == (CAN_ISR_RXOFLW_Msk)); +} + +/** + * @brief Get receive FIFO empty interrupt flag + * @rmtoll ISR RXUFLW FL_CAN_IsActiveFlag_RXEmpty + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_RXEmpty(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ISR, CAN_ISR_RXUFLW_Msk) == (CAN_ISR_RXUFLW_Msk)); +} + +/** + * @brief Get receive Ok interrupt flag + * @rmtoll ISR RXOK FL_CAN_IsActiveFlag_RXOK + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_RXOK(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ISR, CAN_ISR_RXOK_Msk) == (CAN_ISR_RXOK_Msk)); +} + +/** + * @brief Get high priority transmit buffer FULL interrupt flag + * @rmtoll ISR TXBFLL FL_CAN_IsActiveFlag_TXHighPriorBuffFull + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_TXHighPriorBuffFull(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ISR, CAN_ISR_TXBFLL_Msk) == (CAN_ISR_TXBFLL_Msk)); +} + +/** + * @brief Get transmit FIFO FULL interrupt flag + * @rmtoll ISR TXFLL FL_CAN_IsActiveFlag_TXBuffFull + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_TXBuffFull(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ISR, CAN_ISR_TXFLL_Msk) == (CAN_ISR_TXFLL_Msk)); +} + +/** + * @brief Get transmission OK interrupt flag + * @rmtoll ISR TXOK FL_CAN_IsActiveFlag_TXOK + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_TXOK(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ISR, CAN_ISR_TXOK_Msk) == (CAN_ISR_TXOK_Msk)); +} + +/** + * @brief Get arbitration lost interrupt flag + * @rmtoll ISR ARBLST FL_CAN_IsActiveFlag_ArbitrationLost + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsActiveFlag_ArbitrationLost(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->ISR, CAN_ISR_ARBLST_Msk) == (CAN_ISR_ARBLST_Msk)); +} + +/** + * @brief Bus OFF interrupt enable + * @rmtoll IER BSOFFIE FL_CAN_EnableIT_BusOff + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_EnableIT_BusOff(CAN_Type *CANx) +{ + SET_BIT(CANx->IER, CAN_IER_BSOFFIE_Msk); +} + +/** + * @brief Get bus OFF interrupt enable status + * @rmtoll IER BSOFFIE FL_CAN_IsEnabledIT_BusOff + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsEnabledIT_BusOff(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->IER, CAN_IER_BSOFFIE_Msk) == CAN_IER_BSOFFIE_Msk); +} + +/** + * @brief Bus OFF interrupt disable + * @rmtoll IER BSOFFIE FL_CAN_DisableIT_BusOff + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_DisableIT_BusOff(CAN_Type *CANx) +{ + CLEAR_BIT(CANx->IER, CAN_IER_BSOFFIE_Msk); +} + +/** + * @brief Error interrupt enable + * @rmtoll IER ERRORIE FL_CAN_EnableIT_Error + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_EnableIT_Error(CAN_Type *CANx) +{ + SET_BIT(CANx->IER, CAN_IER_ERRORIE_Msk); +} + +/** + * @brief Get error interrupt enable status + * @rmtoll IER ERRORIE FL_CAN_IsEnabledIT_Error + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsEnabledIT_Error(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->IER, CAN_IER_ERRORIE_Msk) == CAN_IER_ERRORIE_Msk); +} + +/** + * @brief Error interrupt disable + * @rmtoll IER ERRORIE FL_CAN_DisableIT_Error + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_DisableIT_Error(CAN_Type *CANx) +{ + CLEAR_BIT(CANx->IER, CAN_IER_ERRORIE_Msk); +} + +/** + * @brief Receive FIFO not empty interrupt enable + * @rmtoll IER RXNEMPIE FL_CAN_EnableIT_RXNotEmpty + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_EnableIT_RXNotEmpty(CAN_Type *CANx) +{ + SET_BIT(CANx->IER, CAN_IER_RXNEMPIE_Msk); +} + +/** + * @brief Get receive FIFO not empty interrupt enable status + * @rmtoll IER RXNEMPIE FL_CAN_IsEnabledIT_RXNotEmpty + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsEnabledIT_RXNotEmpty(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->IER, CAN_IER_RXNEMPIE_Msk) == CAN_IER_RXNEMPIE_Msk); +} + +/** + * @brief Receive FIFO not empty interrupt disable + * @rmtoll IER RXNEMPIE FL_CAN_DisableIT_RXNotEmpty + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_DisableIT_RXNotEmpty(CAN_Type *CANx) +{ + CLEAR_BIT(CANx->IER, CAN_IER_RXNEMPIE_Msk); +} + +/** + * @brief Receive FIFO overflow interrupt ennable + * @rmtoll IER RXOFLWIE FL_CAN_EnableIT_RXOverflow + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_EnableIT_RXOverflow(CAN_Type *CANx) +{ + SET_BIT(CANx->IER, CAN_IER_RXOFLWIE_Msk); +} + +/** + * @brief Get receive FIFO overflow interrupt enable status + * @rmtoll IER RXOFLWIE FL_CAN_IsEnabledIT_RXOverflow + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsEnabledIT_RXOverflow(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->IER, CAN_IER_RXOFLWIE_Msk) == CAN_IER_RXOFLWIE_Msk); +} + +/** + * @brief Receive FIFO overflow interrupt disable + * @rmtoll IER RXOFLWIE FL_CAN_DisableIT_RXOverflow + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_DisableIT_RXOverflow(CAN_Type *CANx) +{ + CLEAR_BIT(CANx->IER, CAN_IER_RXOFLWIE_Msk); +} + +/** + * @brief Receive FIFO empty interrupt enable + * @rmtoll IER RXUFLWIE FL_CAN_EnableIT_RXEmpty + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_EnableIT_RXEmpty(CAN_Type *CANx) +{ + SET_BIT(CANx->IER, CAN_IER_RXUFLWIE_Msk); +} + +/** + * @brief Get receive FIFO empty interrupt enable status + * @rmtoll IER RXUFLWIE FL_CAN_IsEnabledIT_RXEmpty + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsEnabledIT_RXEmpty(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->IER, CAN_IER_RXUFLWIE_Msk) == CAN_IER_RXUFLWIE_Msk); +} + +/** + * @brief Receive FIFO empty interrupt disable + * @rmtoll IER RXUFLWIE FL_CAN_DisableIT_RXEmpty + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_DisableIT_RXEmpty(CAN_Type *CANx) +{ + CLEAR_BIT(CANx->IER, CAN_IER_RXUFLWIE_Msk); +} + +/** + * @brief Receive OK interrupt enable + * @rmtoll IER RXOKIE FL_CAN_EnableIT_RXOK + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_EnableIT_RXOK(CAN_Type *CANx) +{ + SET_BIT(CANx->IER, CAN_IER_RXOKIE_Msk); +} + +/** + * @brief Get receive OK interrupt enable + * @rmtoll IER RXOKIE FL_CAN_IsEnabledIT_RXOK + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsEnabledIT_RXOK(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->IER, CAN_IER_RXOKIE_Msk) == CAN_IER_RXOKIE_Msk); +} + +/** + * @brief Receive OK interrupt disable + * @rmtoll IER RXOKIE FL_CAN_DisableIT_RXOK + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_DisableIT_RXOK(CAN_Type *CANx) +{ + CLEAR_BIT(CANx->IER, CAN_IER_RXOKIE_Msk); +} + +/** + * @brief High priority transmit buffer FULL interrupt enable + * @rmtoll IER TXBFLLIE FL_CAN_EnableIT_TXHighPriorBuffFull + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_EnableIT_TXHighPriorBuffFull(CAN_Type *CANx) +{ + SET_BIT(CANx->IER, CAN_IER_TXBFLLIE_Msk); +} + +/** + * @brief Get high priority transmit buffer FULL interrupt enable status + * @rmtoll IER TXBFLLIE FL_CAN_IsEnabledIT_TXHighPriorBuffFull + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsEnabledIT_TXHighPriorBuffFull(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->IER, CAN_IER_TXBFLLIE_Msk) == CAN_IER_TXBFLLIE_Msk); +} + +/** + * @brief High priority transmit buffer FULL interrupt disable + * @rmtoll IER TXBFLLIE FL_CAN_DisableIT_TXHighPriorBuffFull + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_DisableIT_TXHighPriorBuffFull(CAN_Type *CANx) +{ + CLEAR_BIT(CANx->IER, CAN_IER_TXBFLLIE_Msk); +} + +/** + * @brief Transmit FIFO FULL interrupt enable + * @rmtoll IER TXFLLIE FL_CAN_EnableIT_TXBuffFull + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_EnableIT_TXBuffFull(CAN_Type *CANx) +{ + SET_BIT(CANx->IER, CAN_IER_TXFLLIE_Msk); +} + +/** + * @brief Get transmit FIFO FULL interrupt enable + * @rmtoll IER TXFLLIE FL_CAN_IsEnabledIT_TXBuffFull + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsEnabledIT_TXBuffFull(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->IER, CAN_IER_TXFLLIE_Msk) == CAN_IER_TXFLLIE_Msk); +} + +/** + * @brief Transmit FIFO FULL interrupt disable + * @rmtoll IER TXFLLIE FL_CAN_DisableIT_TXBuffFull + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_DisableIT_TXBuffFull(CAN_Type *CANx) +{ + CLEAR_BIT(CANx->IER, CAN_IER_TXFLLIE_Msk); +} + +/** + * @brief Transmission OK interrupt enable + * @rmtoll IER TXOKIE FL_CAN_EnableIT_TXOK + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_EnableIT_TXOK(CAN_Type *CANx) +{ + SET_BIT(CANx->IER, CAN_IER_TXOKIE_Msk); +} + +/** + * @brief Get transmission OK interrupt enable status + * @rmtoll IER TXOKIE FL_CAN_IsEnabledIT_TXOK + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsEnabledIT_TXOK(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->IER, CAN_IER_TXOKIE_Msk) == CAN_IER_TXOKIE_Msk); +} + +/** + * @brief Transmission OK interrupt disable + * @rmtoll IER TXOKIE FL_CAN_DisableIT_TXOK + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_DisableIT_TXOK(CAN_Type *CANx) +{ + CLEAR_BIT(CANx->IER, CAN_IER_TXOKIE_Msk); +} + +/** + * @brief Arbitration lost interrupt enable + * @rmtoll IER ARBLSTIE FL_CAN_EnableIT_ArbitrationLost + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_EnableIT_ArbitrationLost(CAN_Type *CANx) +{ + SET_BIT(CANx->IER, CAN_IER_ARBLSTIE_Msk); +} + +/** + * @brief Get arbitration lost interrupt enable + * @rmtoll IER ARBLSTIE FL_CAN_IsEnabledIT_ArbitrationLost + * @param CANx CAN instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_IsEnabledIT_ArbitrationLost(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->IER, CAN_IER_ARBLSTIE_Msk) == CAN_IER_ARBLSTIE_Msk); +} + +/** + * @brief Arbitration lost interrupt disable + * @rmtoll IER ARBLSTIE FL_CAN_DisableIT_ArbitrationLost + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_DisableIT_ArbitrationLost(CAN_Type *CANx) +{ + CLEAR_BIT(CANx->IER, CAN_IER_ARBLSTIE_Msk); +} + +/** + * @brief Clear bus off interrupt flag + * @rmtoll ICR CBSOFF FL_CAN_ClearFlag_BusOff + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_BusOff(CAN_Type *CANx) +{ + WRITE_REG(CANx->ICR, CAN_ICR_CBSOFF_Msk); +} + +/** + * @brief Clear error interrupt flag + * @rmtoll ICR CERROR FL_CAN_ClearFlag_Error + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_Error(CAN_Type *CANx) +{ + WRITE_REG(CANx->ICR, CAN_ICR_CERROR_Msk); +} + +/** + * @brief Clear receive FIFO not empty interrupt flag + * @rmtoll ICR CRXNEMP FL_CAN_ClearFlag_RXNotEmpty + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_RXNotEmpty(CAN_Type *CANx) +{ + WRITE_REG(CANx->ICR, CAN_ICR_CRXNEMP_Msk); +} + +/** + * @brief Clear receive FIFO overflow interrupt flag + * @rmtoll ICR CRXOFLW FL_CAN_ClearFlag_RXOverflow + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_RXOverflow(CAN_Type *CANx) +{ + WRITE_REG(CANx->ICR, CAN_ICR_CRXOFLW_Msk); +} + +/** + * @brief Clear receive FIFO underflow interrupt flag + * @rmtoll ICR CRXUFLW FL_CAN_ClearFlag_RXEmpty + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_RXEmpty(CAN_Type *CANx) +{ + WRITE_REG(CANx->ICR, CAN_ICR_CRXUFLW_Msk); +} + +/** + * @brief Clear receive OK interrupt flag + * @rmtoll ICR CRXOK FL_CAN_ClearFlag_RXOK + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_RXOK(CAN_Type* CANx) +{ + WRITE_REG(CANx->ICR, CAN_ICR_CRXOK_Msk); +} + +/** + * @brief Clear high priority transmit buffer FULL interrupt flag + * @rmtoll ICR CTXBFLL FL_CAN_ClearFlag_TXHighPriorBuffFull + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_TXHighPriorBuffFull(CAN_Type *CANx) +{ + WRITE_REG(CANx->ICR, CAN_ICR_CTXBFLL_Msk); +} + +/** + * @brief Clear transmit FIFO FULL interrupt flag + * @rmtoll ICR CTXFLL FL_CAN_ClearFlag_TXBuffFull + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_TXBuffFull(CAN_Type *CANx) +{ + WRITE_REG(CANx->ICR, CAN_ICR_CTXFLL_Msk); +} + +/** + * @brief Clear transmission OK interrupt flag + * @rmtoll ICR CTXOK FL_CAN_ClearFlag_TXOK + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_TXOK(CAN_Type *CANx) +{ + WRITE_REG(CANx->ICR, CAN_ICR_CTXOK_Msk); +} + +/** + * @brief Clear arbitration lost interrupt flag + * @rmtoll ICR CARBLST FL_CAN_ClearFlag_ArbitrationLost + * @param CANx CAN instance + * @retval None + */ +__STATIC_INLINE void FL_CAN_ClearFlag_ArbitrationLost(CAN_Type *CANx) +{ + WRITE_REG(CANx->ICR, CAN_ICR_CARBLST_Msk); +} + +/** + * @brief Set TXFIFO message identifier code + * @rmtoll TXFIDR IDR FL_CAN_WriteTXMessageID + * @param CANx CAN instance + * @param id + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteTXMessageID(CAN_Type *CANx, uint32_t id) +{ + MODIFY_REG(CANx->TXFIDR, (0xffffffffU << 0U), (id << 0U)); +} + +/** + * @brief Get TXFIFO message identifier code + * @rmtoll TXFIDR IDR FL_CAN_ReadTXMessageID + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadTXMessageID(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->TXFIDR, 0xffffffffU) >> 0U); +} + +/** + * @brief Set TXFIFO data length code + * @rmtoll TXFDLCR DLC FL_CAN_WriteTXMessageLength + * @param CANx CAN instance + * @param length + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteTXMessageLength(CAN_Type *CANx, uint32_t length) +{ + MODIFY_REG(CANx->TXFDLCR, (0xfU << 0U), (length << 0U)); +} + +/** + * @brief Get TXFIFO data length code + * @rmtoll TXFDLCR DLC FL_CAN_ReadTXMessageLength + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadTXMessageLength(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->TXFDLCR, 0xfU) >> 0U); +} + +/** + * @brief Set TXFIFO data word1 + * @rmtoll TXFDW1R DB FL_CAN_WriteTXMessageWord1 + * @param CANx CAN instance + * @param word + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteTXMessageWord1(CAN_Type *CANx, uint32_t word) +{ + MODIFY_REG(CANx->TXFDW1R, (0xffffffffU << 0U), (word << 0U)); +} + +/** + * @brief Get TXFIFO data word1 + * @rmtoll TXFDW1R DB FL_CAN_ReadTXMessageWord1 + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadTXMessageWord1(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->TXFDW1R, 0xffffffffU) >> 0U); +} + +/** + * @brief Set TXFIFO data word2 + * @rmtoll TXFDW2R DB FL_CAN_WriteTXMessageWord2 + * @param CANx CAN instance + * @param word + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteTXMessageWord2(CAN_Type *CANx, uint32_t word) +{ + MODIFY_REG(CANx->TXFDW2R, (0xffffffffU << 0U), (word << 0U)); +} + +/** + * @brief Get TXFIFO data word2 + * @rmtoll TXFDW2R DB FL_CAN_ReadTXMessageWord2 + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadTXMessageWord2(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->TXFDW2R, 0xffffffffU) >> 0U); +} + +/** + * @brief Set HPB identifier code + * @rmtoll HPBIDR IDR FL_CAN_WriteHighPriorTXMessageID + * @param CANx CAN instance + * @param id + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteHighPriorTXMessageID(CAN_Type *CANx, uint32_t id) +{ + MODIFY_REG(CANx->HPBIDR, (0xffffffffU << 0U), (id << 0U)); +} + +/** + * @brief Get HPB identifier code + * @rmtoll HPBIDR IDR FL_CAN_ReadHighPriorTXMessageID + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadHighPriorTXMessageID(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->HPBIDR, 0xffffffffU) >> 0U); +} + +/** + * @brief Set HPB data length code + * @rmtoll HPBDLCR DLC FL_CAN_WriteHighPriorMessageLength + * @param CANx CAN instance + * @param length + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteHighPriorMessageLength(CAN_Type *CANx, uint32_t length) +{ + MODIFY_REG(CANx->HPBDLCR, (0xfU << 0U), (length << 0U)); +} + +/** + * @brief Get HPB data length code + * @rmtoll HPBDLCR DLC FL_CAN_ReadHighPriorMessageLength + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadHighPriorMessageLength(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->HPBDLCR, 0xfU) >> 0U); +} + +/** + * @brief Set HPB data word1 + * @rmtoll HPBDW1R DB FL_CAN_WriteHighPriorMessageWord1 + * @param CANx CAN instance + * @param word + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteHighPriorMessageWord1(CAN_Type *CANx, uint32_t word) +{ + MODIFY_REG(CANx->HPBDW1R, (0xffffffffU << 0U), (word << 0U)); +} + +/** + * @brief Get HPB data word1 + * @rmtoll HPBDW1R DB FL_CAN_ReadHighPriorMessageWord1 + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadHighPriorMessageWord1(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->HPBDW1R, 0xffffffffU) >> 0U); +} + +/** + * @brief Set HPB data word2 + * @rmtoll HPBDW2R DB FL_CAN_WriteHighPriorMessageWord2 + * @param CANx CAN instance + * @param word + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteHighPriorMessageWord2(CAN_Type *CANx, uint32_t word) +{ + MODIFY_REG(CANx->HPBDW2R, (0xffffffffU << 0U), (word << 0U)); +} + +/** + * @brief Get HPB data word2 + * @rmtoll HPBDW2R DB FL_CAN_ReadHighPriorMessageWord2 + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadHighPriorMessageWord2(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->HPBDW2R, 0xffffffffU) >> 0U); +} + +/** + * @brief Set RXFIFO message identifier code + * @rmtoll RXFIDR IDR FL_CAN_WriteRXMessageID + * @param CANx CAN instance + * @param id + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteRXMessageID(CAN_Type *CANx, uint32_t id) +{ + MODIFY_REG(CANx->RXFIDR, (0xffffffffU << 0U), (id << 0U)); +} + +/** + * @brief Get RXFIFO message identifier code + * @rmtoll RXFIDR IDR FL_CAN_ReadRXMessageID + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadRXMessageID(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->RXFIDR, 0xffffffffU) >> 0U); +} + +/** + * @brief Set RXFIFO data length code + * @rmtoll RXFDLCR DLC FL_CAN_WriteRXMessageLength + * @param CANx CAN instance + * @param length + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteRXMessageLength(CAN_Type *CANx, uint32_t length) +{ + MODIFY_REG(CANx->RXFDLCR, (0xfU << 0U), (length << 0U)); +} + +/** + * @brief Get RXFIFO data length code + * @rmtoll RXFDLCR DLC FL_CAN_ReadRXMessageLength + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadRXMessageLength(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->RXFDLCR, 0xfU) >> 0U); +} + +/** + * @brief Set RXFIFO data word1 + * @rmtoll RXFDW1R DB FL_CAN_WriteRXMessageWord1 + * @param CANx CAN instance + * @param word + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteRXMessageWord1(CAN_Type *CANx, uint32_t word) +{ + MODIFY_REG(CANx->RXFDW1R, (0xffffffffU << 0U), (word << 0U)); +} + +/** + * @brief Get RXFIFO data word1 + * @rmtoll RXFDW1R DB FL_CAN_ReadRXMessageWord1 + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadRXMessageWord1(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->RXFDW1R, 0xffffffffU) >> 0U); +} + +/** + * @brief Set RXFIFO data word2 + * @rmtoll RXFDW2R DB FL_CAN_WriteRXMessageWord2 + * @param CANx CAN instance + * @param word + * @retval None + */ +__STATIC_INLINE void FL_CAN_WriteRXMessageWord2(CAN_Type *CANx, uint32_t word) +{ + MODIFY_REG(CANx->RXFDW2R, (0xffffffffU << 0U), (word << 0U)); +} + +/** + * @brief Get RXFIFO data word2 + * @rmtoll RXFDW2R DB FL_CAN_ReadRXMessageWord2 + * @param CANx CAN instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_ReadRXMessageWord2(CAN_Type *CANx) +{ + return (uint32_t)(READ_BIT(CANx->RXFDW2R, 0xffffffffU) >> 0U); +} + +/** + * @brief Acceptance filter 4 enable + * @rmtoll AFR UAF FL_CAN_Filter_Enable + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval None + */ +__STATIC_INLINE void FL_CAN_Filter_Enable(CAN_Type *CANx, uint32_t filterX) +{ + SET_BIT(CANx->AFR, 0x1U << filterX); +} + +/** + * @brief Get acceptance filter 4 enable status + * @rmtoll AFR UAF FL_CAN_Filter_IsEnabled + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_Filter_IsEnabled(CAN_Type *CANx, uint32_t filterX) +{ + return (uint32_t)(READ_BIT(CANx->AFR, (((0x1U << filterX) & 0xf) << CAN_AFR_UAF_Pos)) == (((0x1U << filterX) & 0xf) << CAN_AFR_UAF_Pos)); +} + +/** + * @brief Acceptance filter 4 disable + * @rmtoll AFR UAF FL_CAN_Filter_Disable + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval None + */ +__STATIC_INLINE void FL_CAN_Filter_Disable(CAN_Type *CANx, uint32_t filterX) +{ + CLEAR_BIT(CANx->AFR, (((0x1U << filterX) & 0xf) << CAN_AFR_UAF_Pos)); +} + +/** + * @brief Enable RTR participate filter compare + * @rmtoll AFMR AMRTR FL_CAN_Filter_EnableRTRCompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval None + */ +__STATIC_INLINE void FL_CAN_Filter_EnableRTRCompare(CAN_Type *CANx, uint32_t filterX) +{ + SET_BIT(*(&(CANx->AFMR0) + 2 * filterX), CAN_AFMR_AMRTR_Msk); +} + +/** + * @brief Disable RTR participate filter compare + * @rmtoll AFMR AMRTR FL_CAN_Filter_DisableRTRCompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE void FL_CAN_Filter_DisableRTRCompare(CAN_Type *CANx, uint32_t filterX) +{ + CLEAR_BIT(*(&(CANx->AFMR0) + 2 * filterX), CAN_AFMR_AMRTR_Msk); +} + +/** + * @brief Get RTR participate filter compare Enable Status + * @rmtoll AFMR AMRTR FL_CAN_Filter_IsEnabledRTRCompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_Filter_IsEnabledRTRCompare(CAN_Type *CANx, uint32_t filterX) +{ + return (uint32_t)(READ_BIT(*(&(CANx->AFMR0) + 2 * filterX), CAN_AFMR_AMRTR_Msk) == CAN_AFMR_AMRTR_Msk); +} + +/** + * @brief Set ID low 18bit participate filter compare + * @rmtoll AFMR AMID18 FL_CAN_Filter_WriteEXTIDCompareMask + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval None + */ +__STATIC_INLINE void FL_CAN_Filter_WriteEXTIDCompareMask(CAN_Type *CANx, uint32_t filterX, uint32_t id18) +{ + MODIFY_REG(*(&(CANx->AFMR0) + 2 * filterX), (0x3ffffU << CAN_AFMR_AMID18_Pos), (id18 << CAN_AFMR_AMID18_Pos)); +} + +/** + * @brief Get ID low 18bit participate filter compare + * @rmtoll AFMR AMID18 FL_CAN_Filter_ReadEXTIDCompareMask + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval None + */ +__STATIC_INLINE uint32_t FL_CAN_Filter_ReadEXTIDCompareMask(CAN_Type *CANx, uint32_t filterX) +{ + return (uint32_t)(READ_BIT(*(&(CANx->AFMR0) + 2 * filterX), (0x3ffffU << CAN_AFMR_AMID18_Pos)) >> CAN_AFMR_AMID18_Pos); +} + +/** + * @brief Enable IDE participate filter compare + * @rmtoll AFMR AMIDE FL_CAN_Filter_EnableIDECompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval None + */ +__STATIC_INLINE void FL_CAN_Filter_EnableIDECompare(CAN_Type *CANx, uint32_t filterX) +{ + SET_BIT(*(&(CANx->AFMR0) + 2 * filterX), CAN_AFMR_AMIDE_Msk); +} + +/** + * @brief Disable IDE participate filter compare + * @rmtoll AFMR AMIDE FL_CAN_Filter_DisableIDECompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE void FL_CAN_Filter_DisableIDECompare(CAN_Type *CANx, uint32_t filterX) +{ + CLEAR_BIT(*(&(CANx->AFMR0) + 2 * filterX), CAN_AFMR_AMIDE_Msk); +} + +/** + * @brief Get IDE participate filter compare Enable Status + * @rmtoll AFMR AMIDE FL_CAN_Filter_IsEnabledIDECompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_Filter_IsEnabledIDECompare(CAN_Type *CANx, uint32_t filterX) +{ + return (uint32_t)(READ_BIT(*(&(CANx->AFMR0) + 2 * filterX), CAN_AFMR_AMIDE_Msk) == CAN_AFMR_AMIDE_Msk); +} + +/** + * @brief Enable SRR participate filter compare + * @rmtoll AFMR AMSRR FL_CAN_Filter_EnableSRRCompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval None + */ +__STATIC_INLINE void FL_CAN_Filter_EnableSRRCompare(CAN_Type *CANx, uint32_t filterX) +{ + SET_BIT(*(&(CANx->AFMR0) + 2 * filterX), CAN_AFMR_AMSRR_Msk); +} + +/** + * @brief Disable SRR participate filter compare + * @rmtoll AFMR AMSRR FL_CAN_Filter_DisableSRRCompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE void FL_CAN_Filter_DisableSRRCompare(CAN_Type *CANx, uint32_t filterX) +{ + CLEAR_BIT(*(&(CANx->AFMR0) + 2 * filterX), CAN_AFMR_AMSRR_Msk); +} + +/** + * @brief Get SRR participate filter compare Enable Status + * @rmtoll AFMR AMSRR FL_CAN_Filter_IsEnabledSRRCompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CAN_Filter_IsEnabledSRRCompare(CAN_Type *CANx, uint32_t filterX) +{ + return (uint32_t)(READ_BIT(*(&(CANx->AFMR0) + 2 * filterX), CAN_AFMR_AMSRR_Msk) == CAN_AFMR_AMSRR_Msk); +} + +/** + * @brief Set ID high 11bit participate filter compare + * @rmtoll AFMR AMID11 FL_CAN_Filter_WriteIDCompareMask + * @param CANx CAN instance + * @param filterX + * @param id11 + * @retval None + */ +__STATIC_INLINE void FL_CAN_Filter_WriteIDCompareMask(CAN_Type *CANx, uint32_t filterX, uint32_t id11) +{ + MODIFY_REG(*((&(CANx->AFMR0)) + 2 * filterX), (0x7ffU << CAN_AFMR_AMID11_Pos), id11 << CAN_AFMR_AMID11_Pos); +} + +/** + * @brief Get ID high 11bit participate filter compare + * @rmtoll AFMR AMID11 FL_CAN_Filter_ReadIDCompareMask + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_Filter_ReadIDCompareMask(CAN_Type *CANx, uint32_t filterX) +{ + return (uint32_t)(READ_BIT(*((&(CANx->AFMR0)) + 2 * filterX), (0x7ffU << CAN_AFMR_AMID11_Pos)) >> CAN_AFMR_AMID11_Pos); +} + +/** + * @brief Set filter RTR + * @rmtoll AFIR AIRTR FL_CAN_Filter_SetRTRCompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @param rtr This parameter can be one of the following values: + * @arg @ref FL_CAN_RTR_BIT_LOW + * @arg @ref FL_CAN_RTR_BIT_HIGH + * @retval None + */ +__STATIC_INLINE void FL_CAN_Filter_SetRTRCompare(CAN_Type *CANx, uint32_t filterX, uint32_t rtr) +{ + MODIFY_REG(*((&(CANx->AFIR0)) + 2 * filterX), CAN_AFIR_AIRTR_Msk, rtr ); +} + +/** + * @brief Get filter RTR + * @rmtoll AFIR AIRTR FL_CAN_Filter_GetRTRCompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_CAN_RTR_BIT_LOW + * @arg @ref FL_CAN_RTR_BIT_HIGH + */ +__STATIC_INLINE uint32_t FL_CAN_Filter_GetRTRCompare(CAN_Type *CANx, uint32_t filterX) +{ + return (uint32_t)(READ_BIT(*((&(CANx->AFIR0)) + 2 * filterX), CAN_AFIR_AIRTR_Msk)); +} + +/** + * @brief Set filter ID[17:0] + * @rmtoll AFIR AIID18 FL_CAN_Filter_WriteEXTIDCompare + * @param CANx CAN instance + * @param filterX + * @param id18 + * @retval None + */ +__STATIC_INLINE void FL_CAN_Filter_WriteEXTIDCompare(CAN_Type *CANx, uint32_t filterX, uint32_t id18) +{ + MODIFY_REG(*(&(CANx->AFIR0) + 2 * filterX), (0x3ffffU << CAN_AFIR_AIID18_Pos), (id18 << CAN_AFIR_AIID18_Pos)); +} + +/** + * @brief Get filter ID[17:0] + * @rmtoll AFIR AIID18 FL_CAN_Filter_ReadEXTIDCompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_Filter_ReadEXTIDCompare(CAN_Type *CANx, uint32_t filterX) +{ + return (uint32_t)(READ_BIT(*(&(CANx->AFIR0) + 2 * filterX), (0x3ffffU << CAN_AFIR_AIID18_Pos)) >> CAN_AFIR_AIID18_Pos); +} + +/** + * @brief Set filter IDE + * @rmtoll AFIR AIIDE FL_CAN_Filter_SetIDECompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @param ide This parameter can be one of the following values: + * @arg @ref FL_CAN_IDE_BIT_LOW + * @arg @ref FL_CAN_IDE_BIT_HIGH + * @retval None + */ +__STATIC_INLINE void FL_CAN_Filter_SetIDECompare(CAN_Type *CANx, uint32_t filterX, uint32_t ide) +{ + MODIFY_REG(*((&(CANx->AFIR0)) + 2 * filterX), CAN_AFIR_AIIDE_Msk, ide); +} + +/** + * @brief Get filter IDE + * @rmtoll AFIR AIIDE FL_CAN_Filter_GetIDECompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_CAN_IDE_BIT_LOW + * @arg @ref FL_CAN_IDE_BIT_HIGH + */ +__STATIC_INLINE uint32_t FL_CAN_Filter_GetIDECompare(CAN_Type *CANx, uint32_t filterX) +{ + return (uint32_t)(READ_BIT(*((&(CANx->AFIR0)) + 2 * filterX), CAN_AFIR_AIIDE_Msk)); +} + +/** + * @brief Set filter SRR + * @rmtoll AFIR AISRR FL_CAN_Filter_SetSRRCompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @param srr This parameter can be one of the following values: + * @arg @ref FL_CAN_SRR_BIT_LOW + * @arg @ref FL_CAN_SRR_BIT_HIGH + * @retval None + */ +__STATIC_INLINE void FL_CAN_Filter_SetSRRCompare(CAN_Type *CANx, uint32_t filterX, uint32_t srr) +{ + MODIFY_REG(*((&(CANx->AFIR0)) + 2 * filterX), CAN_AFIR_AISRR_Msk, srr); +} + +/** + * @brief Get filter SRR + * @rmtoll AFIR AISRR FL_CAN_Filter_GetSRRCompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_CAN_SRR_BIT_LOW + * @arg @ref FL_CAN_SRR_BIT_HIGH + */ +__STATIC_INLINE uint32_t FL_CAN_Filter_GetSRRCompare(CAN_Type *CANx, uint32_t filterX) +{ + return (uint32_t)(READ_BIT(*((&(CANx->AFIR0)) + 2 * filterX), CAN_AFIR_AISRR_Msk)); +} + +/** + * @brief Set filterID[28:18] + * @rmtoll AFIR AIID11 FL_CAN_Filter_WriteIDCompare + * @param CANx CAN instance + * @param filterX + * @param id11 + * @retval None + */ +__STATIC_INLINE void FL_CAN_Filter_WriteIDCompare(CAN_Type *CANx, uint32_t filterX, uint32_t id11) +{ + MODIFY_REG(*((&(CANx->AFIR0)) + 2 * filterX), (0x7ffU << CAN_AFIR_AIID11_Pos), id11 << CAN_AFIR_AIID11_Pos); +} + +/** + * @brief Get filter ID[28:18] + * @rmtoll AFIR AIID11 FL_CAN_Filter_ReadIDCompare + * @param CANx CAN instance + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @retval + */ +__STATIC_INLINE uint32_t FL_CAN_Filter_ReadIDCompare(CAN_Type *CANx, uint32_t filterX) +{ + return (uint32_t)(READ_BIT(*((&(CANx->AFIR0)) + 2 * filterX), 0x7ffU) >> CAN_AFIR_AIID11_Pos); +} + +/** + * @} + */ + +/** @defgroup CAN_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_CAN_Init(CAN_Type *CANx, FL_CAN_InitTypeDef *CAN_InitStructure); +FL_ErrorStatus FL_CAN_FilterInit(CAN_Type *CANx, FL_CAN_FilterInitTypeDef *CAN_FilterInitStructure, uint32_t filterX); +void FL_CAN_StructInit(FL_CAN_InitTypeDef *CAN_InitStruct); +void FL_CAN_StructFilterInit(FL_CAN_FilterInitTypeDef *CAN_FilterInitStruct); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_CAN_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-12*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_cdif.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_cdif.h new file mode 100644 index 0000000..d65e6c0 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_cdif.h @@ -0,0 +1,222 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_cdif.h + * @author FMSH Application Team + * @brief Head file of CDIF FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_CDIF_H +#define __FM33LG0XX_FL_CDIF_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup CDIF CDIF + * @brief CDIF FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup CDIF_FL_ES_INIT CDIF Exported Init structures + * @{ + */ + +/** + * @brief FL CDIF Init Sturcture definition + */ + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup CDIF_FL_Exported_Constants CDIF Exported Constants + * @{ + */ + +#define CDIF_CR_INTF_IEN_Pos (1U) +#define CDIF_CR_INTF_IEN_Msk (0x1U << CDIF_CR_INTF_IEN_Pos) +#define CDIF_CR_INTF_IEN CDIF_CR_INTF_IEN_Msk + +#define CDIF_CR_INTF_OEN_Pos (0U) +#define CDIF_CR_INTF_OEN_Msk (0x1U << CDIF_CR_INTF_OEN_Pos) +#define CDIF_CR_INTF_OEN CDIF_CR_INTF_OEN_Msk + +#define CDIF_PRSC_PRSC_Pos (0U) +#define CDIF_PRSC_PRSC_Msk (0x7U << CDIF_PRSC_PRSC_Pos) +#define CDIF_PRSC_PRSC CDIF_PRSC_PRSC_Msk + + + +#define FL_CDIF_PSC_DIV1 (0x0U << CDIF_PRSC_PRSC_Pos) +#define FL_CDIF_PSC_DIV2 (0x1U << CDIF_PRSC_PRSC_Pos) +#define FL_CDIF_PSC_DIV4 (0x2U << CDIF_PRSC_PRSC_Pos) +#define FL_CDIF_PSC_DIV8 (0x3U << CDIF_PRSC_PRSC_Pos) +#define FL_CDIF_PSC_DIV16 (0x4U << CDIF_PRSC_PRSC_Pos) +#define FL_CDIF_PSC_DIV32 (0x5U << CDIF_PRSC_PRSC_Pos) +#define FL_CDIF_PSC_DIV64 (0x6U << CDIF_PRSC_PRSC_Pos) +#define FL_CDIF_PSC_DIV128 (0x7U << CDIF_PRSC_PRSC_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup CDIF_FL_Exported_Functions CDIF Exported Functions + * @{ + */ + +/** + * @brief VAO To CPU input enable + * @rmtoll CR INTF_IEN FL_CDIF_EnableVAOToCPU + * @param CDIFx CDIF instance + * @retval None + */ +__STATIC_INLINE void FL_CDIF_EnableVAOToCPU(CDIF_Type *CDIFx) +{ + SET_BIT(CDIFx->CR, CDIF_CR_INTF_IEN_Msk); +} + +/** + * @brief Get VAO To CPU input enable status + * @rmtoll CR INTF_IEN FL_CDIF_IsEnabledVAOToCPU + * @param CDIFx CDIF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CDIF_IsEnabledVAOToCPU(CDIF_Type *CDIFx) +{ + return (uint32_t)(READ_BIT(CDIFx->CR, CDIF_CR_INTF_IEN_Msk) == CDIF_CR_INTF_IEN_Msk); +} + +/** + * @brief VAO To CPU input disable + * @rmtoll CR INTF_IEN FL_CDIF_DisableVAOToCPU + * @param CDIFx CDIF instance + * @retval None + */ +__STATIC_INLINE void FL_CDIF_DisableVAOToCPU(CDIF_Type *CDIFx) +{ + CLEAR_BIT(CDIFx->CR, CDIF_CR_INTF_IEN_Msk); +} + +/** + * @brief CPU To VAO enable + * @rmtoll CR INTF_OEN FL_CDIF_EnableCPUToVAO + * @param CDIFx CDIF instance + * @retval None + */ +__STATIC_INLINE void FL_CDIF_EnableCPUToVAO(CDIF_Type *CDIFx) +{ + SET_BIT(CDIFx->CR, CDIF_CR_INTF_OEN_Msk); +} + +/** + * @brief Get CPU To VAO output enable status + * @rmtoll CR INTF_OEN FL_CDIF_IsEnabledCPUToVAO + * @param CDIFx CDIF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CDIF_IsEnabledCPUToVAO(CDIF_Type *CDIFx) +{ + return (uint32_t)(READ_BIT(CDIFx->CR, CDIF_CR_INTF_OEN_Msk) == CDIF_CR_INTF_OEN_Msk); +} + +/** + * @brief CPU To VAO output disable + * @rmtoll CR INTF_OEN FL_CDIF_DisableCPUToVAO + * @param CDIFx CDIF instance + * @retval None + */ +__STATIC_INLINE void FL_CDIF_DisableCPUToVAO(CDIF_Type *CDIFx) +{ + CLEAR_BIT(CDIFx->CR, CDIF_CR_INTF_OEN_Msk); +} + +/** + * @brief Set CDIF prescaler + * @rmtoll PRSC PRSC FL_CDIF_SetPrescaler + * @param CDIFx CDIF instance + * @param psc This parameter can be one of the following values: + * @arg @ref FL_CDIF_PSC_DIV1 + * @arg @ref FL_CDIF_PSC_DIV2 + * @arg @ref FL_CDIF_PSC_DIV4 + * @arg @ref FL_CDIF_PSC_DIV8 + * @arg @ref FL_CDIF_PSC_DIV16 + * @arg @ref FL_CDIF_PSC_DIV32 + * @arg @ref FL_CDIF_PSC_DIV64 + * @arg @ref FL_CDIF_PSC_DIV128 + * @retval None + */ +__STATIC_INLINE void FL_CDIF_SetPrescaler(CDIF_Type *CDIFx, uint32_t psc) +{ + MODIFY_REG(CDIFx->PRSC, CDIF_PRSC_PRSC_Msk, psc); +} + +/** + * @brief Get CDIF prescaler + * @rmtoll PRSC PRSC FL_CDIF_GetPrescaler + * @param CDIFx CDIF instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_CDIF_PSC_DIV1 + * @arg @ref FL_CDIF_PSC_DIV2 + * @arg @ref FL_CDIF_PSC_DIV4 + * @arg @ref FL_CDIF_PSC_DIV8 + * @arg @ref FL_CDIF_PSC_DIV16 + * @arg @ref FL_CDIF_PSC_DIV32 + * @arg @ref FL_CDIF_PSC_DIV64 + * @arg @ref FL_CDIF_PSC_DIV128 + */ +__STATIC_INLINE uint32_t FL_CDIF_GetPrescaler(CDIF_Type *CDIFx) +{ + return (uint32_t)(READ_BIT(CDIFx->PRSC, CDIF_PRSC_PRSC_Msk)); +} + +/** + * @} + */ + +/** @defgroup CDIF_FL_EF_Init Initialization and de-initialization functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_CDIF_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-11*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_cmu.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_cmu.h new file mode 100644 index 0000000..44de657 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_cmu.h @@ -0,0 +1,2285 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_cmu.h + * @author FMSH Application Team + * @brief Head file of CMU FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_CMU_H +#define __FM33LG0XX_FL_CMU_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup CMU CMU + * @brief CMU FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup CMU_FL_ES_INIT CMU Exported Init structures + * @{ + */ + +/** + * @brief FL CMU Init Sturcture definition + */ + +typedef enum +{ + FL_SYSTEM_CLOCK_RCHF_8M = 0, + FL_SYSTEM_CLOCK_RCHF_16M, + FL_SYSTEM_CLOCK_RCHF_24M, + FL_SYSTEM_CLOCK_PLL_RCHF_32M, + FL_SYSTEM_CLOCK_PLL_RCHF_48M, + FL_SYSTEM_CLOCK_PLL_RCHF_64M, + FL_SYSTEM_CLOCK_RCLP, + FL_SYSTEM_CLOCK_RCLF, + FL_SYSTEM_CLOCK_XTLF, + FL_SYSTEM_CLOCK_XTHF, +} FL_SystemClock; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup CMU_FL_Exported_Constants CMU Exported Constants + * @{ + */ + +#define CMU_IER_HFDET_IE_Pos (1U) +#define CMU_IER_HFDET_IE_Msk (0x1U << CMU_IER_HFDET_IE_Pos) +#define CMU_IER_HFDET_IE CMU_IER_HFDET_IE_Msk + +#define CMU_ISR_HFDETO_Pos (9U) +#define CMU_ISR_HFDETO_Msk (0x1U << CMU_ISR_HFDETO_Pos) +#define CMU_ISR_HFDETO CMU_ISR_HFDETO_Msk + +#define CMU_ISR_HFDET_IF_Pos (1U) +#define CMU_ISR_HFDET_IF_Msk (0x1U << CMU_ISR_HFDET_IF_Pos) +#define CMU_ISR_HFDET_IF CMU_ISR_HFDET_IF_Msk + +#define CMU_IER_SYSCES_IE_Pos (2U) +#define CMU_IER_SYSCES_IE_Msk (0x1U << CMU_IER_SYSCES_IE_Pos) +#define CMU_IER_SYSCES_IE CMU_IER_SYSCES_IE_Msk + +#define CMU_ISR_SYSCES_IF_Pos (2U) +#define CMU_ISR_SYSCES_IF_Msk (0x1U << CMU_ISR_SYSCES_IF_Pos) +#define CMU_ISR_SYSCES_IF CMU_ISR_SYSCES_IF_Msk + +#define CMU_SYSCLKCR_LSCATS_Pos (27U) +#define CMU_SYSCLKCR_LSCATS_Msk (0x1U << CMU_SYSCLKCR_LSCATS_Pos) +#define CMU_SYSCLKCR_LSCATS CMU_SYSCLKCR_LSCATS_Msk + +#define CMU_SYSCLKCR_SLP_ENEXTI_Pos (25U) +#define CMU_SYSCLKCR_SLP_ENEXTI_Msk (0x1U << CMU_SYSCLKCR_SLP_ENEXTI_Pos) +#define CMU_SYSCLKCR_SLP_ENEXTI CMU_SYSCLKCR_SLP_ENEXTI_Msk + +#define CMU_SYSCLKCR_APBPRES_Pos (16U) +#define CMU_SYSCLKCR_APBPRES_Msk (0x7U << CMU_SYSCLKCR_APBPRES_Pos) +#define CMU_SYSCLKCR_APBPRES CMU_SYSCLKCR_APBPRES_Msk + +#define CMU_SYSCLKCR_AHBPRES_Pos (8U) +#define CMU_SYSCLKCR_AHBPRES_Msk (0x7U << CMU_SYSCLKCR_AHBPRES_Pos) +#define CMU_SYSCLKCR_AHBPRES CMU_SYSCLKCR_AHBPRES_Msk + +#define CMU_SYSCLKCR_STCLKSEL_Pos (6U) +#define CMU_SYSCLKCR_STCLKSEL_Msk (0x3U << CMU_SYSCLKCR_STCLKSEL_Pos) +#define CMU_SYSCLKCR_STCLKSEL CMU_SYSCLKCR_STCLKSEL_Msk + +#define CMU_SYSCLKCR_SYSCLKSEL_Pos (0U) +#define CMU_SYSCLKCR_SYSCLKSEL_Msk (0x7U << CMU_SYSCLKCR_SYSCLKSEL_Pos) +#define CMU_SYSCLKCR_SYSCLKSEL CMU_SYSCLKCR_SYSCLKSEL_Msk + +#define CMU_RCHFCR_FSEL_Pos (16U) +#define CMU_RCHFCR_FSEL_Msk (0xfU << CMU_RCHFCR_FSEL_Pos) +#define CMU_RCHFCR_FSEL CMU_RCHFCR_FSEL_Msk + +#define CMU_RCHFCR_EN_Pos (0U) +#define CMU_RCHFCR_EN_Msk (0x1U << CMU_RCHFCR_EN_Pos) +#define CMU_RCHFCR_EN CMU_RCHFCR_EN_Msk + +#define CMU_RCHFTR_TRIM_Pos (0U) +#define CMU_RCHFTR_TRIM_Msk (0xffU << CMU_RCHFTR_TRIM_Pos) +#define CMU_RCHFTR_TRIM CMU_RCHFTR_TRIM_Msk + +#define CMU_PLLCR_EN_Pos (0U) +#define CMU_PLLCR_EN_Msk (0x1U << CMU_PLLCR_EN_Pos) +#define CMU_PLLCR_EN CMU_PLLCR_EN_Msk + +#define CMU_PLLCR_LOCKED_Pos (7U) +#define CMU_PLLCR_LOCKED_Msk (0x1U << CMU_PLLCR_LOCKED_Pos) +#define CMU_PLLCR_LOCKED CMU_PLLCR_LOCKED_Msk + +#define CMU_PLLCR_INSEL_Pos (1U) +#define CMU_PLLCR_INSEL_Msk (0x1U << CMU_PLLCR_INSEL_Pos) +#define CMU_PLLCR_INSEL CMU_PLLCR_INSEL_Msk + +#define CMU_PLLCR_DB_Pos (16U) +#define CMU_PLLCR_DB_Msk (0x7fU << CMU_PLLCR_DB_Pos) +#define CMU_PLLCR_DB CMU_PLLCR_DB_Msk + +#define CMU_PLLCR_REFPRSC_Pos (4U) +#define CMU_PLLCR_REFPRSC_Msk (0x7U << CMU_PLLCR_REFPRSC_Pos) +#define CMU_PLLCR_REFPRSC CMU_PLLCR_REFPRSC_Msk + +#define CMU_PLLCR_OSEL_Pos (3U) +#define CMU_PLLCR_OSEL_Msk (0x1U << CMU_PLLCR_OSEL_Pos) +#define CMU_PLLCR_OSEL CMU_PLLCR_OSEL_Msk + +#define CMU_RCLPCR_ENB_Pos (0U) +#define CMU_RCLPCR_ENB_Msk (0x1U << CMU_RCLPCR_ENB_Pos) +#define CMU_RCLPCR_ENB CMU_RCLPCR_ENB_Msk + +#define CMU_RCLPTR_TRIM_Pos (0U) +#define CMU_RCLPTR_TRIM_Msk (0xffU << CMU_RCLPTR_TRIM_Pos) +#define CMU_RCLPTR_TRIM CMU_RCLPTR_TRIM_Msk + +#define CMU_LSCLKSEL_SEL_Pos (0U) +#define CMU_LSCLKSEL_SEL_Msk (0xffU << CMU_LSCLKSEL_SEL_Pos) +#define CMU_LSCLKSEL_SEL CMU_LSCLKSEL_SEL_Msk + +#define CMU_XTHFCR_CFG_Pos (8U) +#define CMU_XTHFCR_CFG_Msk (0x1fU << CMU_XTHFCR_CFG_Pos) +#define CMU_XTHFCR_CFG CMU_XTHFCR_CFG_Msk + +#define CMU_XTHFCR_EN_Pos (0U) +#define CMU_XTHFCR_EN_Msk (0x1U << CMU_XTHFCR_EN_Pos) +#define CMU_XTHFCR_EN CMU_XTHFCR_EN_Msk + +#define CMU_RCLFCR_PSC_Pos (16U) +#define CMU_RCLFCR_PSC_Msk (0x3U << CMU_RCLFCR_PSC_Pos) +#define CMU_RCLFCR_PSC CMU_RCLFCR_PSC_Msk + +#define CMU_RCLFCR_EN_Pos (0U) +#define CMU_RCLFCR_EN_Msk (0x1U << CMU_RCLFCR_EN_Pos) +#define CMU_RCLFCR_EN CMU_RCLFCR_EN_Msk + +#define CMU_RCLFTR_TRIM_Pos (0U) +#define CMU_RCLFTR_TRIM_Msk (0xffU << CMU_RCLFTR_TRIM_Pos) +#define CMU_RCLFTR_TRIM CMU_RCLFTR_TRIM_Msk + +#define CMU_OPCCR1_EXTICKS_Pos (30U) +#define CMU_OPCCR1_EXTICKS_Msk (0x1U << CMU_OPCCR1_EXTICKS_Pos) +#define CMU_OPCCR1_EXTICKS CMU_OPCCR1_EXTICKS_Msk + +#define CMU_OPCCR1_LPUART1CKS_Pos (26U) +#define CMU_OPCCR1_LPUART1CKS_Msk (0x3U << CMU_OPCCR1_LPUART1CKS_Pos) +#define CMU_OPCCR1_LPUART1CKS CMU_OPCCR1_LPUART1CKS_Msk + +#define CMU_OPCCR1_LPUART0CKS_Pos (24U) +#define CMU_OPCCR1_LPUART0CKS_Msk (0x3U << CMU_OPCCR1_LPUART0CKS_Pos) +#define CMU_OPCCR1_LPUART0CKS CMU_OPCCR1_LPUART0CKS_Msk + +#define CMU_OPCCR1_LPUART2CKS_Pos (22U) +#define CMU_OPCCR1_LPUART2CKS_Msk (0x3U << CMU_OPCCR1_LPUART2CKS_Pos) +#define CMU_OPCCR1_LPUART2CKS CMU_OPCCR1_LPUART2CKS_Msk + +#define CMU_OPCCR1_I2CCKS_Pos (16U) +#define CMU_OPCCR1_I2CCKS_Msk (0x3U << CMU_OPCCR1_I2CCKS_Pos) +#define CMU_OPCCR1_I2CCKS CMU_OPCCR1_I2CCKS_Msk + +#define CMU_OPCCR1_BT16CKS_Pos (14U) +#define CMU_OPCCR1_BT16CKS_Msk (0x3U << CMU_OPCCR1_BT16CKS_Pos) +#define CMU_OPCCR1_BT16CKS CMU_OPCCR1_BT16CKS_Msk + +#define CMU_OPCCR1_BT32CKS_Pos (12U) +#define CMU_OPCCR1_BT32CKS_Msk (0x3U << CMU_OPCCR1_BT32CKS_Pos) +#define CMU_OPCCR1_BT32CKS CMU_OPCCR1_BT32CKS_Msk + +#define CMU_OPCCR1_LPT16CKS_Pos (10U) +#define CMU_OPCCR1_LPT16CKS_Msk (0x3U << CMU_OPCCR1_LPT16CKS_Pos) +#define CMU_OPCCR1_LPT16CKS CMU_OPCCR1_LPT16CKS_Msk + +#define CMU_OPCCR1_LPT32CKS_Pos (8U) +#define CMU_OPCCR1_LPT32CKS_Msk (0x3U << CMU_OPCCR1_LPT32CKS_Pos) +#define CMU_OPCCR1_LPT32CKS CMU_OPCCR1_LPT32CKS_Msk + +#define CMU_OPCCR1_ATCKS_Pos (7U) +#define CMU_OPCCR1_ATCKS_Msk (0x1U << CMU_OPCCR1_ATCKS_Pos) +#define CMU_OPCCR1_ATCKS CMU_OPCCR1_ATCKS_Msk + +#define CMU_OPCCR1_CANCKS_Pos (4U) +#define CMU_OPCCR1_CANCKS_Msk (0x3U << CMU_OPCCR1_CANCKS_Pos) +#define CMU_OPCCR1_CANCKS CMU_OPCCR1_CANCKS_Msk + +#define CMU_OPCCR1_UART1CKS_Pos (2U) +#define CMU_OPCCR1_UART1CKS_Msk (0x3U << CMU_OPCCR1_UART1CKS_Pos) +#define CMU_OPCCR1_UART1CKS CMU_OPCCR1_UART1CKS_Msk + +#define CMU_OPCCR1_UART0CKS_Pos (0U) +#define CMU_OPCCR1_UART0CKS_Msk (0x3U << CMU_OPCCR1_UART0CKS_Pos) +#define CMU_OPCCR1_UART0CKS CMU_OPCCR1_UART0CKS_Msk + +#define CMU_OPCCR2_RNGPRSC_Pos (10U) +#define CMU_OPCCR2_RNGPRSC_Msk (0x7U << CMU_OPCCR2_RNGPRSC_Pos) +#define CMU_OPCCR2_RNGPRSC CMU_OPCCR2_RNGPRSC_Msk + +#define CMU_OPCCR2_ADCPRSC_Pos (2U) +#define CMU_OPCCR2_ADCPRSC_Msk (0x7U << CMU_OPCCR2_ADCPRSC_Pos) +#define CMU_OPCCR2_ADCPRSC CMU_OPCCR2_ADCPRSC_Msk + +#define CMU_OPCCR2_ADCCKS_Pos (0U) +#define CMU_OPCCR2_ADCCKS_Msk (0x3U << CMU_OPCCR2_ADCCKS_Pos) +#define CMU_OPCCR2_ADCCKS CMU_OPCCR2_ADCCKS_Msk + +#define CMU_CCCR_CCLIE_Pos (1U) +#define CMU_CCCR_CCLIE_Msk (0x1U << CMU_CCCR_CCLIE_Pos) +#define CMU_CCCR_CCLIE CMU_CCCR_CCLIE_Msk + +#define CMU_CCCR_EN_Pos (0U) +#define CMU_CCCR_EN_Msk (0x1U << CMU_CCCR_EN_Pos) +#define CMU_CCCR_EN CMU_CCCR_EN_Msk + +#define CMU_CCFR_CALPSC_Pos (10U) +#define CMU_CCFR_CALPSC_Msk (0x3U << CMU_CCFR_CALPSC_Pos) +#define CMU_CCFR_CALPSC CMU_CCFR_CALPSC_Msk + +#define CMU_CCFR_REFPSC_Pos (8U) +#define CMU_CCFR_REFPSC_Msk (0x3U << CMU_CCFR_REFPSC_Pos) +#define CMU_CCFR_REFPSC CMU_CCFR_REFPSC_Msk + +#define CMU_CCFR_CALSEL_Pos (1U) +#define CMU_CCFR_CALSEL_Msk (0x3U << CMU_CCFR_CALSEL_Pos) +#define CMU_CCFR_CALSEL CMU_CCFR_CALSEL_Msk + +#define CMU_CCFR_REFSEL_Pos (0U) +#define CMU_CCFR_REFSEL_Msk (0x1U << CMU_CCFR_REFSEL_Pos) +#define CMU_CCFR_REFSEL CMU_CCFR_REFSEL_Msk + +#define CMU_CCNR_CCNT_Pos (0U) +#define CMU_CCNR_CCNT_Msk (0xffffU << CMU_CCNR_CCNT_Pos) +#define CMU_CCNR_CCNT CMU_CCNR_CCNT_Msk + +#define CMU_CCISR_CCLIF_Pos (0U) +#define CMU_CCISR_CCLIF_Msk (0x1U << CMU_CCISR_CCLIF_Pos) +#define CMU_CCISR_CCLIF CMU_CCISR_CCLIF_Msk + + + +#define FL_CMU_GROUP1_BUSCLK_LPTIM32 (0x1U << 0U) +#define FL_CMU_GROUP1_BUSCLK_LPTIM16 (0x1U << 1U) +#define FL_CMU_GROUP1_BUSCLK_RTCA (0x1U << 2U) +#define FL_CMU_GROUP1_BUSCLK_PMU (0x1U << 3U) +#define FL_CMU_GROUP1_BUSCLK_SCU (0x1U << 4U) +#define FL_CMU_GROUP1_BUSCLK_IWDT (0x1U << 5U) +#define FL_CMU_GROUP1_BUSCLK_ANAC (0x1U << 6U) +#define FL_CMU_GROUP1_BUSCLK_PAD (0x1U << 7U) +#define FL_CMU_GROUP1_BUSCLK_SVD (0x1U << 8U) +#define FL_CMU_GROUP1_BUSCLK_COMP (0x1U << 9U) +#define FL_CMU_GROUP1_BUSCLK_ATT (0x1U << 10U) +#define FL_CMU_GROUP1_BUSCLK_VREF1P2 (0x1U << 12U) +#define FL_CMU_GROUP2_BUSCLK_CRC (0x1U << 0U) +#define FL_CMU_GROUP2_BUSCLK_RNG (0x1U << 1U) +#define FL_CMU_GROUP2_BUSCLK_AES (0x1U << 2U) +#define FL_CMU_GROUP2_BUSCLK_LCD (0x1U << 3U) +#define FL_CMU_GROUP2_BUSCLK_DMA (0x1U << 4U) +#define FL_CMU_GROUP2_BUSCLK_FLASH (0x1U << 5U) +#define FL_CMU_GROUP2_BUSCLK_RAMBIST (0x1U << 6U) +#define FL_CMU_GROUP2_BUSCLK_WWDT (0x1U << 7U) +#define FL_CMU_GROUP2_BUSCLK_ADC (0x1U << 8U) +#define FL_CMU_GROUP2_BUSCLK_DIVAS (0x1U << 9U) +#define FL_CMU_GROUP2_BUSCLK_DAC (0x1U << 10U) +#define FL_CMU_GROUP3_BUSCLK_SPI0 (0x1U << 0U) +#define FL_CMU_GROUP3_BUSCLK_SPI1 (0x1U << 1U) +#define FL_CMU_GROUP3_BUSCLK_SPI2 (0x1U << 2U) +#define FL_CMU_GROUP3_BUSCLK_UART0 (0x1U << 8U) +#define FL_CMU_GROUP3_BUSCLK_UART1 (0x1U << 9U) +#define FL_CMU_GROUP3_BUSCLK_UART3 (0x1U << 11U) +#define FL_CMU_GROUP3_BUSCLK_UART4 (0x1U << 12U) +#define FL_CMU_GROUP3_BUSCLK_UART5 (0x1U << 13U) +#define FL_CMU_GROUP3_BUSCLK_UARTIR (0x1U << 14U) +#define FL_CMU_GROUP3_BUSCLK_LPUART0 (0x1U << 16U) +#define FL_CMU_GROUP3_BUSCLK_LPUART1 (0x1U << 17U) +#define FL_CMU_GROUP3_BUSCLK_LPUART2 (0x1U << 18U) +#define FL_CMU_GROUP3_BUSCLK_CAN (0x1U << 19U) +#define FL_CMU_GROUP3_BUSCLK_I2C (0x1U << 24U) +#define FL_CMU_GROUP4_BUSCLK_BSTIM32 (0x1U << 0U) +#define FL_CMU_GROUP4_BUSCLK_GPTIM0 (0x1U << 1U) +#define FL_CMU_GROUP4_BUSCLK_GPTIM1 (0x1U << 2U) +#define FL_CMU_GROUP4_BUSCLK_GPTIM2 (0x1U << 3U) +#define FL_CMU_GROUP4_BUSCLK_ATIM (0x1U << 4U) +#define FL_CMU_GROUP4_BUSCLK_BSTIM16 (0x1U << 8U) +#define FL_CMU_GROUP3_OPCLK_EXTI (0x1U << 31U) +#define FL_CMU_GROUP3_OPCLK_FLASH (0x1U << 30U) +#define FL_CMU_GROUP3_OPCLK_LPUART1 (0x1U << 29U) +#define FL_CMU_GROUP3_OPCLK_LPUART0 (0x1U << 28U) +#define FL_CMU_GROUP3_OPCLK_RNG (0x1U << 24U) +#define FL_CMU_GROUP3_OPCLK_LPUART2 (0x1U << 21U) +#define FL_CMU_GROUP3_OPCLK_I2C (0x1U << 20U) +#define FL_CMU_GROUP3_OPCLK_ADC (0x1U << 16U) +#define FL_CMU_GROUP3_OPCLK_ATIM (0x1U << 15U) +#define FL_CMU_GROUP3_OPCLK_CAN (0x1U << 14U) +#define FL_CMU_GROUP3_OPCLK_UART1 (0x1U << 9U) +#define FL_CMU_GROUP3_OPCLK_UART0 (0x1U << 8U) +#define FL_CMU_GROUP3_OPCLK_BSTIM16 (0x1U << 3U) +#define FL_CMU_GROUP3_OPCLK_BSTIM32 (0x1U << 2U) +#define FL_CMU_GROUP3_OPCLK_LPTIM16 (0x1U << 1U) +#define FL_CMU_GROUP3_OPCLK_LPTIM32 (0x1U << 0U) + + + +#define FL_CMU_APBCLK_PSC_DIV1 (0x0U << CMU_SYSCLKCR_APBPRES_Pos) +#define FL_CMU_APBCLK_PSC_DIV2 (0x4U << CMU_SYSCLKCR_APBPRES_Pos) +#define FL_CMU_APBCLK_PSC_DIV4 (0x5U << CMU_SYSCLKCR_APBPRES_Pos) +#define FL_CMU_APBCLK_PSC_DIV8 (0x6U << CMU_SYSCLKCR_APBPRES_Pos) +#define FL_CMU_APBCLK_PSC_DIV16 (0x7U << CMU_SYSCLKCR_APBPRES_Pos) + + +#define FL_CMU_AHBCLK_PSC_DIV1 (0x0U << CMU_SYSCLKCR_AHBPRES_Pos) +#define FL_CMU_AHBCLK_PSC_DIV2 (0x4U << CMU_SYSCLKCR_AHBPRES_Pos) +#define FL_CMU_AHBCLK_PSC_DIV4 (0x5U << CMU_SYSCLKCR_AHBPRES_Pos) +#define FL_CMU_AHBCLK_PSC_DIV8 (0x6U << CMU_SYSCLKCR_AHBPRES_Pos) +#define FL_CMU_AHBCLK_PSC_DIV16 (0x7U << CMU_SYSCLKCR_AHBPRES_Pos) + + +#define FL_CMU_SYSTICK_CLK_SOURCE_SCLK (0x0U << CMU_SYSCLKCR_STCLKSEL_Pos) +#define FL_CMU_SYSTICK_CLK_SOURCE_LSCLK (0x1U << CMU_SYSCLKCR_STCLKSEL_Pos) +#define FL_CMU_SYSTICK_CLK_SOURCE_RCLF (0x2U << CMU_SYSCLKCR_STCLKSEL_Pos) +#define FL_CMU_SYSTICK_CLK_SOURCE_SYSCLK (0x3U << CMU_SYSCLKCR_STCLKSEL_Pos) + + +#define FL_CMU_SYSTEM_CLK_SOURCE_RCHF (0x0U << CMU_SYSCLKCR_SYSCLKSEL_Pos) +#define FL_CMU_SYSTEM_CLK_SOURCE_XTHF (0x1U << CMU_SYSCLKCR_SYSCLKSEL_Pos) +#define FL_CMU_SYSTEM_CLK_SOURCE_PLL (0x2U << CMU_SYSCLKCR_SYSCLKSEL_Pos) +#define FL_CMU_SYSTEM_CLK_SOURCE_RCLF (0x4U << CMU_SYSCLKCR_SYSCLKSEL_Pos) +#define FL_CMU_SYSTEM_CLK_SOURCE_XTLF (0x5U << CMU_SYSCLKCR_SYSCLKSEL_Pos) +#define FL_CMU_SYSTEM_CLK_SOURCE_RCLP (0x6U << CMU_SYSCLKCR_SYSCLKSEL_Pos) + + +#define FL_CMU_RCHF_FREQUENCY_8MHZ (0x0U << CMU_RCHFCR_FSEL_Pos) +#define FL_CMU_RCHF_FREQUENCY_16MHZ (0x1U << CMU_RCHFCR_FSEL_Pos) +#define FL_CMU_RCHF_FREQUENCY_24MHZ (0x2U << CMU_RCHFCR_FSEL_Pos) +#define FL_CMU_RCHF_FREQUENCY_32MHZ (0x3U << CMU_RCHFCR_FSEL_Pos) + + +#define FL_CMU_PLL_CLK_SOURCE_RCHF (0x0U << CMU_PLLCR_INSEL_Pos) +#define FL_CMU_PLL_CLK_SOURCE_XTHF (0x1U << CMU_PLLCR_INSEL_Pos) + + +#define FL_CMU_PLL_PSC_DIV1 (0x0U << CMU_PLLCR_REFPRSC_Pos) +#define FL_CMU_PLL_PSC_DIV2 (0x1U << CMU_PLLCR_REFPRSC_Pos) +#define FL_CMU_PLL_PSC_DIV4 (0x2U << CMU_PLLCR_REFPRSC_Pos) +#define FL_CMU_PLL_PSC_DIV8 (0x3U << CMU_PLLCR_REFPRSC_Pos) +#define FL_CMU_PLL_PSC_DIV12 (0x4U << CMU_PLLCR_REFPRSC_Pos) +#define FL_CMU_PLL_PSC_DIV16 (0x5U << CMU_PLLCR_REFPRSC_Pos) +#define FL_CMU_PLL_PSC_DIV24 (0x6U << CMU_PLLCR_REFPRSC_Pos) +#define FL_CMU_PLL_PSC_DIV32 (0x7U << CMU_PLLCR_REFPRSC_Pos) + + +#define FL_CMU_PLL_OUTPUT_X1 (0x0U << CMU_PLLCR_OSEL_Pos) +#define FL_CMU_PLL_OUTPUT_X2 (0x1U << CMU_PLLCR_OSEL_Pos) + + +#define FL_CMU_LSCLK_CLK_SOURCE_RCLP (0x55U << CMU_LSCLKSEL_SEL_Pos) +#define FL_CMU_LSCLK_CLK_SOURCE_XTLF (0xAAU << CMU_LSCLKSEL_SEL_Pos) + +#define FL_CMU_RCLF_PSC_DIV1 (0x0U << CMU_RCLFCR_PSC_Pos) +#define FL_CMU_RCLF_PSC_DIV4 (0x1U << CMU_RCLFCR_PSC_Pos) +#define FL_CMU_RCLF_PSC_DIV8 (0x2U << CMU_RCLFCR_PSC_Pos) +#define FL_CMU_RCLF_PSC_DIV16 (0x3U << CMU_RCLFCR_PSC_Pos) + + +#define FL_CMU_EXTI_CLK_SOURCE_LSCLK (0x1U << CMU_OPCCR1_EXTICKS_Pos) +#define FL_CMU_EXTI_CLK_SOURCE_HCLK (0x0U << CMU_OPCCR1_EXTICKS_Pos) + + +#define FL_CMU_LPUART1_CLK_SOURCE_LSCLK (0x0U << CMU_OPCCR1_LPUART1CKS_Pos) +#define FL_CMU_LPUART1_CLK_SOURCE_RCHF (0x1U << CMU_OPCCR1_LPUART1CKS_Pos) +#define FL_CMU_LPUART1_CLK_SOURCE_RCLF (0x2U << CMU_OPCCR1_LPUART1CKS_Pos) + + +#define FL_CMU_LPUART0_CLK_SOURCE_LSCLK (0x0U << CMU_OPCCR1_LPUART0CKS_Pos) +#define FL_CMU_LPUART0_CLK_SOURCE_RCHF (0x1U << CMU_OPCCR1_LPUART0CKS_Pos) +#define FL_CMU_LPUART0_CLK_SOURCE_RCLF (0x2U << CMU_OPCCR1_LPUART0CKS_Pos) + + +#define FL_CMU_LPUART2_CLK_SOURCE_LSCLK (0x0U << CMU_OPCCR1_LPUART2CKS_Pos) +#define FL_CMU_LPUART2_CLK_SOURCE_RCHF (0x1U << CMU_OPCCR1_LPUART2CKS_Pos) +#define FL_CMU_LPUART2_CLK_SOURCE_RCLF (0x2U << CMU_OPCCR1_LPUART2CKS_Pos) + +#define FL_CMU_LPUART_CLK_SOURCE_LSCLK (0x0U) +#define FL_CMU_LPUART_CLK_SOURCE_RCHF (0x1U) +#define FL_CMU_LPUART_CLK_SOURCE_RCLF (0x2U) + + +#define FL_CMU_I2C_CLK_SOURCE_APBCLK (0x0U << CMU_OPCCR1_I2CCKS_Pos) +#define FL_CMU_I2C_CLK_SOURCE_RCHF (0x1U << CMU_OPCCR1_I2CCKS_Pos) +#define FL_CMU_I2C_CLK_SOURCE_SYSCLK (0x2U << CMU_OPCCR1_I2CCKS_Pos) +#define FL_CMU_I2C_CLK_SOURCE_RCLF (0x3U << CMU_OPCCR1_I2CCKS_Pos) + + +#define FL_CMU_BSTIM16_CLK_SOURCE_APBCLK (0x0U << CMU_OPCCR1_BT16CKS_Pos) +#define FL_CMU_BSTIM16_CLK_SOURCE_LSCLK (0x1U << CMU_OPCCR1_BT16CKS_Pos) +#define FL_CMU_BSTIM16_CLK_SOURCE_RCLP (0x2U << CMU_OPCCR1_BT16CKS_Pos) +#define FL_CMU_BSTIM16_CLK_SOURCE_RCLF (0x3U << CMU_OPCCR1_BT16CKS_Pos) + + +#define FL_CMU_BSTIM32_CLK_SOURCE_APBCLK (0x0U << CMU_OPCCR1_BT32CKS_Pos) +#define FL_CMU_BSTIM32_CLK_SOURCE_LSCLK (0x1U << CMU_OPCCR1_BT32CKS_Pos) +#define FL_CMU_BSTIM32_CLK_SOURCE_RCLP (0x2U << CMU_OPCCR1_BT32CKS_Pos) +#define FL_CMU_BSTIM32_CLK_SOURCE_RCLF (0x3U << CMU_OPCCR1_BT32CKS_Pos) + + +#define FL_CMU_LPTIM16_CLK_SOURCE_APBCLK (0x0U << CMU_OPCCR1_LPT16CKS_Pos) +#define FL_CMU_LPTIM16_CLK_SOURCE_LSCLK (0x1U << CMU_OPCCR1_LPT16CKS_Pos) +#define FL_CMU_LPTIM16_CLK_SOURCE_RCLP (0x2U << CMU_OPCCR1_LPT16CKS_Pos) +#define FL_CMU_LPTIM16_CLK_SOURCE_RCLF (0x3U << CMU_OPCCR1_LPT16CKS_Pos) + + +#define FL_CMU_LPTIM32_CLK_SOURCE_APBCLK (0x0U << CMU_OPCCR1_LPT32CKS_Pos) +#define FL_CMU_LPTIM32_CLK_SOURCE_LSCLK (0x1U << CMU_OPCCR1_LPT32CKS_Pos) +#define FL_CMU_LPTIM32_CLK_SOURCE_RCLP (0x2U << CMU_OPCCR1_LPT32CKS_Pos) +#define FL_CMU_LPTIM32_CLK_SOURCE_RCLF (0x3U << CMU_OPCCR1_LPT32CKS_Pos) + + +#define FL_CMU_ATIM_CLK_SOURCE_APBCLK (0x0U << CMU_OPCCR1_ATCKS_Pos) +#define FL_CMU_ATIM_CLK_SOURCE_PLL_X2 (0x1U << CMU_OPCCR1_ATCKS_Pos) + + +#define FL_CMU_CAN_CLK_SOURCE_RCHF (0x0U << CMU_OPCCR1_CANCKS_Pos) +#define FL_CMU_CAN_CLK_SOURCE_XTHF (0x1U << CMU_OPCCR1_CANCKS_Pos) +#define FL_CMU_CAN_CLK_SOURCE_PLL (0x2U << CMU_OPCCR1_CANCKS_Pos) +#define FL_CMU_CAN_CLK_SOURCE_APBCLK (0x3U << CMU_OPCCR1_CANCKS_Pos) + + +#define FL_CMU_UART1_CLK_SOURCE_APBCLK (0x0U << CMU_OPCCR1_UART1CKS_Pos) +#define FL_CMU_UART1_CLK_SOURCE_RCHF (0x1U << CMU_OPCCR1_UART1CKS_Pos) +#define FL_CMU_UART1_CLK_SOURCE_SYSCLK (0x2U << CMU_OPCCR1_UART1CKS_Pos) +#define FL_CMU_UART1_CLK_SOURCE_XTHF (0x3U << CMU_OPCCR1_UART1CKS_Pos) + + +#define FL_CMU_UART0_CLK_SOURCE_APBCLK (0x0U << CMU_OPCCR1_UART0CKS_Pos) +#define FL_CMU_UART0_CLK_SOURCE_RCHF (0x1U << CMU_OPCCR1_UART0CKS_Pos) +#define FL_CMU_UART0_CLK_SOURCE_SYSCLK (0x2U << CMU_OPCCR1_UART0CKS_Pos) +#define FL_CMU_UART0_CLK_SOURCE_XTHF (0x3U << CMU_OPCCR1_UART0CKS_Pos) + + +#define FL_CMU_RNG_PSC_DIV1 (0x0U << CMU_OPCCR2_RNGPRSC_Pos) +#define FL_CMU_RNG_PSC_DIV2 (0x1U << CMU_OPCCR2_RNGPRSC_Pos) +#define FL_CMU_RNG_PSC_DIV4 (0x2U << CMU_OPCCR2_RNGPRSC_Pos) +#define FL_CMU_RNG_PSC_DIV8 (0x3U << CMU_OPCCR2_RNGPRSC_Pos) +#define FL_CMU_RNG_PSC_DIV16 (0x4U << CMU_OPCCR2_RNGPRSC_Pos) +#define FL_CMU_RNG_PSC_DIV32 (0x5U << CMU_OPCCR2_RNGPRSC_Pos) + + +#define FL_CMU_ADC_PSC_DIV1 (0x0U << CMU_OPCCR2_ADCPRSC_Pos) +#define FL_CMU_ADC_PSC_DIV2 (0x1U << CMU_OPCCR2_ADCPRSC_Pos) +#define FL_CMU_ADC_PSC_DIV4 (0x2U << CMU_OPCCR2_ADCPRSC_Pos) +#define FL_CMU_ADC_PSC_DIV8 (0x3U << CMU_OPCCR2_ADCPRSC_Pos) +#define FL_CMU_ADC_PSC_DIV16 (0x4U << CMU_OPCCR2_ADCPRSC_Pos) +#define FL_CMU_ADC_PSC_DIV32 (0x5U << CMU_OPCCR2_ADCPRSC_Pos) + + +#define FL_CMU_ADC_CLK_SOURCE_RCLF (0x0U << CMU_OPCCR2_ADCCKS_Pos) +#define FL_CMU_ADC_CLK_SOURCE_RCHF (0x1U << CMU_OPCCR2_ADCCKS_Pos) +#define FL_CMU_ADC_CLK_SOURCE_XTHF (0x2U << CMU_OPCCR2_ADCCKS_Pos) +#define FL_CMU_ADC_CLK_SOURCE_PLL (0x3U << CMU_OPCCR2_ADCCKS_Pos) + + +#define FL_CMU_CCL_CALCLK_PSC_DIV1 (0x0U << CMU_CCFR_CALPSC_Pos) +#define FL_CMU_CCL_CALCLK_PSC_DIV2 (0x1U << CMU_CCFR_CALPSC_Pos) +#define FL_CMU_CCL_CALCLK_PSC_DIV4 (0x2U << CMU_CCFR_CALPSC_Pos) +#define FL_CMU_CCL_CALCLK_PSC_DIV8 (0x3U << CMU_CCFR_CALPSC_Pos) + + +#define FL_CMU_CCL_REFCLK_PSC_DIV8 (0x0U << CMU_CCFR_REFPSC_Pos) +#define FL_CMU_CCL_REFCLK_PSC_DIV16 (0x1U << CMU_CCFR_REFPSC_Pos) +#define FL_CMU_CCL_REFCLK_PSC_DIV32 (0x2U << CMU_CCFR_REFPSC_Pos) +#define FL_CMU_CCL_REFCLK_PSC_DIV64 (0x3U << CMU_CCFR_REFPSC_Pos) + + +#define FL_CMU_CCL_CALCLK_SOURCE_RCHF (0x1U << CMU_CCFR_CALSEL_Pos) +#define FL_CMU_CCL_CALCLK_SOURCE_RCLF (0x2U << CMU_CCFR_CALSEL_Pos) +#define FL_CMU_CCL_CALCLK_SOURCE_XTHF (0x3U << CMU_CCFR_CALSEL_Pos) + + +#define FL_CMU_CCL_REFCLK_SOURCE_XTLF (0x0U << CMU_CCFR_REFSEL_Pos) +#define FL_CMU_CCL_REFCLK_SOURCE_RCLP (0x1U << CMU_CCFR_REFSEL_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup CMU_FL_Exported_Functions CMU Exported Functions + * @{ + */ + +/** + * @brief Enable XTHF Fail Interrupt + * @rmtoll IER HFDET_IE FL_CMU_EnableIT_XTHFFail + * @retval None + */ +__STATIC_INLINE void FL_CMU_EnableIT_XTHFFail(void) +{ + SET_BIT(CMU->IER, CMU_IER_HFDET_IE_Msk); +} + +/** + * @brief Get XTHF Fail Interrupt Enable Status + * @rmtoll IER HFDET_IE FL_CMU_IsEnabledIT_XTHFFail + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsEnabledIT_XTHFFail(void) +{ + return (uint32_t)(READ_BIT(CMU->IER, CMU_IER_HFDET_IE_Msk) == CMU_IER_HFDET_IE_Msk); +} + +/** + * @brief Disable XTHF Fail Interrupt + * @rmtoll IER HFDET_IE FL_CMU_DisableIT_XTHFFail + * @retval None + */ +__STATIC_INLINE void FL_CMU_DisableIT_XTHFFail(void) +{ + CLEAR_BIT(CMU->IER, CMU_IER_HFDET_IE_Msk); +} + +/** + * @brief Get XTHF Vibrating Output + * @rmtoll ISR HFDETO FL_CMU_IsActiveFlag_XTHFFailOutput + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsActiveFlag_XTHFFailOutput(void) +{ + return (uint32_t)(READ_BIT(CMU->ISR, CMU_ISR_HFDETO_Msk) == (CMU_ISR_HFDETO_Msk)); +} + +/** + * @brief Get XTHF Vibrating Flag + * @rmtoll ISR HFDET_IF FL_CMU_IsActiveFlag_XTHFFail + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsActiveFlag_XTHFFail(void) +{ + return (uint32_t)(READ_BIT(CMU->ISR, CMU_ISR_HFDET_IF_Msk) == (CMU_ISR_HFDET_IF_Msk)); +} + +/** + * @brief Clear XTHF Vibrating Flag + * @rmtoll ISR HFDET_IF FL_CMU_ClearFlag_XTHFFail + * @retval None + */ +__STATIC_INLINE void FL_CMU_ClearFlag_XTHFFail(void) +{ + WRITE_REG(CMU->ISR, CMU_ISR_HFDET_IF_Msk); +} + +/** + * @brief Enable SYSCLK select Fail Interrupt + * @rmtoll IER SYSCES_IE FL_CMU_EnableIT_SYSCLKSELError + * @retval None + */ +__STATIC_INLINE void FL_CMU_EnableIT_SYSCLKSELError(void) +{ + SET_BIT(CMU->IER, CMU_IER_SYSCES_IE_Msk); +} + +/** + * @brief Get SYSCLK select Fail Interrupt Enable Status + * @rmtoll IER SYSCES_IE FL_CMU_IsEnabledIT_SYSCLKSELError + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsEnabledIT_SYSCLKSELError(void) +{ + return (uint32_t)(READ_BIT(CMU->IER, CMU_IER_SYSCES_IE_Msk) == CMU_IER_SYSCES_IE_Msk); +} + +/** + * @brief Disable SYSCLK select Fail Interrupt + * @rmtoll IER SYSCES_IE FL_CMU_DisableIT_SYSCLKSELError + * @retval None + */ +__STATIC_INLINE void FL_CMU_DisableIT_SYSCLKSELError(void) +{ + CLEAR_BIT(CMU->IER, CMU_IER_SYSCES_IE_Msk); +} + +/** + * @brief Get SYSCLK select Vibrating Flag + * @rmtoll ISR SYSCES_IF FL_CMU_IsActiveFlag_SYSCLKSELError + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsActiveFlag_SYSCLKSELError(void) +{ + return (uint32_t)(READ_BIT(CMU->ISR, CMU_ISR_SYSCES_IF_Msk) == (CMU_ISR_SYSCES_IF_Msk)); +} + +/** + * @brief Clear SYSCLK select Vibrating Flag + * @rmtoll ISR SYSCES_IF FL_CMU_ClearFlag_SYSCLKSELError + * @retval None + */ +__STATIC_INLINE void FL_CMU_ClearFlag_SYSCLKSELError(void) +{ + WRITE_REG(CMU->ISR, CMU_ISR_SYSCES_IF_Msk); +} + +/** + * @brief Enable LSCLK Auto Switch + * @rmtoll SYSCLKCR LSCATS FL_CMU_EnableLSCLKAutoSwitch + * @retval None + */ +__STATIC_INLINE void FL_CMU_EnableLSCLKAutoSwitch(void) +{ + SET_BIT(CMU->SYSCLKCR, CMU_SYSCLKCR_LSCATS_Msk); +} + +/** + * @brief Get LSCLK Auto Switch Enable Status + * @rmtoll SYSCLKCR LSCATS FL_CMU_IsEnabledLSCLKAutoSwitch + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsEnabledLSCLKAutoSwitch(void) +{ + return (uint32_t)(READ_BIT(CMU->SYSCLKCR, CMU_SYSCLKCR_LSCATS_Msk) == CMU_SYSCLKCR_LSCATS_Msk); +} + +/** + * @brief Disable LSCLK Auto Switch + * @rmtoll SYSCLKCR LSCATS FL_CMU_DisableLSCLKAutoSwitch + * @retval None + */ +__STATIC_INLINE void FL_CMU_DisableLSCLKAutoSwitch(void) +{ + CLEAR_BIT(CMU->SYSCLKCR, CMU_SYSCLKCR_LSCATS_Msk); +} + +/** + * @brief Enable Sleep/DeepSleep Mode External Interrupt + * @rmtoll SYSCLKCR SLP_ENEXTI FL_CMU_EnableEXTIOnSleep + * @retval None + */ +__STATIC_INLINE void FL_CMU_EnableEXTIOnSleep(void) +{ + SET_BIT(CMU->SYSCLKCR, CMU_SYSCLKCR_SLP_ENEXTI_Msk); +} + +/** + * @brief Get Sleep/DeepSleep Mode External Interrupt Enable Status + * @rmtoll SYSCLKCR SLP_ENEXTI FL_CMU_IsEnabledEXTIOnSleep + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsEnabledEXTIOnSleep(void) +{ + return (uint32_t)(READ_BIT(CMU->SYSCLKCR, CMU_SYSCLKCR_SLP_ENEXTI_Msk) == CMU_SYSCLKCR_SLP_ENEXTI_Msk); +} + +/** + * @brief Disable Sleep/DeepSleep Mode External Interrupt + * @rmtoll SYSCLKCR SLP_ENEXTI FL_CMU_DisableEXTIOnSleep + * @retval None + */ +__STATIC_INLINE void FL_CMU_DisableEXTIOnSleep(void) +{ + CLEAR_BIT(CMU->SYSCLKCR, CMU_SYSCLKCR_SLP_ENEXTI_Msk); +} + +/** + * @brief Set APB Prescaler + * @rmtoll SYSCLKCR APBPRES FL_CMU_SetAPBPrescaler + * @param prescaler This parameter can be one of the following values: + * @arg @ref FL_CMU_APBCLK_PSC_DIV1 + * @arg @ref FL_CMU_APBCLK_PSC_DIV2 + * @arg @ref FL_CMU_APBCLK_PSC_DIV4 + * @arg @ref FL_CMU_APBCLK_PSC_DIV8 + * @arg @ref FL_CMU_APBCLK_PSC_DIV16 + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetAPBPrescaler(uint32_t prescaler) +{ + MODIFY_REG(CMU->SYSCLKCR, CMU_SYSCLKCR_APBPRES_Msk, prescaler); +} + +/** + * @brief Get APB Prescaler + * @rmtoll SYSCLKCR APBPRES FL_CMU_GetAPBPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_APBCLK_PSC_DIV1 + * @arg @ref FL_CMU_APBCLK_PSC_DIV2 + * @arg @ref FL_CMU_APBCLK_PSC_DIV4 + * @arg @ref FL_CMU_APBCLK_PSC_DIV8 + * @arg @ref FL_CMU_APBCLK_PSC_DIV16 + */ +__STATIC_INLINE uint32_t FL_CMU_GetAPBPrescaler(void) +{ + return (uint32_t)(READ_BIT(CMU->SYSCLKCR, CMU_SYSCLKCR_APBPRES_Msk)); +} + +/** + * @brief Set AHB Prescaler + * @rmtoll SYSCLKCR AHBPRES FL_CMU_SetAHBPrescaler + * @param prescaler This parameter can be one of the following values: + * @arg @ref FL_CMU_AHBCLK_PSC_DIV1 + * @arg @ref FL_CMU_AHBCLK_PSC_DIV2 + * @arg @ref FL_CMU_AHBCLK_PSC_DIV4 + * @arg @ref FL_CMU_AHBCLK_PSC_DIV8 + * @arg @ref FL_CMU_AHBCLK_PSC_DIV16 + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetAHBPrescaler(uint32_t prescaler) +{ + MODIFY_REG(CMU->SYSCLKCR, CMU_SYSCLKCR_AHBPRES_Msk, prescaler); +} + +/** + * @brief Get AHB Prescaler + * @rmtoll SYSCLKCR AHBPRES FL_CMU_GetAHBPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_AHBCLK_PSC_DIV1 + * @arg @ref FL_CMU_AHBCLK_PSC_DIV2 + * @arg @ref FL_CMU_AHBCLK_PSC_DIV4 + * @arg @ref FL_CMU_AHBCLK_PSC_DIV8 + * @arg @ref FL_CMU_AHBCLK_PSC_DIV16 + */ +__STATIC_INLINE uint32_t FL_CMU_GetAHBPrescaler(void) +{ + return (uint32_t)(READ_BIT(CMU->SYSCLKCR, CMU_SYSCLKCR_AHBPRES_Msk)); +} + +/** + * @brief Set SysTick Clock Source + * @rmtoll SYSCLKCR STCLKSEL FL_CMU_SetSysTickClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_SYSTICK_CLK_SOURCE_SCLK + * @arg @ref FL_CMU_SYSTICK_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_SYSTICK_CLK_SOURCE_RCLF + * @arg @ref FL_CMU_SYSTICK_CLK_SOURCE_SYSCLK + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetSysTickClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->SYSCLKCR, CMU_SYSCLKCR_STCLKSEL_Msk, clock); +} + +/** + * @brief Get SysTick Clock Source + * @rmtoll SYSCLKCR STCLKSEL FL_CMU_GetSysTickClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_SYSTICK_CLK_SOURCE_SCLK + * @arg @ref FL_CMU_SYSTICK_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_SYSTICK_CLK_SOURCE_RCLF + * @arg @ref FL_CMU_SYSTICK_CLK_SOURCE_SYSCLK + */ +__STATIC_INLINE uint32_t FL_CMU_GetSysTickClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->SYSCLKCR, CMU_SYSCLKCR_STCLKSEL_Msk)); +} + +/** + * @brief Set System Clock Source + * @rmtoll SYSCLKCR SYSCLKSEL FL_CMU_SetSystemClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_SYSTEM_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_SYSTEM_CLK_SOURCE_XTHF + * @arg @ref FL_CMU_SYSTEM_CLK_SOURCE_PLL + * @arg @ref FL_CMU_SYSTEM_CLK_SOURCE_RCLF + * @arg @ref FL_CMU_SYSTEM_CLK_SOURCE_XTLF + * @arg @ref FL_CMU_SYSTEM_CLK_SOURCE_RCLP + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetSystemClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->SYSCLKCR, CMU_SYSCLKCR_SYSCLKSEL_Msk, clock); +} + +/** + * @brief Set System Clock Source Setting + * @rmtoll SYSCLKCR SYSCLKSEL FL_CMU_GetSystemClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_SYSTEM_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_SYSTEM_CLK_SOURCE_XTHF + * @arg @ref FL_CMU_SYSTEM_CLK_SOURCE_PLL + * @arg @ref FL_CMU_SYSTEM_CLK_SOURCE_RCLF + * @arg @ref FL_CMU_SYSTEM_CLK_SOURCE_XTLF + * @arg @ref FL_CMU_SYSTEM_CLK_SOURCE_RCLP + */ +__STATIC_INLINE uint32_t FL_CMU_GetSystemClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->SYSCLKCR, CMU_SYSCLKCR_SYSCLKSEL_Msk)); +} + +/** + * @brief Set RCHF Frequency + * @rmtoll RCHFCR FSEL FL_CMU_RCHF_SetFrequency + * @param frequency This parameter can be one of the following values: + * @arg @ref FL_CMU_RCHF_FREQUENCY_8MHZ + * @arg @ref FL_CMU_RCHF_FREQUENCY_16MHZ + * @arg @ref FL_CMU_RCHF_FREQUENCY_24MHZ + * @arg @ref FL_CMU_RCHF_FREQUENCY_32MHZ + * @retval None + */ +__STATIC_INLINE void FL_CMU_RCHF_SetFrequency(uint32_t frequency) +{ + MODIFY_REG(CMU->RCHFCR, CMU_RCHFCR_FSEL_Msk, frequency); +} + +/** + * @brief Get RCHF Frequency Setting + * @rmtoll RCHFCR FSEL FL_CMU_RCHF_GetFrequency + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_RCHF_FREQUENCY_8MHZ + * @arg @ref FL_CMU_RCHF_FREQUENCY_16MHZ + * @arg @ref FL_CMU_RCHF_FREQUENCY_24MHZ + * @arg @ref FL_CMU_RCHF_FREQUENCY_32MHZ + */ +__STATIC_INLINE uint32_t FL_CMU_RCHF_GetFrequency(void) +{ + return (uint32_t)(READ_BIT(CMU->RCHFCR, CMU_RCHFCR_FSEL_Msk)); +} + +/** + * @brief Enable RCHF + * @rmtoll RCHFCR EN FL_CMU_RCHF_Enable + * @retval None + */ +__STATIC_INLINE void FL_CMU_RCHF_Enable(void) +{ + SET_BIT(CMU->RCHFCR, CMU_RCHFCR_EN_Msk); +} + +/** + * @brief Get RCHF Enable Status + * @rmtoll RCHFCR EN FL_CMU_RCHF_IsEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_RCHF_IsEnabled(void) +{ + return (uint32_t)(READ_BIT(CMU->RCHFCR, CMU_RCHFCR_EN_Msk) == CMU_RCHFCR_EN_Msk); +} + +/** + * @brief Disable RCHF + * @rmtoll RCHFCR EN FL_CMU_RCHF_Disable + * @retval None + */ +__STATIC_INLINE void FL_CMU_RCHF_Disable(void) +{ + CLEAR_BIT(CMU->RCHFCR, CMU_RCHFCR_EN_Msk); +} + +/** + * @brief Set RCHF Freqency Trim Value + * @rmtoll RCHFTR TRIM FL_CMU_RCHF_WriteTrimValue + * @param value TrimValue The value of RCHF trim + * @retval None + */ +__STATIC_INLINE void FL_CMU_RCHF_WriteTrimValue(uint32_t value) +{ + MODIFY_REG(CMU->RCHFTR, (0xffU << 0U), (value << 0U)); +} + +/** + * @brief Get RCHF Freqency Trim Value + * @rmtoll RCHFTR TRIM FL_CMU_RCHF_ReadTrimValue + * @retval The value of RCHF trim + */ +__STATIC_INLINE uint32_t FL_CMU_RCHF_ReadTrimValue(void) +{ + return (uint32_t)(READ_BIT(CMU->RCHFTR, (0xffU << 0U)) >> 0U); +} + +/** + * @brief Enable PLL + * @rmtoll PLLCR EN FL_CMU_PLL_Enable + * @retval None + */ +__STATIC_INLINE void FL_CMU_PLL_Enable(void) +{ + SET_BIT(CMU->PLLCR, CMU_PLLCR_EN_Msk); +} + +/** + * @brief Get PLL Enable Status + * @rmtoll PLLCR EN FL_CMU_PLL_Disable + * @retval None + */ +__STATIC_INLINE void FL_CMU_PLL_Disable(void) +{ + CLEAR_BIT(CMU->PLLCR, CMU_PLLCR_EN_Msk); +} + +/** + * @brief Disable PLL + * @rmtoll PLLCR EN FL_CMU_PLL_IsEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_PLL_IsEnabled(void) +{ + return (uint32_t)(READ_BIT(CMU->PLLCR, CMU_PLLCR_EN_Msk) == CMU_PLLCR_EN_Msk); +} + +/** + * @brief Get PLL Ready Status + * @rmtoll PLLCR LOCKED FL_CMU_IsActiveFlag_PLLReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsActiveFlag_PLLReady(void) +{ + return (uint32_t)(READ_BIT(CMU->PLLCR, CMU_PLLCR_LOCKED_Msk) == (CMU_PLLCR_LOCKED_Msk)); +} + +/** + * @brief Set PLL Input Source + * @rmtoll PLLCR INSEL FL_CMU_PLL_SetClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_PLL_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_PLL_CLK_SOURCE_XTHF + * @retval None + */ +__STATIC_INLINE void FL_CMU_PLL_SetClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->PLLCR, CMU_PLLCR_INSEL_Msk, clock); +} + +/** + * @brief Get PLL Input Source Setting + * @rmtoll PLLCR INSEL FL_CMU_PLL_GetClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_PLL_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_PLL_CLK_SOURCE_XTHF + */ +__STATIC_INLINE uint32_t FL_CMU_PLL_GetClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->PLLCR, CMU_PLLCR_INSEL_Msk)); +} + +/** + * @brief Set PLL Multiplier + * @rmtoll PLLCR DB FL_CMU_PLL_WriteMultiplier + * @param multiplier + * @retval None + */ +__STATIC_INLINE void FL_CMU_PLL_WriteMultiplier(uint32_t multiplier) +{ + MODIFY_REG(CMU->PLLCR, (0x7fU << 16U), (multiplier << 16U)); +} + +/** + * @brief Get PLL Multiplier Setting + * @rmtoll PLLCR DB FL_CMU_PLL_ReadMultiplier + * @retval + */ +__STATIC_INLINE uint32_t FL_CMU_PLL_ReadMultiplier(void) +{ + return (uint32_t)(READ_BIT(CMU->PLLCR, (0x7fU << 16U)) >> 16U); +} + +/** + * @brief Set PLL Prescaler + * @rmtoll PLLCR REFPRSC FL_CMU_PLL_SetPrescaler + * @param prescaler This parameter can be one of the following values: + * @arg @ref FL_CMU_PLL_PSC_DIV1 + * @arg @ref FL_CMU_PLL_PSC_DIV2 + * @arg @ref FL_CMU_PLL_PSC_DIV4 + * @arg @ref FL_CMU_PLL_PSC_DIV8 + * @arg @ref FL_CMU_PLL_PSC_DIV12 + * @arg @ref FL_CMU_PLL_PSC_DIV16 + * @arg @ref FL_CMU_PLL_PSC_DIV24 + * @arg @ref FL_CMU_PLL_PSC_DIV32 + * @retval None + */ +__STATIC_INLINE void FL_CMU_PLL_SetPrescaler(uint32_t prescaler) +{ + MODIFY_REG(CMU->PLLCR, CMU_PLLCR_REFPRSC_Msk, prescaler); +} + +/** + * @brief Get PLL Prescaler Setting + * @rmtoll PLLCR REFPRSC FL_CMU_PLL_GetPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_PLL_PSC_DIV1 + * @arg @ref FL_CMU_PLL_PSC_DIV2 + * @arg @ref FL_CMU_PLL_PSC_DIV4 + * @arg @ref FL_CMU_PLL_PSC_DIV8 + * @arg @ref FL_CMU_PLL_PSC_DIV12 + * @arg @ref FL_CMU_PLL_PSC_DIV16 + * @arg @ref FL_CMU_PLL_PSC_DIV24 + * @arg @ref FL_CMU_PLL_PSC_DIV32 + */ +__STATIC_INLINE uint32_t FL_CMU_PLL_GetPrescaler(void) +{ + return (uint32_t)(READ_BIT(CMU->PLLCR, CMU_PLLCR_REFPRSC_Msk)); +} + +/** + * @brief Set PLL Digital Domain Output + * @rmtoll PLLCR OSEL FL_CMU_PLL_SetOutputMultiplier + * @param multiplier This parameter can be one of the following values: + * @arg @ref FL_CMU_PLL_OUTPUT_X1 + * @arg @ref FL_CMU_PLL_OUTPUT_X2 + * @retval None + */ +__STATIC_INLINE void FL_CMU_PLL_SetOutputMultiplier(uint32_t multiplier) +{ + MODIFY_REG(CMU->PLLCR, CMU_PLLCR_OSEL_Msk, multiplier); +} + +/** + * @brief Get PLL Digital Domain Output Setting + * @rmtoll PLLCR OSEL FL_CMU_PLL_GetOutputMultiplier + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_PLL_OUTPUT_X1 + * @arg @ref FL_CMU_PLL_OUTPUT_X2 + */ +__STATIC_INLINE uint32_t FL_CMU_PLL_GetOutputMultiplier(void) +{ + return (uint32_t)(READ_BIT(CMU->PLLCR, CMU_PLLCR_OSEL_Msk)); +} + +/** + * @brief Set RCLP Enable + * @rmtoll RCLPCR ENB FL_CMU_RCLP_Enable + * @retval None + */ +__STATIC_INLINE void FL_CMU_RCLP_Enable(void) +{ + CLEAR_BIT(CMU->RCLPCR, CMU_RCLPCR_ENB_Msk); +} + +/** + * @brief Get RCLP Enable Flag + * @rmtoll RCLPCR ENB FL_CMU_RCLP_IsEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_RCLP_IsEnabled(void) +{ + return (uint32_t)!(READ_BIT(CMU->RCLPCR, CMU_RCLPCR_ENB_Msk) == CMU_RCLPCR_ENB_Msk); +} + +/** + * @brief Set RCLP Disable + * @rmtoll RCLPCR ENB FL_CMU_RCLP_Disable + * @retval None + */ +__STATIC_INLINE void FL_CMU_RCLP_Disable(void) +{ + SET_BIT(CMU->RCLPCR, CMU_RCLPCR_ENB_Msk); +} + +/** + * @brief Set RCLP Frequency Trim Value + * @rmtoll RCLPTR TRIM FL_CMU_RCLP_WriteTrimValue + * @param value TrimValue The value of RCLP trim + * @retval None + */ +__STATIC_INLINE void FL_CMU_RCLP_WriteTrimValue(uint32_t value) +{ + MODIFY_REG(CMU->RCLPTR, (0xffU << 0U), (value << 0U)); +} + +/** + * @brief Get RCLP Frequency Trim Value + * @rmtoll RCLPTR TRIM FL_CMU_RCLP_ReadTrimValue + * @retval The Value of RCLP trim + */ +__STATIC_INLINE uint32_t FL_CMU_RCLP_ReadTrimValue(void) +{ + return (uint32_t)(READ_BIT(CMU->RCLPTR, (0xffU << 0U)) >> 0U); +} + +/** + * @brief Set LSCLK Clock Source + * @rmtoll LSCLKSEL SEL FL_CMU_SetLSCLKClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_LSCLK_CLK_SOURCE_RCLP + * @arg @ref FL_CMU_LSCLK_CLK_SOURCE_XTLF + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetLSCLKClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->LSCLKSEL, CMU_LSCLKSEL_SEL_Msk, clock); +} + +/** + * @brief Set XTHF Oscillation Strength + * @rmtoll XTHFCR CFG FL_CMU_XTHF_WriteDriverStrength + * @param strength + * @retval None + */ +__STATIC_INLINE void FL_CMU_XTHF_WriteDriverStrength(uint32_t strength) +{ + MODIFY_REG(CMU->XTHFCR, (0x1fU << 8U), (strength << 8U)); +} + +/** + * @brief Get XTHF Oscillation Strength Setting + * @rmtoll XTHFCR CFG FL_CMU_XTHF_ReadDriverStrength + * @retval + */ +__STATIC_INLINE uint32_t FL_CMU_XTHF_ReadDriverStrength(void) +{ + return (uint32_t)(READ_BIT(CMU->XTHFCR, (0x1fU << 8U)) >> 8U); +} + +/** + * @brief Enable XTHF + * @rmtoll XTHFCR EN FL_CMU_XTHF_Enable + * @retval None + */ +__STATIC_INLINE void FL_CMU_XTHF_Enable(void) +{ + SET_BIT(CMU->XTHFCR, CMU_XTHFCR_EN_Msk); +} + +/** + * @brief Get XTHF Enable Status + * @rmtoll XTHFCR EN FL_CMU_XTHF_IsEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_XTHF_IsEnabled(void) +{ + return (uint32_t)(READ_BIT(CMU->XTHFCR, CMU_XTHFCR_EN_Msk) == CMU_XTHFCR_EN_Msk); +} + +/** + * @brief Disable XTHF + * @rmtoll XTHFCR EN FL_CMU_XTHF_Disable + * @retval None + */ +__STATIC_INLINE void FL_CMU_XTHF_Disable(void) +{ + CLEAR_BIT(CMU->XTHFCR, CMU_XTHFCR_EN_Msk); +} + +/** + * @brief Set RCLF Output Prescaler + * @rmtoll RCLFCR PSC FL_CMU_RCLF_SetPrescaler + * @param prescaler This parameter can be one of the following values: + * @arg @ref FL_CMU_RCLF_PSC_DIV1 + * @arg @ref FL_CMU_RCLF_PSC_DIV4 + * @arg @ref FL_CMU_RCLF_PSC_DIV8 + * @arg @ref FL_CMU_RCLF_PSC_DIV16 + * @retval None + */ +__STATIC_INLINE void FL_CMU_RCLF_SetPrescaler(uint32_t prescaler) +{ + MODIFY_REG(CMU->RCLFCR, CMU_RCLFCR_PSC_Msk, prescaler); +} + +/** + * @brief Get RCLF Output Prescaler Setting + * @rmtoll RCLFCR PSC FL_CMU_RCLF_GetPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_RCLF_PSC_DIV1 + * @arg @ref FL_CMU_RCLF_PSC_DIV4 + * @arg @ref FL_CMU_RCLF_PSC_DIV8 + * @arg @ref FL_CMU_RCLF_PSC_DIV16 + */ +__STATIC_INLINE uint32_t FL_CMU_RCLF_GetPrescaler(void) +{ + return (uint32_t)(READ_BIT(CMU->RCLFCR, CMU_RCLFCR_PSC_Msk)); +} + +/** + * @brief Enable RCLF + * @rmtoll RCLFCR EN FL_CMU_RCLF_Enable + * @retval None + */ +__STATIC_INLINE void FL_CMU_RCLF_Enable(void) +{ + SET_BIT(CMU->RCLFCR, CMU_RCLFCR_EN_Msk); +} + +/** + * @brief Get RCLF Enable Status + * @rmtoll RCLFCR EN FL_CMU_RCLF_IsEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_RCLF_IsEnabled(void) +{ + return (uint32_t)(READ_BIT(CMU->RCLFCR, CMU_RCLFCR_EN_Msk) == CMU_RCLFCR_EN_Msk); +} + +/** + * @brief Disable RCLF + * @rmtoll RCLFCR EN FL_CMU_RCLF_Disable + * @retval None + */ +__STATIC_INLINE void FL_CMU_RCLF_Disable(void) +{ + CLEAR_BIT(CMU->RCLFCR, CMU_RCLFCR_EN_Msk); +} + +/** + * @brief Set RCLF Frequency Trim Value + * @rmtoll RCLFTR TRIM FL_CMU_RCLF_WriteTrimValue + * @param value TrimValue The value of RCLF trim + * @retval None + */ +__STATIC_INLINE void FL_CMU_RCLF_WriteTrimValue(uint32_t value) +{ + MODIFY_REG(CMU->RCLFTR, (0xffU << 0U), (value << 0U)); +} + +/** + * @brief Get RCLF Frequency Trim Value + * @rmtoll RCLFTR TRIM FL_CMU_RCLF_ReadTrimValue + * @retval The Value of RCLF trim + */ +__STATIC_INLINE uint32_t FL_CMU_RCLF_ReadTrimValue(void) +{ + return (uint32_t)(READ_BIT(CMU->RCLFTR, (0xffU << 0U)) >> 0U); +} + +/** + * @brief Enable Group1 Periph Bus Clock + * @rmtoll PCLKCR1 FL_CMU_EnableGroup1BusClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP1_BUSCLK_LPTIM32 + * @arg @ref FL_CMU_GROUP1_BUSCLK_LPTIM16 + * @arg @ref FL_CMU_GROUP1_BUSCLK_RTCA + * @arg @ref FL_CMU_GROUP1_BUSCLK_PMU + * @arg @ref FL_CMU_GROUP1_BUSCLK_SCU + * @arg @ref FL_CMU_GROUP1_BUSCLK_IWDT + * @arg @ref FL_CMU_GROUP1_BUSCLK_ANAC + * @arg @ref FL_CMU_GROUP1_BUSCLK_PAD + * @arg @ref FL_CMU_GROUP1_BUSCLK_SVD + * @arg @ref FL_CMU_GROUP1_BUSCLK_COMP + * @arg @ref FL_CMU_GROUP1_BUSCLK_ATT + * @arg @ref FL_CMU_GROUP1_BUSCLK_VREF1P2 + * @retval None + */ +__STATIC_INLINE void FL_CMU_EnableGroup1BusClock(uint32_t peripheral) +{ + SET_BIT(CMU->PCLKCR1, ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Enable Group2 Periph Bus Clock + * @rmtoll PCLKCR2 FL_CMU_EnableGroup2BusClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP2_BUSCLK_CRC + * @arg @ref FL_CMU_GROUP2_BUSCLK_RNG + * @arg @ref FL_CMU_GROUP2_BUSCLK_AES + * @arg @ref FL_CMU_GROUP2_BUSCLK_LCD + * @arg @ref FL_CMU_GROUP2_BUSCLK_DMA + * @arg @ref FL_CMU_GROUP2_BUSCLK_FLASH + * @arg @ref FL_CMU_GROUP2_BUSCLK_RAMBIST + * @arg @ref FL_CMU_GROUP2_BUSCLK_WWDT + * @arg @ref FL_CMU_GROUP2_BUSCLK_ADC + * @arg @ref FL_CMU_GROUP2_BUSCLK_DIVAS + * @arg @ref FL_CMU_GROUP2_BUSCLK_DAC + * @retval None + */ +__STATIC_INLINE void FL_CMU_EnableGroup2BusClock(uint32_t peripheral) +{ + SET_BIT(CMU->PCLKCR2, ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Enable Group3 Periph Bus Clock + * @rmtoll PCLKCR3 FL_CMU_EnableGroup3BusClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP3_BUSCLK_SPI0 + * @arg @ref FL_CMU_GROUP3_BUSCLK_SPI1 + * @arg @ref FL_CMU_GROUP3_BUSCLK_SPI2 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART0 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART1 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART3 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART4 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART5 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UARTIR + * @arg @ref FL_CMU_GROUP3_BUSCLK_LPUART0 + * @arg @ref FL_CMU_GROUP3_BUSCLK_LPUART1 + * @arg @ref FL_CMU_GROUP3_BUSCLK_LPUART2 + * @arg @ref FL_CMU_GROUP3_BUSCLK_CAN + * @arg @ref FL_CMU_GROUP3_BUSCLK_I2C + * @retval None + */ +__STATIC_INLINE void FL_CMU_EnableGroup3BusClock(uint32_t peripheral) +{ + SET_BIT(CMU->PCLKCR3, ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Enable Group4 Periph Bus Clock + * @rmtoll PCLKCR4 FL_CMU_EnableGroup4BusClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP4_BUSCLK_BSTIM32 + * @arg @ref FL_CMU_GROUP4_BUSCLK_GPTIM0 + * @arg @ref FL_CMU_GROUP4_BUSCLK_GPTIM1 + * @arg @ref FL_CMU_GROUP4_BUSCLK_GPTIM2 + * @arg @ref FL_CMU_GROUP4_BUSCLK_ATIM + * @arg @ref FL_CMU_GROUP4_BUSCLK_BSTIM16 + * @retval None + */ +__STATIC_INLINE void FL_CMU_EnableGroup4BusClock(uint32_t peripheral) +{ + SET_BIT(CMU->PCLKCR4, ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Disable Group1 Periph Bus Clock + * @rmtoll PCLKCR1 FL_CMU_DisableGroup1BusClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP1_BUSCLK_LPTIM32 + * @arg @ref FL_CMU_GROUP1_BUSCLK_LPTIM16 + * @arg @ref FL_CMU_GROUP1_BUSCLK_RTCA + * @arg @ref FL_CMU_GROUP1_BUSCLK_PMU + * @arg @ref FL_CMU_GROUP1_BUSCLK_SCU + * @arg @ref FL_CMU_GROUP1_BUSCLK_IWDT + * @arg @ref FL_CMU_GROUP1_BUSCLK_ANAC + * @arg @ref FL_CMU_GROUP1_BUSCLK_PAD + * @arg @ref FL_CMU_GROUP1_BUSCLK_SVD + * @arg @ref FL_CMU_GROUP1_BUSCLK_COMP + * @arg @ref FL_CMU_GROUP1_BUSCLK_ATT + * @arg @ref FL_CMU_GROUP1_BUSCLK_VREF1P2 + * @retval None + */ +__STATIC_INLINE void FL_CMU_DisableGroup1BusClock(uint32_t peripheral) +{ + CLEAR_BIT(CMU->PCLKCR1, ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Disable Group2 Periph Bus Clock + * @rmtoll PCLKCR2 FL_CMU_DisableGroup2BusClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP2_BUSCLK_CRC + * @arg @ref FL_CMU_GROUP2_BUSCLK_RNG + * @arg @ref FL_CMU_GROUP2_BUSCLK_AES + * @arg @ref FL_CMU_GROUP2_BUSCLK_LCD + * @arg @ref FL_CMU_GROUP2_BUSCLK_DMA + * @arg @ref FL_CMU_GROUP2_BUSCLK_FLASH + * @arg @ref FL_CMU_GROUP2_BUSCLK_RAMBIST + * @arg @ref FL_CMU_GROUP2_BUSCLK_WWDT + * @arg @ref FL_CMU_GROUP2_BUSCLK_ADC + * @arg @ref FL_CMU_GROUP2_BUSCLK_DIVAS + * @arg @ref FL_CMU_GROUP2_BUSCLK_DAC + * @retval None + */ +__STATIC_INLINE void FL_CMU_DisableGroup2BusClock(uint32_t peripheral) +{ + CLEAR_BIT(CMU->PCLKCR2, ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Disable Group3 Periph Bus Clock + * @rmtoll PCLKCR3 FL_CMU_DisableGroup3BusClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP3_BUSCLK_SPI0 + * @arg @ref FL_CMU_GROUP3_BUSCLK_SPI1 + * @arg @ref FL_CMU_GROUP3_BUSCLK_SPI2 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART0 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART1 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART3 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART4 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART5 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UARTIR + * @arg @ref FL_CMU_GROUP3_BUSCLK_LPUART0 + * @arg @ref FL_CMU_GROUP3_BUSCLK_LPUART1 + * @arg @ref FL_CMU_GROUP3_BUSCLK_LPUART2 + * @arg @ref FL_CMU_GROUP3_BUSCLK_CAN + * @arg @ref FL_CMU_GROUP3_BUSCLK_I2C + * @retval None + */ +__STATIC_INLINE void FL_CMU_DisableGroup3BusClock(uint32_t peripheral) +{ + CLEAR_BIT(CMU->PCLKCR3, ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Disable Group4 Periph Bus Clock + * @rmtoll PCLKCR4 FL_CMU_DisableGroup4BusClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP4_BUSCLK_BSTIM32 + * @arg @ref FL_CMU_GROUP4_BUSCLK_GPTIM0 + * @arg @ref FL_CMU_GROUP4_BUSCLK_GPTIM1 + * @arg @ref FL_CMU_GROUP4_BUSCLK_GPTIM2 + * @arg @ref FL_CMU_GROUP4_BUSCLK_ATIM + * @arg @ref FL_CMU_GROUP4_BUSCLK_BSTIM16 + * @retval None + */ +__STATIC_INLINE void FL_CMU_DisableGroup4BusClock(uint32_t peripheral) +{ + CLEAR_BIT(CMU->PCLKCR4, ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Get Group1 Periph Bus Clock Enable Status + * @rmtoll PCLKCR1 FL_CMU_IsEnabledGroup1BusClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP1_BUSCLK_LPTIM32 + * @arg @ref FL_CMU_GROUP1_BUSCLK_LPTIM16 + * @arg @ref FL_CMU_GROUP1_BUSCLK_RTCA + * @arg @ref FL_CMU_GROUP1_BUSCLK_PMU + * @arg @ref FL_CMU_GROUP1_BUSCLK_SCU + * @arg @ref FL_CMU_GROUP1_BUSCLK_IWDT + * @arg @ref FL_CMU_GROUP1_BUSCLK_ANAC + * @arg @ref FL_CMU_GROUP1_BUSCLK_PAD + * @arg @ref FL_CMU_GROUP1_BUSCLK_SVD + * @arg @ref FL_CMU_GROUP1_BUSCLK_COMP + * @arg @ref FL_CMU_GROUP1_BUSCLK_ATT + * @arg @ref FL_CMU_GROUP1_BUSCLK_VREF1P2 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsEnabledGroup1BusClock(uint32_t peripheral) +{ + return (uint32_t)(READ_BIT(CMU->PCLKCR1, ((peripheral & 0xffffffff) << 0x0U)) == ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Get Group2 Periph Bus Clock Enable Status + * @rmtoll PCLKCR2 FL_CMU_IsEnabledGroup2BusClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP2_BUSCLK_CRC + * @arg @ref FL_CMU_GROUP2_BUSCLK_RNG + * @arg @ref FL_CMU_GROUP2_BUSCLK_AES + * @arg @ref FL_CMU_GROUP2_BUSCLK_LCD + * @arg @ref FL_CMU_GROUP2_BUSCLK_DMA + * @arg @ref FL_CMU_GROUP2_BUSCLK_FLASH + * @arg @ref FL_CMU_GROUP2_BUSCLK_RAMBIST + * @arg @ref FL_CMU_GROUP2_BUSCLK_WWDT + * @arg @ref FL_CMU_GROUP2_BUSCLK_ADC + * @arg @ref FL_CMU_GROUP2_BUSCLK_DIVAS + * @arg @ref FL_CMU_GROUP2_BUSCLK_DAC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsEnabledGroup2BusClock(uint32_t peripheral) +{ + return (uint32_t)(READ_BIT(CMU->PCLKCR2, ((peripheral & 0xffffffff) << 0x0U)) == ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Get Group3 Periph Bus Clock Enable Status + * @rmtoll PCLKCR3 FL_CMU_IsEnabledGroup3BusClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP3_BUSCLK_SPI0 + * @arg @ref FL_CMU_GROUP3_BUSCLK_SPI1 + * @arg @ref FL_CMU_GROUP3_BUSCLK_SPI2 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART0 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART1 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART3 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART4 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UART5 + * @arg @ref FL_CMU_GROUP3_BUSCLK_UARTIR + * @arg @ref FL_CMU_GROUP3_BUSCLK_LPUART0 + * @arg @ref FL_CMU_GROUP3_BUSCLK_LPUART1 + * @arg @ref FL_CMU_GROUP3_BUSCLK_LPUART2 + * @arg @ref FL_CMU_GROUP3_BUSCLK_CAN + * @arg @ref FL_CMU_GROUP3_BUSCLK_I2C + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsEnabledGroup3BusClock(uint32_t peripheral) +{ + return (uint32_t)(READ_BIT(CMU->PCLKCR3, ((peripheral & 0xffffffff) << 0x0U)) == ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Get Group4 Periph Bus Clock Enable Status + * @rmtoll PCLKCR4 FL_CMU_IsEnabledGroup4BusClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP4_BUSCLK_BSTIM32 + * @arg @ref FL_CMU_GROUP4_BUSCLK_GPTIM0 + * @arg @ref FL_CMU_GROUP4_BUSCLK_GPTIM1 + * @arg @ref FL_CMU_GROUP4_BUSCLK_GPTIM2 + * @arg @ref FL_CMU_GROUP4_BUSCLK_ATIM + * @arg @ref FL_CMU_GROUP4_BUSCLK_BSTIM16 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsEnabledGroup4BusClock(uint32_t peripheral) +{ + return (uint32_t)(READ_BIT(CMU->PCLKCR4, ((peripheral & 0xffffffff) << 0x0U)) == ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Enable Group3 Periph Operation Clock + * @rmtoll OPCCR3 FL_CMU_EnableGroup3OperationClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP3_OPCLK_EXTI + * @arg @ref FL_CMU_GROUP3_OPCLK_FLASH + * @arg @ref FL_CMU_GROUP3_OPCLK_LPUART1 + * @arg @ref FL_CMU_GROUP3_OPCLK_LPUART0 + * @arg @ref FL_CMU_GROUP3_OPCLK_RNG + * @arg @ref FL_CMU_GROUP3_OPCLK_LPUART2 + * @arg @ref FL_CMU_GROUP3_OPCLK_I2C + * @arg @ref FL_CMU_GROUP3_OPCLK_ADC + * @arg @ref FL_CMU_GROUP3_OPCLK_ATIM + * @arg @ref FL_CMU_GROUP3_OPCLK_CAN + * @arg @ref FL_CMU_GROUP3_OPCLK_UART1 + * @arg @ref FL_CMU_GROUP3_OPCLK_UART0 + * @arg @ref FL_CMU_GROUP3_OPCLK_BSTIM16 + * @arg @ref FL_CMU_GROUP3_OPCLK_BSTIM32 + * @arg @ref FL_CMU_GROUP3_OPCLK_LPTIM16 + * @arg @ref FL_CMU_GROUP3_OPCLK_LPTIM32 + * @retval None + */ +__STATIC_INLINE void FL_CMU_EnableGroup3OperationClock(uint32_t peripheral) +{ + SET_BIT(CMU->OPCCR3, ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Disable Group3 Periph Operation Clock + * @rmtoll OPCCR3 FL_CMU_DisableGroup3OperationClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP3_OPCLK_EXTI + * @arg @ref FL_CMU_GROUP3_OPCLK_FLASH + * @arg @ref FL_CMU_GROUP3_OPCLK_LPUART1 + * @arg @ref FL_CMU_GROUP3_OPCLK_LPUART0 + * @arg @ref FL_CMU_GROUP3_OPCLK_RNG + * @arg @ref FL_CMU_GROUP3_OPCLK_LPUART2 + * @arg @ref FL_CMU_GROUP3_OPCLK_I2C + * @arg @ref FL_CMU_GROUP3_OPCLK_ADC + * @arg @ref FL_CMU_GROUP3_OPCLK_ATIM + * @arg @ref FL_CMU_GROUP3_OPCLK_CAN + * @arg @ref FL_CMU_GROUP3_OPCLK_UART1 + * @arg @ref FL_CMU_GROUP3_OPCLK_UART0 + * @arg @ref FL_CMU_GROUP3_OPCLK_BSTIM16 + * @arg @ref FL_CMU_GROUP3_OPCLK_BSTIM32 + * @arg @ref FL_CMU_GROUP3_OPCLK_LPTIM16 + * @arg @ref FL_CMU_GROUP3_OPCLK_LPTIM32 + * @retval None + */ +__STATIC_INLINE void FL_CMU_DisableGroup3OperationClock(uint32_t peripheral) +{ + CLEAR_BIT(CMU->OPCCR3, ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Get Group3 Periph Operation Clock Enable Status + * @rmtoll OPCCR3 FL_CMU_IsEnabledGroup3OperationClock + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_CMU_GROUP3_OPCLK_EXTI + * @arg @ref FL_CMU_GROUP3_OPCLK_FLASH + * @arg @ref FL_CMU_GROUP3_OPCLK_LPUART1 + * @arg @ref FL_CMU_GROUP3_OPCLK_LPUART0 + * @arg @ref FL_CMU_GROUP3_OPCLK_RNG + * @arg @ref FL_CMU_GROUP3_OPCLK_LPUART2 + * @arg @ref FL_CMU_GROUP3_OPCLK_I2C + * @arg @ref FL_CMU_GROUP3_OPCLK_ADC + * @arg @ref FL_CMU_GROUP3_OPCLK_ATIM + * @arg @ref FL_CMU_GROUP3_OPCLK_CAN + * @arg @ref FL_CMU_GROUP3_OPCLK_UART1 + * @arg @ref FL_CMU_GROUP3_OPCLK_UART0 + * @arg @ref FL_CMU_GROUP3_OPCLK_BSTIM16 + * @arg @ref FL_CMU_GROUP3_OPCLK_BSTIM32 + * @arg @ref FL_CMU_GROUP3_OPCLK_LPTIM16 + * @arg @ref FL_CMU_GROUP3_OPCLK_LPTIM32 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsEnabledGroup3OperationClock(uint32_t peripheral) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR3, ((peripheral & 0xffffffff) << 0x0U)) == ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Set EXTI Clock Source + * @rmtoll OPCCR1 EXTICKS FL_CMU_SetEXTIClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_EXTI_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_EXTI_CLK_SOURCE_HCLK + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetEXTIClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_EXTICKS_Msk, clock); +} + +/** + * @brief Get EXTI Clock Source Setting + * @rmtoll OPCCR1 EXTICKS FL_CMU_GetEXTIClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_EXTI_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_EXTI_CLK_SOURCE_HCLK + */ +__STATIC_INLINE uint32_t FL_CMU_GetEXTIClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_EXTICKS_Msk)); +} + +/** + * @brief Set LPUART1 Clock Source + * @rmtoll OPCCR1 LPUART1CKS FL_CMU_SetLPUART1ClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_LPUART1_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_LPUART1_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_LPUART1_CLK_SOURCE_RCLF + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetLPUART1ClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_LPUART1CKS_Msk, clock); +} + +/** + * @brief Get LPUART1 Clock Source Setting + * @rmtoll OPCCR1 LPUART1CKS FL_CMU_GetLPUART1ClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_LPUART1_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_LPUART1_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_LPUART1_CLK_SOURCE_RCLF + */ +__STATIC_INLINE uint32_t FL_CMU_GetLPUART1ClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_LPUART1CKS_Msk)); +} + +/** + * @brief Set LPUART0 Clock Source + * @rmtoll OPCCR1 LPUART0CKS FL_CMU_SetLPUART0ClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_LPUART0_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_LPUART0_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_LPUART0_CLK_SOURCE_RCLF + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetLPUART0ClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_LPUART0CKS_Msk, clock); +} + +/** + * @brief Get LPUART0 Clock Source Setting + * @rmtoll OPCCR1 LPUART0CKS FL_CMU_GetLPUART0ClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_LPUART0_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_LPUART0_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_LPUART0_CLK_SOURCE_RCLF + */ +__STATIC_INLINE uint32_t FL_CMU_GetLPUART0ClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_LPUART0CKS_Msk)); +} + +/** + * @brief Set LPUART2 Clock Source + * @rmtoll OPCCR1 LPUART2CKS FL_CMU_SetLPUART2ClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_LPUART2_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_LPUART2_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_LPUART2_CLK_SOURCE_RCLF + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetLPUART2ClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_LPUART2CKS_Msk, clock); +} + +/** + * @brief Get LPUART2 Clock Source Setting + * @rmtoll OPCCR1 LPUART2CKS FL_CMU_GetLPUART2ClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_LPUART2_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_LPUART2_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_LPUART2_CLK_SOURCE_RCLF + */ +__STATIC_INLINE uint32_t FL_CMU_GetLPUART2ClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_LPUART2CKS_Msk)); +} + +/** + * @brief Set I2C Clock Source + * @rmtoll OPCCR1 I2CCKS FL_CMU_SetI2CClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_I2C_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_I2C_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_I2C_CLK_SOURCE_SYSCLK + * @arg @ref FL_CMU_I2C_CLK_SOURCE_RCLF + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetI2CClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_I2CCKS_Msk, clock); +} + +/** + * @brief Get I2C Clock Source Setting + * @rmtoll OPCCR1 I2CCKS FL_CMU_GetI2CClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_I2C_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_I2C_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_I2C_CLK_SOURCE_SYSCLK + * @arg @ref FL_CMU_I2C_CLK_SOURCE_RCLF + */ +__STATIC_INLINE uint32_t FL_CMU_GetI2CClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_I2CCKS_Msk)); +} + +/** + * @brief Set BSTIM16 Clock Source + * @rmtoll OPCCR1 BT16CKS FL_CMU_SetBSTIM16ClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_BSTIM16_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_BSTIM16_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_BSTIM16_CLK_SOURCE_RCLP + * @arg @ref FL_CMU_BSTIM16_CLK_SOURCE_RCLF + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetBSTIM16ClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_BT16CKS_Msk, clock); +} + +/** + * @brief Get BSTIM16 Clock Source Setting + * @rmtoll OPCCR1 BT16CKS FL_CMU_GetBSTIM16ClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_BSTIM16_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_BSTIM16_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_BSTIM16_CLK_SOURCE_RCLP + * @arg @ref FL_CMU_BSTIM16_CLK_SOURCE_RCLF + */ +__STATIC_INLINE uint32_t FL_CMU_GetBSTIM16ClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_BT16CKS_Msk)); +} + +/** + * @brief Set BSTIM32 Clock Source + * @rmtoll OPCCR1 BT32CKS FL_CMU_SetBSTIM32ClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_BSTIM32_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_BSTIM32_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_BSTIM32_CLK_SOURCE_RCLP + * @arg @ref FL_CMU_BSTIM32_CLK_SOURCE_RCLF + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetBSTIM32ClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_BT32CKS_Msk, clock); +} + +/** + * @brief Get BSTIM32 Clock Source Setting + * @rmtoll OPCCR1 BT32CKS FL_CMU_GetBSTIM32ClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_BSTIM32_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_BSTIM32_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_BSTIM32_CLK_SOURCE_RCLP + * @arg @ref FL_CMU_BSTIM32_CLK_SOURCE_RCLF + */ +__STATIC_INLINE uint32_t FL_CMU_GetBSTIM32ClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_BT32CKS_Msk)); +} + +/** + * @brief Set LPTIM16 Clock Source + * @rmtoll OPCCR1 LPT16CKS FL_CMU_SetLPTIM16ClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_LPTIM16_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_LPTIM16_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_LPTIM16_CLK_SOURCE_RCLP + * @arg @ref FL_CMU_LPTIM16_CLK_SOURCE_RCLF + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetLPTIM16ClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_LPT16CKS_Msk, clock); +} + +/** + * @brief Get LPTIM16 Clock Source Setting + * @rmtoll OPCCR1 LPT16CKS FL_CMU_GetLPTIM16ClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_LPTIM16_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_LPTIM16_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_LPTIM16_CLK_SOURCE_RCLP + * @arg @ref FL_CMU_LPTIM16_CLK_SOURCE_RCLF + */ +__STATIC_INLINE uint32_t FL_CMU_GetLPTIM16ClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_LPT16CKS_Msk)); +} + +/** + * @brief Set LPTIM32 Clock Source + * @rmtoll OPCCR1 LPT32CKS FL_CMU_SetLPTIM32ClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_LPTIM32_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_LPTIM32_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_LPTIM32_CLK_SOURCE_RCLP + * @arg @ref FL_CMU_LPTIM32_CLK_SOURCE_RCLF + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetLPTIM32ClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_LPT32CKS_Msk, clock); +} + +/** + * @brief Get LPTIM32 Clock Source Setting + * @rmtoll OPCCR1 LPT32CKS FL_CMU_GetLPTIM32ClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_LPTIM32_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_LPTIM32_CLK_SOURCE_LSCLK + * @arg @ref FL_CMU_LPTIM32_CLK_SOURCE_RCLP + * @arg @ref FL_CMU_LPTIM32_CLK_SOURCE_RCLF + */ +__STATIC_INLINE uint32_t FL_CMU_GetLPTIM32ClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_LPT32CKS_Msk)); +} + +/** + * @brief Set ATIM Clock Source + * @rmtoll OPCCR1 ATCKS FL_CMU_SetATIMClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_ATIM_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_ATIM_CLK_SOURCE_PLL_X2 + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetATIMClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_ATCKS_Msk, clock); +} + +/** + * @brief Get ATIM Clock Source Setting + * @rmtoll OPCCR1 ATCKS FL_CMU_GetATIMClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_ATIM_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_ATIM_CLK_SOURCE_PLL_X2 + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_ATIM_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_ATIM_CLK_SOURCE_PLL_X2 + */ +__STATIC_INLINE uint32_t FL_CMU_GetATIMClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_ATCKS_Msk)); +} + +/** + * @brief Set CAN Clock Source + * @rmtoll OPCCR1 CANCKS FL_CMU_SetCANClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_CAN_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_CAN_CLK_SOURCE_XTHF + * @arg @ref FL_CMU_CAN_CLK_SOURCE_PLL + * @arg @ref FL_CMU_CAN_CLK_SOURCE_APBCLK + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetCANClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_CANCKS_Msk, clock); +} + +/** + * @brief Get CAN Clock Source Setting + * @rmtoll OPCCR1 CANCKS FL_CMU_GetCANClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_CAN_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_CAN_CLK_SOURCE_XTHF + * @arg @ref FL_CMU_CAN_CLK_SOURCE_PLL + * @arg @ref FL_CMU_CAN_CLK_SOURCE_APBCLK + */ +__STATIC_INLINE uint32_t FL_CMU_GetCANClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_CANCKS_Msk)); +} + +/** + * @brief Set UART1 Clock Source + * @rmtoll OPCCR1 UART1CKS FL_CMU_SetUART1ClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_UART1_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_UART1_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_UART1_CLK_SOURCE_SYSCLK + * @arg @ref FL_CMU_UART1_CLK_SOURCE_XTHF + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetUART1ClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_UART1CKS_Msk, clock); +} + +/** + * @brief Get UART1 Clock Source Setting + * @rmtoll OPCCR1 UART1CKS FL_CMU_GetUART1ClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_UART1_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_UART1_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_UART1_CLK_SOURCE_SYSCLK + * @arg @ref FL_CMU_UART1_CLK_SOURCE_XTHF + */ +__STATIC_INLINE uint32_t FL_CMU_GetUART1ClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_UART1CKS_Msk)); +} + +/** + * @brief Set UART0 Clock Source + * @rmtoll OPCCR1 UART0CKS FL_CMU_SetUART0ClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_UART0_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_UART0_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_UART0_CLK_SOURCE_SYSCLK + * @arg @ref FL_CMU_UART0_CLK_SOURCE_XTHF + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetUART0ClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR1, CMU_OPCCR1_UART0CKS_Msk, clock); +} + +/** + * @brief Get UART0 Clock Source Setting + * @rmtoll OPCCR1 UART0CKS FL_CMU_GetUART0ClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_UART0_CLK_SOURCE_APBCLK + * @arg @ref FL_CMU_UART0_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_UART0_CLK_SOURCE_SYSCLK + * @arg @ref FL_CMU_UART0_CLK_SOURCE_XTHF + */ +__STATIC_INLINE uint32_t FL_CMU_GetUART0ClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR1, CMU_OPCCR1_UART0CKS_Msk)); +} + +/** + * @brief Set RNG Prescaler + * @rmtoll OPCCR2 RNGPRSC FL_CMU_SetRNGPrescaler + * @param prescaler This parameter can be one of the following values: + * @arg @ref FL_CMU_RNG_PSC_DIV1 + * @arg @ref FL_CMU_RNG_PSC_DIV2 + * @arg @ref FL_CMU_RNG_PSC_DIV4 + * @arg @ref FL_CMU_RNG_PSC_DIV8 + * @arg @ref FL_CMU_RNG_PSC_DIV16 + * @arg @ref FL_CMU_RNG_PSC_DIV32 + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetRNGPrescaler(uint32_t prescaler) +{ + MODIFY_REG(CMU->OPCCR2, CMU_OPCCR2_RNGPRSC_Msk, prescaler); +} + +/** + * @brief Get RNG Prescaler Setting + * @rmtoll OPCCR2 RNGPRSC FL_CMU_GetRNGPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_RNG_PSC_DIV1 + * @arg @ref FL_CMU_RNG_PSC_DIV2 + * @arg @ref FL_CMU_RNG_PSC_DIV4 + * @arg @ref FL_CMU_RNG_PSC_DIV8 + * @arg @ref FL_CMU_RNG_PSC_DIV16 + * @arg @ref FL_CMU_RNG_PSC_DIV32 + */ +__STATIC_INLINE uint32_t FL_CMU_GetRNGPrescaler(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR2, CMU_OPCCR2_RNGPRSC_Msk)); +} + +/** + * @brief Set ADC Prescaler + * @rmtoll OPCCR2 ADCPRSC FL_CMU_SetADCPrescaler + * @param prescaler This parameter can be one of the following values: + * @arg @ref FL_CMU_ADC_PSC_DIV1 + * @arg @ref FL_CMU_ADC_PSC_DIV2 + * @arg @ref FL_CMU_ADC_PSC_DIV4 + * @arg @ref FL_CMU_ADC_PSC_DIV8 + * @arg @ref FL_CMU_ADC_PSC_DIV16 + * @arg @ref FL_CMU_ADC_PSC_DIV32 + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetADCPrescaler(uint32_t prescaler) +{ + MODIFY_REG(CMU->OPCCR2, CMU_OPCCR2_ADCPRSC_Msk, prescaler); +} + +/** + * @brief Get ADC Prescaler Setting + * @rmtoll OPCCR2 ADCPRSC FL_CMU_GetADCPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_ADC_PSC_DIV1 + * @arg @ref FL_CMU_ADC_PSC_DIV2 + * @arg @ref FL_CMU_ADC_PSC_DIV4 + * @arg @ref FL_CMU_ADC_PSC_DIV8 + * @arg @ref FL_CMU_ADC_PSC_DIV16 + * @arg @ref FL_CMU_ADC_PSC_DIV32 + */ +__STATIC_INLINE uint32_t FL_CMU_GetADCPrescaler(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR2, CMU_OPCCR2_ADCPRSC_Msk)); +} + +/** + * @brief Set ADC Clock Source + * @rmtoll OPCCR2 ADCCKS FL_CMU_SetADCClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_ADC_CLK_SOURCE_RCLF + * @arg @ref FL_CMU_ADC_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_ADC_CLK_SOURCE_XTHF + * @arg @ref FL_CMU_ADC_CLK_SOURCE_PLL + * @retval None + */ +__STATIC_INLINE void FL_CMU_SetADCClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->OPCCR2, CMU_OPCCR2_ADCCKS_Msk, clock); +} + +/** + * @brief Get ADC Clock Source Setting + * @rmtoll OPCCR2 ADCCKS FL_CMU_GetADCClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_ADC_CLK_SOURCE_RCLF + * @arg @ref FL_CMU_ADC_CLK_SOURCE_RCHF + * @arg @ref FL_CMU_ADC_CLK_SOURCE_XTHF + * @arg @ref FL_CMU_ADC_CLK_SOURCE_PLL + */ +__STATIC_INLINE uint32_t FL_CMU_GetADCClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->OPCCR2, CMU_OPCCR2_ADCCKS_Msk)); +} + +/** + * @brief Disable CCL Interrupt + * @rmtoll CCCR CCLIE FL_CMU_CCL_DisableIT + * @retval None + */ +__STATIC_INLINE void FL_CMU_CCL_DisableIT(void) +{ + CLEAR_BIT(CMU->CCCR, CMU_CCCR_CCLIE_Msk); +} + +/** + * @brief Enable CCL Interrupt + * @rmtoll CCCR CCLIE FL_CMU_CCL_EnableIT + * @retval None + */ +__STATIC_INLINE void FL_CMU_CCL_EnableIT(void) +{ + SET_BIT(CMU->CCCR, CMU_CCCR_CCLIE_Msk); +} + +/** + * @brief Get CCL Interrupt Enable Status + * @rmtoll CCCR CCLIE FL_CMU_CCL_IsEnabledIT + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_CCL_IsEnabledIT(void) +{ + return (uint32_t)(READ_BIT(CMU->CCCR, CMU_CCCR_CCLIE_Msk) == CMU_CCCR_CCLIE_Msk); +} + +/** + * @brief Enable CCL + * @rmtoll CCCR EN FL_CMU_CCL_Enable + * @retval None + */ +__STATIC_INLINE void FL_CMU_CCL_Enable(void) +{ + SET_BIT(CMU->CCCR, CMU_CCCR_EN_Msk); +} + +/** + * @brief Get CCL Enable Status + * @rmtoll CCCR EN FL_CMU_CCL_IsEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_CCL_IsEnabled(void) +{ + return (uint32_t)(READ_BIT(CMU->CCCR, CMU_CCCR_EN_Msk) == CMU_CCCR_EN_Msk); +} + +/** + * @brief Disable CCL + * @rmtoll CCCR EN FL_CMU_CCL_Disable + * @retval None + */ +__STATIC_INLINE void FL_CMU_CCL_Disable(void) +{ + CLEAR_BIT(CMU->CCCR, CMU_CCCR_EN_Msk); +} + +/** + * @brief Set CCL Calibration Clock Prescaler + * @rmtoll CCFR CALPSC FL_CMU_CCL_SetCalibrationClockPrescaler + * @param prescaler This parameter can be one of the following values: + * @arg @ref FL_CMU_CCL_CALCLK_PSC_DIV1 + * @arg @ref FL_CMU_CCL_CALCLK_PSC_DIV2 + * @arg @ref FL_CMU_CCL_CALCLK_PSC_DIV4 + * @arg @ref FL_CMU_CCL_CALCLK_PSC_DIV8 + * @retval None + */ +__STATIC_INLINE void FL_CMU_CCL_SetCalibrationClockPrescaler(uint32_t prescaler) +{ + MODIFY_REG(CMU->CCFR, CMU_CCFR_CALPSC_Msk, prescaler); +} + +/** + * @brief Get CCL Calibration Clock Prescaler + * @rmtoll CCFR CALPSC FL_CMU_CCL_GetCalibrationClockPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_CCL_CALCLK_PSC_DIV1 + * @arg @ref FL_CMU_CCL_CALCLK_PSC_DIV2 + * @arg @ref FL_CMU_CCL_CALCLK_PSC_DIV4 + * @arg @ref FL_CMU_CCL_CALCLK_PSC_DIV8 + */ +__STATIC_INLINE uint32_t FL_CMU_CCL_GetCalibrationClockPrescaler(void) +{ + return (uint32_t)(READ_BIT(CMU->CCFR, CMU_CCFR_CALPSC_Msk)); +} + +/** + * @brief Set CCL Reference Clock Prescaler + * @rmtoll CCFR REFPSC FL_CMU_CCL_SetReferenceClockPrescaler + * @param prescaler This parameter can be one of the following values: + * @arg @ref FL_CMU_CCL_REFCLK_PSC_DIV8 + * @arg @ref FL_CMU_CCL_REFCLK_PSC_DIV16 + * @arg @ref FL_CMU_CCL_REFCLK_PSC_DIV32 + * @arg @ref FL_CMU_CCL_REFCLK_PSC_DIV64 + * @retval None + */ +__STATIC_INLINE void FL_CMU_CCL_SetReferenceClockPrescaler(uint32_t prescaler) +{ + MODIFY_REG(CMU->CCFR, CMU_CCFR_REFPSC_Msk, prescaler); +} + +/** + * @brief Get CCL Reference Clock Prescaler + * @rmtoll CCFR REFPSC FL_CMU_CCL_GetReferenceClockPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_CCL_REFCLK_PSC_DIV8 + * @arg @ref FL_CMU_CCL_REFCLK_PSC_DIV16 + * @arg @ref FL_CMU_CCL_REFCLK_PSC_DIV32 + * @arg @ref FL_CMU_CCL_REFCLK_PSC_DIV64 + */ +__STATIC_INLINE uint32_t FL_CMU_CCL_GetReferenceClockPrescaler(void) +{ + return (uint32_t)(READ_BIT(CMU->CCFR, CMU_CCFR_REFPSC_Msk)); +} + +/** + * @brief Set CCL Calibration Clock Source + * @rmtoll CCFR CALSEL FL_CMU_CCL_SetCalibrationClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_CCL_CALCLK_SOURCE_RCHF + * @arg @ref FL_CMU_CCL_CALCLK_SOURCE_RCLF + * @arg @ref FL_CMU_CCL_CALCLK_SOURCE_XTHF + * @retval None + */ +__STATIC_INLINE void FL_CMU_CCL_SetCalibrationClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->CCFR, CMU_CCFR_CALSEL_Msk, clock); +} + +/** + * @brief Get CCL Calibration Clock Source Setting + * @rmtoll CCFR CALSEL FL_CMU_CCL_GetCalibrationClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_CCL_CALCLK_SOURCE_RCHF + * @arg @ref FL_CMU_CCL_CALCLK_SOURCE_RCLF + * @arg @ref FL_CMU_CCL_CALCLK_SOURCE_XTHF + */ +__STATIC_INLINE uint32_t FL_CMU_CCL_GetCalibrationClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->CCFR, CMU_CCFR_CALSEL_Msk)); +} + +/** + * @brief Set CCL Reference Clock Source + * @rmtoll CCFR REFSEL FL_CMU_CCL_SetReferenceClockSource + * @param clock This parameter can be one of the following values: + * @arg @ref FL_CMU_CCL_REFCLK_SOURCE_XTLF + * @arg @ref FL_CMU_CCL_REFCLK_SOURCE_RCLP + * @retval None + */ +__STATIC_INLINE void FL_CMU_CCL_SetReferenceClockSource(uint32_t clock) +{ + MODIFY_REG(CMU->CCFR, CMU_CCFR_REFSEL_Msk, clock); +} + +/** + * @brief Get CCL Reference Clock Source Setting + * @rmtoll CCFR REFSEL FL_CMU_CCL_GetReferenceClockSource + * @retval Returned value can be one of the following values: + * @arg @ref FL_CMU_CCL_REFCLK_SOURCE_XTLF + * @arg @ref FL_CMU_CCL_REFCLK_SOURCE_RCLP + */ +__STATIC_INLINE uint32_t FL_CMU_CCL_GetReferenceClockSource(void) +{ + return (uint32_t)(READ_BIT(CMU->CCFR, CMU_CCFR_REFSEL_Msk)); +} + +/** + * @brief Get CCL Counter value + * @rmtoll CCNR CCNT FL_CMU_CCL_ReadCounter + * @retval + */ +__STATIC_INLINE uint32_t FL_CMU_CCL_ReadCounter(void) +{ + return (uint32_t)(READ_BIT(CMU->CCNR, (0xffffU << 0U)) >> 0U); +} + +/** + * @brief Get CCL interrupt flag + * @rmtoll CCISR CCLIF FL_CMU_IsActiveFlag_CCLComplete + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CMU_IsActiveFlag_CCLComplete(void) +{ + return (uint32_t)(READ_BIT(CMU->CCISR, CMU_CCISR_CCLIF_Msk) == (CMU_CCISR_CCLIF_Msk)); +} + +/** + * @brief Clear CCL interrupt flag + * @rmtoll CCISR CCLIF FL_CMU_ClearFlag_CCLComplete + * @retval None + */ +__STATIC_INLINE void FL_CMU_ClearFlag_CCLComplete(void) +{ + WRITE_REG(CMU->CCISR, CMU_CCISR_CCLIF_Msk); +} + +/** + * @} + */ + +/** @defgroup CMU_FL_EF_QUERY Clock frequency query functions + * @{ + */ + +uint32_t FL_CMU_GetPLLClockFreq(void); +uint32_t FL_CMU_GetRCHFClockFreq(void); +uint32_t FL_CMU_GetRCLFClockFreq(void); +uint32_t FL_CMU_GetSystemClockFreq(void); +uint32_t FL_CMU_GetAPBClockFreq(void); +uint32_t FL_CMU_GetAHBClockFreq(void); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_CMU_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.1 @ 2020-10-20*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_comp.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_comp.h new file mode 100644 index 0000000..135f27c --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_comp.h @@ -0,0 +1,1110 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_comp.h + * @author FMSH Application Team + * @brief Head file of COMP FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_COMP_H +#define __FM33LG0XX_FL_COMP_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup COMP COMP + * @brief COMP FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup COMP_FL_ES_INIT COMP Exported Init structures + * @{ + */ + +/** + * @brief FL COMP Init Sturcture definition + */ +typedef struct +{ + /** 比较器正向输入选择 */ + uint32_t positiveInput; + /** 比较器反向输入选择 */ + uint32_t negativeInput; + /** 结果输出极性 */ + uint32_t polarity; + /** 中断触发边沿选择 */ + uint32_t edge; + /** 数字滤波器使能 */ + uint32_t digitalFilter; + /** 数字滤波器长度 */ + uint32_t digitalFilterLen; +} FL_COMP_InitTypeDef; +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup COMP_FL_Exported_Constants COMP Exported Constants + * @{ + */ + +#define COMP_CR_TRGOEN_Pos (24U) +#define COMP_CR_TRGOEN_Msk (0x1U << COMP_CR_TRGOEN_Pos) +#define COMP_CR_TRGOEN COMP_CR_TRGOEN_Msk + +#define COMP_CR_DFLEN_Pos (19U) +#define COMP_CR_DFLEN_Msk (0x1fU << COMP_CR_DFLEN_Pos) +#define COMP_CR_DFLEN COMP_CR_DFLEN_Msk + +#define COMP_CR_WINMODE_Pos (18U) +#define COMP_CR_WINMODE_Msk (0x1U << COMP_CR_WINMODE_Pos) +#define COMP_CR_WINMODE COMP_CR_WINMODE_Msk + +#define COMP_CR_POLAR_Pos (17U) +#define COMP_CR_POLAR_Msk (0x1U << COMP_CR_POLAR_Pos) +#define COMP_CR_POLAR COMP_CR_POLAR_Msk + +#define COMP_CR_DFEN_Pos (16U) +#define COMP_CR_DFEN_Msk (0x1U << COMP_CR_DFEN_Pos) +#define COMP_CR_DFEN COMP_CR_DFEN_Msk + +#define COMP_CR_MODE_Pos (14U) +#define COMP_CR_MODE_Msk (0x3U << COMP_CR_MODE_Pos) +#define COMP_CR_MODE COMP_CR_MODE_Msk + +#define COMP_CR_CMPO_Pos (8U) +#define COMP_CR_CMPO_Msk (0x1U << COMP_CR_CMPO_Pos) +#define COMP_CR_CMPO COMP_CR_CMPO_Msk + +#define COMP_CR_VPSEL_Pos (4U) +#define COMP_CR_VPSEL_Msk (0x7U << COMP_CR_VPSEL_Pos) +#define COMP_CR_VPSEL COMP_CR_VPSEL_Msk + +#define COMP_CR_VNSEL_Pos (1U) +#define COMP_CR_VNSEL_Msk (0x7U << COMP_CR_VNSEL_Pos) +#define COMP_CR_VNSEL COMP_CR_VNSEL_Msk + +#define COMP_CR_CMPEN_Pos (0U) +#define COMP_CR_CMPEN_Msk (0x1U << COMP_CR_CMPEN_Pos) +#define COMP_CR_CMPEN COMP_CR_CMPEN_Msk + +#define COMP_ICR_OWW_IE_Pos (25U) +#define COMP_ICR_OWW_IE_Msk (0x1U << COMP_ICR_OWW_IE_Pos) +#define COMP_ICR_OWW_IE COMP_ICR_OWW_IE_Msk + +#define COMP_ICR_WIN_IE_Pos (24U) +#define COMP_ICR_WIN_IE_Msk (0x1U << COMP_ICR_WIN_IE_Pos) +#define COMP_ICR_WIN_IE COMP_ICR_WIN_IE_Msk + +#define COMP_ICR_CMP3SEL_Pos (18U) +#define COMP_ICR_CMP3SEL_Msk (0x3U << COMP_ICR_CMP3SEL_Pos) +#define COMP_ICR_CMP3SEL COMP_ICR_CMP3SEL_Msk + +#define COMP_ICR_CMP3IE_Pos (16U) +#define COMP_ICR_CMP3IE_Msk (0x1U << COMP_ICR_CMP3IE_Pos) +#define COMP_ICR_CMP3IE COMP_ICR_CMP3IE_Msk + +#define COMP_ICR_CMP2SEL_Pos (10U) +#define COMP_ICR_CMP2SEL_Msk (0x3U << COMP_ICR_CMP2SEL_Pos) +#define COMP_ICR_CMP2SEL COMP_ICR_CMP2SEL_Msk + +#define COMP_ICR_CMP2IE_Pos (8U) +#define COMP_ICR_CMP2IE_Msk (0x1U << COMP_ICR_CMP2IE_Pos) +#define COMP_ICR_CMP2IE COMP_ICR_CMP2IE_Msk + +#define COMP_ICR_CMP1SEL_Pos (2U) +#define COMP_ICR_CMP1SEL_Msk (0x3U << COMP_ICR_CMP1SEL_Pos) +#define COMP_ICR_CMP1SEL COMP_ICR_CMP1SEL_Msk + +#define COMP_ICR_CMP1IE_Pos (0U) +#define COMP_ICR_CMP1IE_Msk (0x1U << COMP_ICR_CMP1IE_Pos) +#define COMP_ICR_CMP1IE COMP_ICR_CMP1IE_Msk + +#define COMP_ISR_OOW_IF_Pos (4U) +#define COMP_ISR_OOW_IF_Msk (0x1U << COMP_ISR_OOW_IF_Pos) +#define COMP_ISR_OOW_IF COMP_ISR_OOW_IF_Msk + +#define COMP_ISR_WIN_IF_Pos (3U) +#define COMP_ISR_WIN_IF_Msk (0x1U << COMP_ISR_WIN_IF_Pos) +#define COMP_ISR_WIN_IF COMP_ISR_WIN_IF_Msk + +#define COMP_ISR_CMP3IF_Pos (2U) +#define COMP_ISR_CMP3IF_Msk (0x1U << COMP_ISR_CMP3IF_Pos) +#define COMP_ISR_CMP3IF COMP_ISR_CMP3IF_Msk + +#define COMP_ISR_CMP2IF_Pos (1U) +#define COMP_ISR_CMP2IF_Msk (0x1U << COMP_ISR_CMP2IF_Pos) +#define COMP_ISR_CMP2IF COMP_ISR_CMP2IF_Msk + +#define COMP_ISR_CMP1IF_Pos (0U) +#define COMP_ISR_CMP1IF_Msk (0x1U << COMP_ISR_CMP1IF_Pos) +#define COMP_ISR_CMP1IF COMP_ISR_CMP1IF_Msk + +#define COMP_BUFCR_BUFBYP_Pos (2U) +#define COMP_BUFCR_BUFBYP_Msk (0x1U << COMP_BUFCR_BUFBYP_Pos) +#define COMP_BUFCR_BUFBYP COMP_BUFCR_BUFBYP_Msk + +#define COMP_BUFCR_BUFSEL_Pos (1U) +#define COMP_BUFCR_BUFSEL_Msk (0x1U << COMP_BUFCR_BUFSEL_Pos) +#define COMP_BUFCR_BUFSEL COMP_BUFCR_BUFSEL_Msk + +#define COMP_BUFCR_BUFENB_Pos (0U) +#define COMP_BUFCR_BUFENB_Msk (0x1U << COMP_BUFCR_BUFENB_Pos) +#define COMP_BUFCR_BUFENB COMP_BUFCR_BUFENB_Msk + + + + + + +#define FL_COMP_OUTPUT_FILTER_WINDOW_3APBCLK (0x0U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_4APBCLK (0x3U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_5APBCLK (0x4U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_6APBCLK (0x5U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_7APBCLK (0x6U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_8APBCLK (0x7U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_9APBCLK (0x8U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_10APBCLK (0x9U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_11APBCLK (0xaU << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_12APBCLK (0xbU << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_13APBCLK (0xcU << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_14APBCLK (0xdU << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_15APBCLK (0xeU << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_16APBCLK (0xfU << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_17APBCLK (0x10U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_18APBCLK (0x11U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_19APBCLK (0x12U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_20APBCLK (0x13U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_21APBCLK (0x14U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_22APBCLK (0x15U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_23APBCLK (0x16U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_24APBCLK (0x17U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_25APBCLK (0x18U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_26APBCLK (0x19U << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_27APBCLK (0x1aU << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_28APBCLK (0x1bU << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_29APBCLK (0x1cU << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_30APBCLK (0x1dU << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_31APBCLK (0x1eU << COMP_CR_DFLEN_Pos) +#define FL_COMP_OUTPUT_FILTER_WINDOW_32APBCLK (0x1fU << COMP_CR_DFLEN_Pos) + + +#define FL_COMP_OUTPUT_POLARITY_NORMAL (0x0U << COMP_CR_POLAR_Pos) +#define FL_COMP_OUTPUT_POLARITY_INVERT (0x1U << COMP_CR_POLAR_Pos) + + +#define FL_COMP_POWER_MODE_LOW (0x0U << COMP_CR_MODE_Pos) +#define FL_COMP_POWER_MODE_MEDIUM (0x1U << COMP_CR_MODE_Pos) +#define FL_COMP_POWER_MODE_HIGH (0x2U << COMP_CR_MODE_Pos) + + +#define FL_COMP_OUTPUT_LOW (0x0U << COMP_CR_CMPO_Pos) +#define FL_COMP_OUTPUT_HIGH (0x1U << COMP_CR_CMPO_Pos) + +#define FL_COMP_INP_SOURCE_INP1 (0x0U << COMP_CR_VPSEL_Pos) +#define FL_COMP_INP_SOURCE_INP2 (0x1U << COMP_CR_VPSEL_Pos) +#define FL_COMP_INP_SOURCE_AVREF (0x2U << COMP_CR_VPSEL_Pos) +#define FL_COMP_INP_SOURCE_ULPBG_REF (0x3U << COMP_CR_VPSEL_Pos) +#define FL_COMP_INP_SOURCE_VDD15 (0x4U << COMP_CR_VPSEL_Pos) +#define FL_COMP_INP_SOURCE_VREFP (0x5U << COMP_CR_VPSEL_Pos) + + +#define FL_COMP_INN_SOURCE_INN1 (0x0U << COMP_CR_VNSEL_Pos) +#define FL_COMP_INN_SOURCE_INN2 (0x1U << COMP_CR_VNSEL_Pos) +#define FL_COMP_INN_SOURCE_VREF (0x2U << COMP_CR_VNSEL_Pos) +#define FL_COMP_INN_SOURCE_VREF_DIV_2 (0x3U << COMP_CR_VNSEL_Pos) +#define FL_COMP_INN_SOURCE_VREFP (0x4U << COMP_CR_VNSEL_Pos) +#define FL_COMP_INN_SOURCE_DAC (0x5U << COMP_CR_VNSEL_Pos) + + +#define FL_COMP_COMP3_INTERRUPT_EDGE_BOTH (0x0U << COMP_ICR_CMP3SEL_Pos) +#define FL_COMP_COMP3_INTERRUPT_EDGE_RISING (0x1U << COMP_ICR_CMP3SEL_Pos) +#define FL_COMP_COMP3_INTERRUPT_EDGE_FALLING (0x2U << COMP_ICR_CMP3SEL_Pos) + + +#define FL_COMP_COMP2_INTERRUPT_EDGE_BOTH (0x0U << COMP_ICR_CMP2SEL_Pos) +#define FL_COMP_COMP2_INTERRUPT_EDGE_RISING (0x1U << COMP_ICR_CMP2SEL_Pos) +#define FL_COMP_COMP2_INTERRUPT_EDGE_FALLING (0x2U << COMP_ICR_CMP2SEL_Pos) + + +#define FL_COMP_COMP1_INTERRUPT_EDGE_BOTH (0x0U << COMP_ICR_CMP1SEL_Pos) +#define FL_COMP_COMP1_INTERRUPT_EDGE_RISING (0x1U << COMP_ICR_CMP1SEL_Pos) +#define FL_COMP_COMP1_INTERRUPT_EDGE_FALLING (0x2U << COMP_ICR_CMP1SEL_Pos) + +#define FL_COMP_INTERRUPT_EDGE_BOTH (0x0U) +#define FL_COMP_INTERRUPT_EDGE_RISING (0x1U) +#define FL_COMP_INTERRUPT_EDGE_FALLING (0x2U) + +#define FL_COMP_BUFF_REFERENCE_AVREF (0x0U << COMP_BUFCR_BUFSEL_Pos) +#define FL_COMP_BUFF_REFERENCE_VREF1P2 (0x1U << COMP_BUFCR_BUFSEL_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup COMP_FL_Exported_Functions COMP Exported Functions + * @{ + */ + +/** + * @brief COMPx trigger output enable + * @rmtoll CR TRGOEN FL_COMP_EnableTriggerOutput + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_EnableTriggerOutput(COMP_Type *COMPx) +{ + SET_BIT(COMPx->CR, COMP_CR_TRGOEN_Msk); +} + +/** + * @brief Get COMPx trigger output enable status + * @rmtoll CR TRGOEN FL_COMP_IsEnabledTriggerOutput + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsEnabledTriggerOutput(COMP_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->CR, COMP_CR_TRGOEN_Msk) == COMP_CR_TRGOEN_Msk); +} + +/** + * @brief COMPx trigger output disable + * @rmtoll CR TRGOEN FL_COMP_DisableTriggerOutput + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_DisableTriggerOutput(COMP_Type *COMPx) +{ + CLEAR_BIT(COMPx->CR, COMP_CR_TRGOEN_Msk); +} + +/** + * @brief Set COMPx Output Digital Filter Length + * @rmtoll CR DFLEN FL_COMP_SetOutputFilterWindow + * @param COMPx COMP instance + * @param length This parameter can be one of the following values: + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_3APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_4APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_5APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_6APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_7APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_8APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_9APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_10APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_11APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_12APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_13APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_14APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_15APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_16APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_17APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_18APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_19APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_20APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_21APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_22APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_23APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_24APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_25APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_26APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_27APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_28APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_29APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_30APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_31APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_32APBCLK + * @retval None + */ +__STATIC_INLINE void FL_COMP_SetOutputFilterWindow(COMP_Type *COMPx, uint32_t length) +{ + MODIFY_REG(COMPx->CR, COMP_CR_DFLEN_Msk, length); +} + +/** + * @brief Get COMPx Output Digital Filter Length + * @rmtoll CR DFLEN FL_COMP_GetOutputFilterWindow + * @param COMPx COMP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_3APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_4APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_5APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_6APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_7APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_8APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_9APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_10APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_11APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_12APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_13APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_14APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_15APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_16APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_17APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_18APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_19APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_20APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_21APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_22APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_23APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_24APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_25APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_26APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_27APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_28APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_29APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_30APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_31APBCLK + * @arg @ref FL_COMP_OUTPUT_FILTER_WINDOW_32APBCLK + */ +__STATIC_INLINE uint32_t FL_COMP_GetOutputFilterWindow(COMP_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->CR, COMP_CR_DFLEN_Msk)); +} + +/** + * @brief COMPx Window Mode enable + * @rmtoll CR WINMODE FL_COMP_EnableWindowMode + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_EnableWindowMode(COMP_Type *COMPx) +{ + SET_BIT(COMPx->CR, COMP_CR_WINMODE_Msk); +} + +/** + * @brief Get COMPx Window Mode enable status + * @rmtoll CR WINMODE FL_COMP_IsEnabledWindowMode + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsEnabledWindowMode(COMP_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->CR, COMP_CR_WINMODE_Msk) == COMP_CR_WINMODE_Msk); +} + +/** + * @brief COMPx Window Mode disable + * @rmtoll CR WINMODE FL_COMP_DisableWindowMode + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_DisableWindowMode(COMP_Type *COMPx) +{ + CLEAR_BIT(COMPx->CR, COMP_CR_WINMODE_Msk); +} + +/** + * @brief Set COMPx output polarity + * @rmtoll CR POLAR FL_COMP_SetOutputPolarity + * @param COMPx COMP instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_COMP_OUTPUT_POLARITY_NORMAL + * @arg @ref FL_COMP_OUTPUT_POLARITY_INVERT + * @retval None + */ +__STATIC_INLINE void FL_COMP_SetOutputPolarity(COMP_Type *COMPx, uint32_t polarity) +{ + MODIFY_REG(COMPx->CR, COMP_CR_POLAR_Msk, polarity); +} + +/** + * @brief Get COMPx output polarity + * @rmtoll CR POLAR FL_COMP_GetOutputPolarity + * @param COMPx COMP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_COMP_OUTPUT_POLARITY_NORMAL + * @arg @ref FL_COMP_OUTPUT_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_COMP_GetOutputPolarity(COMP_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->CR, COMP_CR_POLAR_Msk)); +} + +/** + * @brief COMPx DigitalFilter enable + * @rmtoll CR DFEN FL_COMP_EnableOutputFilter + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_EnableOutputFilter(COMP_Type *COMPx) +{ + SET_BIT(COMPx->CR, COMP_CR_DFEN_Msk); +} + +/** + * @brief Get COMPx DigitalFilter enable status + * @rmtoll CR DFEN FL_COMP_IsEnabledOutputFilter + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsEnabledOutputFilter(COMP_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->CR, COMP_CR_DFEN_Msk) == COMP_CR_DFEN_Msk); +} + +/** + * @brief COMPx DigitalFilter disable + * @rmtoll CR DFEN FL_COMP_DisableOutputFilter + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_DisableOutputFilter(COMP_Type *COMPx) +{ + CLEAR_BIT(COMPx->CR, COMP_CR_DFEN_Msk); +} + +/** + * @brief Set COMPx Power mode + * @rmtoll CR MODE FL_COMP_SetPowerMode + * @param COMPx COMP instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_COMP_POWER_MODE_LOW + * @arg @ref FL_COMP_POWER_MODE_MEDIUM + * @arg @ref FL_COMP_POWER_MODE_HIGH + * @retval None + */ +__STATIC_INLINE void FL_COMP_SetPowerMode(COMP_Type *COMPx, uint32_t mode) +{ + MODIFY_REG(COMPx->CR, COMP_CR_MODE_Msk, mode); +} + +/** + * @brief Get COMPx Power mode + * @rmtoll CR MODE FL_COMP_GetPowerMode + * @param COMPx COMP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_COMP_POWER_MODE_LOW + * @arg @ref FL_COMP_POWER_MODE_MEDIUM + * @arg @ref FL_COMP_POWER_MODE_HIGH + */ +__STATIC_INLINE uint32_t FL_COMP_GetPowerMode(COMP_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->CR, COMP_CR_MODE_Msk)); +} + +/** + * @brief Get comparator output channel + * @rmtoll CR CMPO FL_COMP_GetOutput + * @param COMPx COMP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_COMP_OUTPUT_LOW + * @arg @ref FL_COMP_OUTPUT_HIGH + */ +__STATIC_INLINE uint32_t FL_COMP_GetOutput(COMP_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->CR, COMP_CR_CMPO_Msk)); +} + +/** + * @brief Set COMPx positive input + * @rmtoll CR VPSEL FL_COMP_SetINPSource + * @param COMPx COMP instance + * @param source This parameter can be one of the following values: + * @arg @ref FL_COMP_INP_SOURCE_INP1 + * @arg @ref FL_COMP_INP_SOURCE_INP2 + * @arg @ref FL_COMP_INP_SOURCE_AVREF + * @arg @ref FL_COMP_INP_SOURCE_ULPBG_AREF + * @arg @ref FL_COMP_INP_SOURCE_VDD15 + * @arg @ref FL_COMP_INP_SOURCE_VREFP + * @retval None + */ +__STATIC_INLINE void FL_COMP_SetINPSource(COMP_Type *COMPx, uint32_t source) +{ + MODIFY_REG(COMPx->CR, COMP_CR_VPSEL_Msk, source); +} + +/** + * @brief Get COMPx positive input status + * @rmtoll CR VPSEL FL_COMP_GetINPSource + * @param COMPx COMP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_COMP_INP_SOURCE_INP1 + * @arg @ref FL_COMP_INP_SOURCE_INP2 + * @arg @ref FL_COMP_INP_SOURCE_AVREF + * @arg @ref FL_COMP_INP_SOURCE_ULPBG_AREF + * @arg @ref FL_COMP_INP_SOURCE_VDD15 + * @arg @ref FL_COMP_INP_SOURCE_VREFP + */ +__STATIC_INLINE uint32_t FL_COMP_GetINPSource(COMP_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->CR, COMP_CR_VPSEL_Msk)); +} + +/** + * @brief Set COMPx negative input + * @rmtoll CR VNSEL FL_COMP_SetINNSource + * @param COMPx COMP instance + * @param source This parameter can be one of the following values: + * @arg @ref FL_COMP_INN_SOURCE_INN1 + * @arg @ref FL_COMP_INN_SOURCE_INN2 + * @arg @ref FL_COMP_INN_SOURCE_VREF + * @arg @ref FL_COMP_INN_SOURCE_VREF_DIV_2 + * @arg @ref FL_COMP_INN_SOURCE_VREFP + * @arg @ref FL_COMP_INN_SOURCE_DAC + * @retval None + */ +__STATIC_INLINE void FL_COMP_SetINNSource(COMP_Type *COMPx, uint32_t source) +{ + MODIFY_REG(COMPx->CR, COMP_CR_VNSEL_Msk, source); +} + +/** + * @brief Get COMPx negative input status + * @rmtoll CR VNSEL FL_COMP_GetINNSource + * @param COMPx COMP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_COMP_INN_SOURCE_INN1 + * @arg @ref FL_COMP_INN_SOURCE_INN2 + * @arg @ref FL_COMP_INN_SOURCE_VREF + * @arg @ref FL_COMP_INN_SOURCE_VREF_DIV_2 + * @arg @ref FL_COMP_INN_SOURCE_VREFP + * @arg @ref FL_COMP_INN_SOURCE_DAC + */ +__STATIC_INLINE uint32_t FL_COMP_GetINNSource(COMP_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->CR, COMP_CR_VNSEL_Msk)); +} + +/** + * @brief COMPx enable + * @rmtoll CR CMPEN FL_COMP_Enable + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_Enable(COMP_Type *COMPx) +{ + SET_BIT(COMPx->CR, COMP_CR_CMPEN_Msk); +} + +/** + * @brief Get COMPx enable status + * @rmtoll CR CMPEN FL_COMP_IsEnabled + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsEnabled(COMP_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->CR, COMP_CR_CMPEN_Msk) == COMP_CR_CMPEN_Msk); +} + +/** + * @brief COMPx disable + * @rmtoll CR CMPEN FL_COMP_Disable + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_Disable(COMP_Type *COMPx) +{ + CLEAR_BIT(COMPx->CR, COMP_CR_CMPEN_Msk); +} + +/** + * @brief Comparator Out Of Window interrupt enable + * @rmtoll ICR OWW_IE FL_COMP_EnableIT_OutOfWindow + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_EnableIT_OutOfWindow(COMP_COMMON_Type *COMPx) +{ + SET_BIT(COMPx->ICR, COMP_ICR_OWW_IE_Msk); +} + +/** + * @brief Get Comparator Out Of Window interrupt enable status + * @rmtoll ICR OWW_IE FL_COMP_IsEnabledIT_OutOfWindow + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsEnabledIT_OutOfWindow(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ICR, COMP_ICR_OWW_IE_Msk) == COMP_ICR_OWW_IE_Msk); +} + +/** + * @brief Comparator Out Of Window interrupt disable + * @rmtoll ICR OWW_IE FL_COMP_DisableIT_OutOfWindow + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_DisableIT_OutOfWindow(COMP_COMMON_Type *COMPx) +{ + CLEAR_BIT(COMPx->ICR, COMP_ICR_OWW_IE_Msk); +} + +/** + * @brief Comparator Across Window interrupt enable + * @rmtoll ICR WIN_IE FL_COMP_EnableIT_AcrossWindowThreshold + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_EnableIT_AcrossWindowThreshold(COMP_COMMON_Type *COMPx) +{ + SET_BIT(COMPx->ICR, COMP_ICR_WIN_IE_Msk); +} + +/** + * @brief Get comparator Across Window interrupt enable status + * @rmtoll ICR WIN_IE FL_COMP_IsEnabledIT_AcrossWindowThreshold + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsEnabledIT_AcrossWindowThreshold(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ICR, COMP_ICR_WIN_IE_Msk) == COMP_ICR_WIN_IE_Msk); +} + +/** + * @brief Comparator Across Window interrupt disable + * @rmtoll ICR WIN_IE FL_COMP_DisableIT_AcrossWindowThreshold + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_DisableIT_AcrossWindowThreshold(COMP_COMMON_Type *COMPx) +{ + CLEAR_BIT(COMPx->ICR, COMP_ICR_WIN_IE_Msk); +} + +/** + * @brief Set comparator3 interrupt edge + * @rmtoll ICR CMP3SEL FL_COMP_SetComparator3InterruptEdge + * @param COMPx COMP instance + * @param edge This parameter can be one of the following values: + * @arg @ref FL_COMP_COMP3_INTERRUPT_EDGE_BOTH + * @arg @ref FL_COMP_COMP3_INTERRUPT_EDGE_RISING + * @arg @ref FL_COMP_COMP3_INTERRUPT_EDGE_FALLING + * @retval None + */ +__STATIC_INLINE void FL_COMP_SetComparator3InterruptEdge(COMP_COMMON_Type *COMPx, uint32_t edge) +{ + MODIFY_REG(COMPx->ICR, COMP_ICR_CMP3SEL_Msk, edge); +} + +/** + * @brief Get comparator3 interrupt edge + * @rmtoll ICR CMP3SEL FL_COMP_GetComparator3InterruptEdge + * @param COMPx COMP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_COMP_COMP3_INTERRUPT_EDGE_BOTH + * @arg @ref FL_COMP_COMP3_INTERRUPT_EDGE_RISING + * @arg @ref FL_COMP_COMP3_INTERRUPT_EDGE_FALLING + */ +__STATIC_INLINE uint32_t FL_COMP_GetComparator3InterruptEdge(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ICR, COMP_ICR_CMP3SEL_Msk)); +} + +/** + * @brief Comparator3 interrupt enable + * @rmtoll ICR CMP3IE FL_COMP_EnableIT_Comparator3 + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_EnableIT_Comparator3(COMP_COMMON_Type *COMPx) +{ + SET_BIT(COMPx->ICR, COMP_ICR_CMP3IE_Msk); +} + +/** + * @brief Get comparator3 interrupt enable status + * @rmtoll ICR CMP3IE FL_COMP_IsEnabledIT_Comparator3 + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsEnabledIT_Comparator3(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ICR, COMP_ICR_CMP3IE_Msk) == COMP_ICR_CMP3IE_Msk); +} + +/** + * @brief Comparator3 interrupt disable + * @rmtoll ICR CMP3IE FL_COMP_DisableIT_Comparator3 + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_DisableIT_Comparator3(COMP_COMMON_Type *COMPx) +{ + CLEAR_BIT(COMPx->ICR, COMP_ICR_CMP3IE_Msk); +} + +/** + * @brief Set comparator2 interrupt edge + * @rmtoll ICR CMP2SEL FL_COMP_SetComparator2InterruptEdge + * @param COMPx COMP instance + * @param edge This parameter can be one of the following values: + * @arg @ref FL_COMP_COMP2_INTERRUPT_EDGE_BOTH + * @arg @ref FL_COMP_COMP2_INTERRUPT_EDGE_RISING + * @arg @ref FL_COMP_COMP2_INTERRUPT_EDGE_FALLING + * @retval None + */ +__STATIC_INLINE void FL_COMP_SetComparator2InterruptEdge(COMP_COMMON_Type *COMPx, uint32_t edge) +{ + MODIFY_REG(COMPx->ICR, COMP_ICR_CMP2SEL_Msk, edge); +} + +/** + * @brief Get comparator2 interrupt edge + * @rmtoll ICR CMP2SEL FL_COMP_GetComparator2InterruptEdge + * @param COMPx COMP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_COMP_COMP2_INTERRUPT_EDGE_BOTH + * @arg @ref FL_COMP_COMP2_INTERRUPT_EDGE_RISING + * @arg @ref FL_COMP_COMP2_INTERRUPT_EDGE_FALLING + */ +__STATIC_INLINE uint32_t FL_COMP_GetComparator2InterruptEdge(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ICR, COMP_ICR_CMP2SEL_Msk)); +} + +/** + * @brief Comparator2 interrupt enable + * @rmtoll ICR CMP2IE FL_COMP_EnableIT_Comparator2 + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_EnableIT_Comparator2(COMP_COMMON_Type *COMPx) +{ + SET_BIT(COMPx->ICR, COMP_ICR_CMP2IE_Msk); +} + +/** + * @brief Get comparator2 interrupt enable status + * @rmtoll ICR CMP2IE FL_COMP_IsEnabledIT_Comparator2 + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsEnabledIT_Comparator2(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ICR, COMP_ICR_CMP2IE_Msk) == COMP_ICR_CMP2IE_Msk); +} + +/** + * @brief Comparator2 interrupt disable + * @rmtoll ICR CMP2IE FL_COMP_DisableIT_Comparator2 + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_DisableIT_Comparator2(COMP_COMMON_Type *COMPx) +{ + CLEAR_BIT(COMPx->ICR, COMP_ICR_CMP2IE_Msk); +} + +/** + * @brief Set comparator1 interrupt edge + * @rmtoll ICR CMP1SEL FL_COMP_SetComparator1InterruptEdge + * @param COMPx COMP instance + * @param edge This parameter can be one of the following values: + * @arg @ref FL_COMP_COMP1_INTERRUPT_EDGE_BOTH + * @arg @ref FL_COMP_COMP1_INTERRUPT_EDGE_RISING + * @arg @ref FL_COMP_COMP1_INTERRUPT_EDGE_FALLING + * @retval None + */ +__STATIC_INLINE void FL_COMP_SetComparator1InterruptEdge(COMP_COMMON_Type *COMPx, uint32_t edge) +{ + MODIFY_REG(COMPx->ICR, COMP_ICR_CMP1SEL_Msk, edge); +} + +/** + * @brief Get comparator1 interrupt edge + * @rmtoll ICR CMP1SEL FL_COMP_GetComparator1InterruptEdge + * @param COMPx COMP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_COMP_COMP1_INTERRUPT_EDGE_BOTH + * @arg @ref FL_COMP_COMP1_INTERRUPT_EDGE_RISING + * @arg @ref FL_COMP_COMP1_INTERRUPT_EDGE_FALLING + */ +__STATIC_INLINE uint32_t FL_COMP_GetComparator1InterruptEdge(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ICR, COMP_ICR_CMP1SEL_Msk)); +} + +/** + * @brief Comparator1 interrupt enable + * @rmtoll ICR CMP1IE FL_COMP_EnableIT_Comparator1 + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_EnableIT_Comparator1(COMP_COMMON_Type *COMPx) +{ + SET_BIT(COMPx->ICR, COMP_ICR_CMP1IE_Msk); +} + +/** + * @brief Get comparator1 interrupt enable status + * @rmtoll ICR CMP1IE FL_COMP_IsEnabledIT_Comparator1 + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsEnabledIT_Comparator1(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ICR, COMP_ICR_CMP1IE_Msk) == COMP_ICR_CMP1IE_Msk); +} + +/** + * @brief Comparator1 interrupt disable + * @rmtoll ICR CMP1IE FL_COMP_DisableIT_Comparator1 + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_DisableIT_Comparator1(COMP_COMMON_Type *COMPx) +{ + CLEAR_BIT(COMPx->ICR, COMP_ICR_CMP1IE_Msk); +} + +/** + * @brief Get outof window interrupt flag + * @rmtoll ISR OOW_IF FL_COMP_IsActiveFlag_OutOfWindow + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsActiveFlag_OutOfWindow(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ISR, COMP_ISR_OOW_IF_Msk) == (COMP_ISR_OOW_IF_Msk)); +} + +/** + * @brief Clear outof window interrupt flag + * @rmtoll ISR OOW_IF FL_COMP_ClearFlag_OutOfWindow + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_ClearFlag_OutOfWindow(COMP_COMMON_Type *COMPx) +{ + WRITE_REG(COMPx->ISR, COMP_ISR_OOW_IF_Msk); +} + +/** + * @brief Get across window interrupt flag + * @rmtoll ISR WIN_IF FL_COMP_IsActiveFlag_AcrossWindowThreshold + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsActiveFlag_AcrossWindowThreshold(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ISR, COMP_ISR_WIN_IF_Msk) == (COMP_ISR_WIN_IF_Msk)); +} + +/** + * @brief Clear across window interrupt flag + * @rmtoll ISR WIN_IF FL_COMP_ClearFlag_AcrossWindowThreshold + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_ClearFlag_AcrossWindowThreshold(COMP_COMMON_Type *COMPx) +{ + WRITE_REG(COMPx->ISR, COMP_ISR_WIN_IF_Msk); +} + +/** + * @brief Get comparator3 interrupt flag + * @rmtoll ISR CMP3IF FL_COMP_IsActiveFlag_Comparator3 + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsActiveFlag_Comparator3(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ISR, COMP_ISR_CMP3IF_Msk) == (COMP_ISR_CMP3IF_Msk)); +} + +/** + * @brief Clear comparator3 interrupt flag + * @rmtoll ISR CMP3IF FL_COMP_ClearFlag_Comparator3 + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_ClearFlag_Comparator3(COMP_COMMON_Type *COMPx) +{ + WRITE_REG(COMPx->ISR, COMP_ISR_CMP3IF_Msk); +} + +/** + * @brief Get comparator2 interrupt flag + * @rmtoll ISR CMP2IF FL_COMP_IsActiveFlag_Comparator2 + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsActiveFlag_Comparator2(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ISR, COMP_ISR_CMP2IF_Msk) == (COMP_ISR_CMP2IF_Msk)); +} + +/** + * @brief Clear comparator2 interrupt flag + * @rmtoll ISR CMP2IF FL_COMP_ClearFlag_Comparator2 + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_ClearFlag_Comparator2(COMP_COMMON_Type *COMPx) +{ + WRITE_REG(COMPx->ISR, COMP_ISR_CMP2IF_Msk); +} + +/** + * @brief Get comparator1 interrupt flag + * @rmtoll ISR CMP1IF FL_COMP_IsActiveFlag_Comparator1 + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsActiveFlag_Comparator1(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->ISR, COMP_ISR_CMP1IF_Msk) == (COMP_ISR_CMP1IF_Msk)); +} + +/** + * @brief Clear comparator1 interrupt flag + * @rmtoll ISR CMP1IF FL_COMP_ClearFlag_Comparator1 + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_ClearFlag_Comparator1(COMP_COMMON_Type *COMPx) +{ + WRITE_REG(COMPx->ISR, COMP_ISR_CMP1IF_Msk); +} + +/** + * @brief COMPx bypass buffer enable + * @rmtoll BUFCR BUFBYP FL_COMP_EnableBufferBypass + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_EnableBufferBypass(COMP_COMMON_Type *COMPx) +{ + SET_BIT(COMPx->BUFCR, COMP_BUFCR_BUFBYP_Msk); +} + +/** + * @brief Get COMPx bypass buffer enable status + * @rmtoll BUFCR BUFBYP FL_COMP_IsEnabledBufferBypass + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsEnabledBufferBypass(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->BUFCR, COMP_BUFCR_BUFBYP_Msk) == COMP_BUFCR_BUFBYP_Msk); +} + +/** + * @brief COMPx bypass buffer disable + * @rmtoll BUFCR BUFBYP FL_COMP_DisableBufferBypass + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_DisableBufferBypass(COMP_COMMON_Type *COMPx) +{ + CLEAR_BIT(COMPx->BUFCR, COMP_BUFCR_BUFBYP_Msk); +} + +/** + * @brief Set COMPx buffer select + * @rmtoll BUFCR BUFSEL FL_COMP_SetBufferReference + * @param COMPx COMP instance + * @param select This parameter can be one of the following values: + * @arg @ref FL_COMP_BUFF_REFERENCE_VREF1P2 + * @arg @ref FL_COMP_BUFF_REFERENCE_AVREF + * @retval None + */ +__STATIC_INLINE void FL_COMP_SetBufferReference(COMP_COMMON_Type *COMPx, uint32_t select) +{ + MODIFY_REG(COMPx->BUFCR, COMP_BUFCR_BUFSEL_Msk, select); +} + +/** + * @brief Get COMPx buffer select + * @rmtoll BUFCR BUFSEL FL_COMP_GetBufferReference + * @param COMPx COMP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_COMP_BUFF_REFERENCE_VREF1P2 + * @arg @ref FL_COMP_BUFF_REFERENCE_AVREF + */ +__STATIC_INLINE uint32_t FL_COMP_GetBufferReference(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->BUFCR, COMP_BUFCR_BUFSEL_Msk)); +} + +/** + * @brief COMPx close buffer enable + * @rmtoll BUFCR BUFENB FL_COMP_EnableBuffer + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_EnableBuffer(COMP_COMMON_Type *COMPx) +{ + CLEAR_BIT(COMPx->BUFCR, COMP_BUFCR_BUFENB_Msk); +} + +/** + * @brief Get COMPx close buffer enable status + * @rmtoll BUFCR BUFENB FL_COMP_IsEnabledBuffer + * @param COMPx COMP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_COMP_IsEnabledBuffer(COMP_COMMON_Type *COMPx) +{ + return (uint32_t)(READ_BIT(COMPx->BUFCR, COMP_BUFCR_BUFENB_Msk) == COMP_BUFCR_BUFENB_Msk); +} + +/** + * @brief COMPx close buffer disable + * @rmtoll BUFCR BUFENB FL_COMP_DisableBuffer + * @param COMPx COMP instance + * @retval None + */ +__STATIC_INLINE void FL_COMP_DisableBuffer(COMP_COMMON_Type *COMPx) +{ + SET_BIT(COMPx->BUFCR, COMP_BUFCR_BUFENB_Msk); +} + +/** + * @} + */ + +/** @defgroup COMP_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_COMP_DeInit(COMP_Type *COMPx); +void FL_COMP_StructInit(FL_COMP_InitTypeDef *initStruct); +FL_ErrorStatus FL_COMP_Init(COMP_Type *COMPx, FL_COMP_InitTypeDef *initStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_COMP_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-14*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_conf.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_conf.h new file mode 100644 index 0000000..a31fdee --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_conf.h @@ -0,0 +1,221 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_conf.h + * @author FMSH Application Team + * @brief Header file of FL Driver Library Configurations + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion --------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_CONF_H +#define __FM33LG0XX_FL_CONF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Defines -------------------------------------------------------------------------------------------*/ + +/** + * @brief List of drivers to be used. + * + * @note Uncomment following lines to disable specified driver. + */ +#define FL_ADC_DRIVER_ENABLED +#define FL_AES_DRIVER_ENABLED +#define FL_ATIM_DRIVER_ENABLED +#define FL_BSTIM16_DRIVER_ENABLED +#define FL_BSTIM32_DRIVER_ENABLED +#define FL_CAN_DRIVER_ENABLED +#define FL_CDIF_DRIVER_ENABLED +#define FL_CMU_DRIVER_ENABLED +#define FL_COMP_DRIVER_ENABLED +#define FL_CRC_DRIVER_ENABLED +#define FL_DAC_DRIVER_ENABLED +#define FL_DIVAS_DRIVER_ENABLED +#define FL_DMA_DRIVER_ENABLED +#define FL_EXTI_DRIVER_ENABLED +#define FL_FLASH_DRIVER_ENABLED +#define FL_GPIO_DRIVER_ENABLED +#define FL_GPTIM_DRIVER_ENABLED +#define FL_I2C_DRIVER_ENABLED +#define FL_IWDT_DRIVER_ENABLED +#define FL_LCD_DRIVER_ENABLED +#define FL_LPTIM16_DRIVER_ENABLED +#define FL_LPTIM32_DRIVER_ENABLED +#define FL_LPUART_DRIVER_ENABLED +#define FL_PMU_DRIVER_ENABLED +#define FL_RMU_DRIVER_ENABLED +#define FL_RNG_DRIVER_ENABLED +#define FL_RTCA_DRIVER_ENABLED +#define FL_SPI_DRIVER_ENABLED +#define FL_SVD_DRIVER_ENABLED +#define FL_UART_DRIVER_ENABLED +#define FL_VAO_DRIVER_ENABLED +#define FL_VREF_DRIVER_ENABLED +#define FL_VREFP_DRIVER_ENABLED +#define FL_WWDT_DRIVER_ENABLED + +/* Device Includes ------------------------------------------------------------------------------------*/ +/** + * @brief Include peripheral's header file + */ + +#if defined(FL_ADC_DRIVER_ENABLED) +#include "fm33lg0xx_fl_adc.h" +#endif /* FL_ADC_DRIVER_ENABLED */ + +#if defined(FL_AES_DRIVER_ENABLED) +#include "fm33lg0xx_fl_aes.h" +#endif /* FL_AES_DRIVER_ENABLED */ + +#if defined(FL_ATIM_DRIVER_ENABLED) +#include "fm33lg0xx_fl_atim.h" +#endif /* FL_ATIM_DRIVER_ENABLED */ + +#if defined(FL_BSTIM16_DRIVER_ENABLED) +#include "fm33lg0xx_fl_bstim16.h" +#endif /* FL_BSTIM16_DRIVER_ENABLED */ + +#if defined(FL_BSTIM32_DRIVER_ENABLED) +#include "fm33lg0xx_fl_bstim32.h" +#endif /* FL_BSTIM32_DRIVER_ENABLED */ + +#if defined(FL_CAN_DRIVER_ENABLED) +#include "fm33lg0xx_fl_can.h" +#endif /* FL_CAN_DRIVER_ENABLED */ + +#if defined(FL_CDIF_DRIVER_ENABLED) +#include "fm33lg0xx_fl_cdif.h" +#endif /* FL_CDIF_DRIVER_ENABLED */ + +#if defined(FL_CMU_DRIVER_ENABLED) +#include "fm33lg0xx_fl_cmu.h" +#endif /* FL_CMU_DRIVER_ENABLED */ + +#if defined(FL_COMP_DRIVER_ENABLED) +#include "fm33lg0xx_fl_comp.h" +#endif /* FL_COMP_DRIVER_ENABLED */ + +#if defined(FL_CRC_DRIVER_ENABLED) +#include "fm33lg0xx_fl_crc.h" +#endif /* FL_CRC_DRIVER_ENABLED */ + +#if defined(FL_DAC_DRIVER_ENABLED) +#include "fm33lg0xx_fl_dac.h" +#endif /* FL_DAC_DRIVER_ENABLED */ + +#if defined(FL_DIVAS_DRIVER_ENABLED) +#include "fm33lg0xx_fl_divas.h" +#endif /* FL_DIVAS_DRIVER_ENABLED */ + +#if defined(FL_DMA_DRIVER_ENABLED) +#include "fm33lg0xx_fl_dma.h" +#endif /* FL_DMA_DRIVER_ENABLED */ + +#if defined(FL_EXTI_DRIVER_ENABLED) +#include "fm33lg0xx_fl_exti.h" +#endif /* FL_EXTI_DRIVER_ENABLED */ + +#if defined(FL_FLASH_DRIVER_ENABLED) +#include "fm33lg0xx_fl_flash.h" +#endif /* FL_FLASH_DRIVER_ENABLED */ + +#if defined(FL_GPIO_DRIVER_ENABLED) +#include "fm33lg0xx_fl_gpio.h" +#endif /* FL_GPIO_DRIVER_ENABLED */ + +#if defined(FL_GPTIM_DRIVER_ENABLED) +#include "fm33lg0xx_fl_gptim.h" +#endif /* FL_GPTIM_DRIVER_ENABLED */ + +#if defined(FL_I2C_DRIVER_ENABLED) +#include "fm33lg0xx_fl_i2c.h" +#endif /* FL_I2C_DRIVER_ENABLED */ + +#if defined(FL_IWDT_DRIVER_ENABLED) +#include "fm33lg0xx_fl_iwdt.h" +#endif /* FL_IWDT_DRIVER_ENABLED */ + +#if defined(FL_LCD_DRIVER_ENABLED) +#include "fm33lg0xx_fl_lcd.h" +#endif /* FL_LCD_DRIVER_ENABLED */ + +#if defined(FL_LPTIM16_DRIVER_ENABLED) +#include "fm33lg0xx_fl_lptim16.h" +#endif /* FL_LPTIM16_DRIVER_ENABLED */ + +#if defined(FL_LPTIM32_DRIVER_ENABLED) +#include "fm33lg0xx_fl_lptim32.h" +#endif /* FL_LPTIM32_DRIVER_ENABLED */ + +#if defined(FL_LPUART_DRIVER_ENABLED) +#include "fm33lg0xx_fl_lpuart.h" +#endif /* FL_LPUART_DRIVER_ENABLED */ + + +#if defined(FL_PMU_DRIVER_ENABLED) +#include "fm33lg0xx_fl_pmu.h" +#endif /* FL_PMU_DRIVER_ENABLED */ + +#if defined(FL_RMU_DRIVER_ENABLED) +#include "fm33lg0xx_fl_rmu.h" +#endif /* FL_RMU_DRIVER_ENABLED */ + +#if defined(FL_RNG_DRIVER_ENABLED) +#include "fm33lg0xx_fl_rng.h" +#endif /* FL_RNG_DRIVER_ENABLED */ + +#if defined(FL_RTCA_DRIVER_ENABLED) +#include "fm33lg0xx_fl_rtca.h" +#endif /* FL_RTCA_DRIVER_ENABLED */ + +#if defined(FL_SPI_DRIVER_ENABLED) +#include "fm33lg0xx_fl_spi.h" +#endif /* FL_SPI_DRIVER_ENABLED */ + +#if defined(FL_SVD_DRIVER_ENABLED) +#include "fm33lg0xx_fl_svd.h" +#endif /* FL_SVD_DRIVER_ENABLED */ + +#if defined(FL_UART_DRIVER_ENABLED) +#include "fm33lg0xx_fl_uart.h" +#endif /* FL_UART_DRIVER_ENABLED */ + +#if defined(FL_VAO_DRIVER_ENABLED) +#include "fm33lg0xx_fl_vao.h" +#endif /* FL_VAO_DRIVER_ENABLED */ + +#if defined(FL_VREF_DRIVER_ENABLED) +#include "fm33lg0xx_fl_vref.h" +#endif /* FL_VREF_DRIVER_ENABLED */ + +#if defined(FL_VREFP_DRIVER_ENABLED) +#include "fm33lg0xx_fl_vrefp.h" +#endif /* FL_VREFP_DRIVER_ENABLED */ + +#if defined(FL_WWDT_DRIVER_ENABLED) +#include "fm33lg0xx_fl_wwdt.h" +#endif /* FL_WWDT_DRIVER_ENABLED */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_CONF_H */ + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_crc.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_crc.h new file mode 100644 index 0000000..877841d --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_crc.h @@ -0,0 +1,469 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_crc.h + * @author FMSH Application Team + * @brief Head file of CRC FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_CRC_H +#define __FM33LG0XX_FL_CRC_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup CRC CRC + * @brief CRC FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup CRC_FL_ES_INIT CRC Exported Init structures + * @{ + */ + +/** + * @brief FL CRC Init Sturcture definition + */ +typedef struct +{ + /*! CRC初值 */ + uint32_t initVal; + /*! 计算数据宽度 */ + uint32_t dataWidth; + /*! 输入数据翻转 */ + uint32_t reflectIn; + /*! 输出数据翻转 */ + uint32_t reflectOut; + /*! 输出结果异或寄存器 */ + uint32_t xorReg; + /*! 输出结果异或使能 */ + uint32_t xorRegState; + /*! CRC多项式宽 */ + uint32_t polynomialWidth; + /*! CRC多项式 */ + uint32_t polynomial; + /*! 计算模式 串行或并行 */ + uint32_t calculatMode; + +} FL_CRC_InitTypeDef; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup CRC_FL_Exported_Constants CRC Exported Constants + * @{ + */ + +#define CRC_CR_OPWD_Pos (9U) +#define CRC_CR_OPWD_Msk (0x1U << CRC_CR_OPWD_Pos) +#define CRC_CR_OPWD CRC_CR_OPWD_Msk + +#define CRC_CR_PARA_Pos (8U) +#define CRC_CR_PARA_Msk (0x1U << CRC_CR_PARA_Pos) +#define CRC_CR_PARA CRC_CR_PARA_Msk + +#define CRC_CR_RFLTIN_Pos (6U) +#define CRC_CR_RFLTIN_Msk (0x3U << CRC_CR_RFLTIN_Pos) +#define CRC_CR_RFLTIN CRC_CR_RFLTIN_Msk + +#define CRC_CR_RFLTO_Pos (5U) +#define CRC_CR_RFLTO_Msk (0x1U << CRC_CR_RFLTO_Pos) +#define CRC_CR_RFLTO CRC_CR_RFLTO_Msk + +#define CRC_CR_RES_Pos (4U) +#define CRC_CR_RES_Msk (0x1U << CRC_CR_RES_Pos) +#define CRC_CR_RES CRC_CR_RES_Msk + +#define CRC_CR_BUSY_Pos (3U) +#define CRC_CR_BUSY_Msk (0x1U << CRC_CR_BUSY_Pos) +#define CRC_CR_BUSY CRC_CR_BUSY_Msk + +#define CRC_CR_XOR_Pos (2U) +#define CRC_CR_XOR_Msk (0x1U << CRC_CR_XOR_Pos) +#define CRC_CR_XOR CRC_CR_XOR_Msk + +#define CRC_CR_SEL_Pos (0U) +#define CRC_CR_SEL_Msk (0x3U << CRC_CR_SEL_Pos) +#define CRC_CR_SEL CRC_CR_SEL_Msk + + + + + + +#define FL_CRC_DATA_WIDTH_8B (0x0U << CRC_CR_OPWD_Pos) +#define FL_CRC_DATA_WIDTH_32B (0x1U << CRC_CR_OPWD_Pos) + + +#define FL_CRC_CALCULATE_SERIAL (0x0U << CRC_CR_PARA_Pos) +#define FL_CRC_CALCULATE_PARALLEL (0x1U << CRC_CR_PARA_Pos) + + +#define FL_CRC_INPUT_INVERT_NONE (0x0U << CRC_CR_RFLTIN_Pos) +#define FL_CRC_INPUT_INVERT_BYTE (0x1U << CRC_CR_RFLTIN_Pos) +#define FL_CRC_INPUT_INVERT_HALF_WORD (0x2U << CRC_CR_RFLTIN_Pos) +#define FL_CRC_INPUT_INVERT_WORD (0x3U << CRC_CR_RFLTIN_Pos) + + +#define FL_CRC_OUPUT_INVERT_NONE (0x0U << CRC_CR_RFLTO_Pos) +#define FL_CRC_OUPUT_INVERT_BYTE (0x1U << CRC_CR_RFLTO_Pos) + + +#define FL_CRC_POLYNOMIAL_32B (0x0U << CRC_CR_SEL_Pos) +#define FL_CRC_POLYNOMIAL_16B (0x1U << CRC_CR_SEL_Pos) +#define FL_CRC_POLYNOMIAL_8B (0x2U << CRC_CR_SEL_Pos) +#define FL_CRC_POLYNOMIAL_7B (0x3U << CRC_CR_SEL_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup CRC_FL_Exported_Functions CRC Exported Functions + * @{ + */ + +/** + * @brief Set CRC data register + * @rmtoll DR FL_CRC_WriteData + * @param CRCx CRC instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_CRC_WriteData(CRC_Type *CRCx, uint32_t data) +{ + MODIFY_REG(CRCx->DR, (0xffffffffU << 0U), (data << 0U)); +} + +/** + * @brief Get CRC data register value + * @rmtoll DR FL_CRC_ReadData + * @param CRCx CRC instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CRC_ReadData(CRC_Type *CRCx) +{ + return (uint32_t)(READ_BIT(CRCx->DR, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Set CRC calculate operation width + * @rmtoll CR OPWD FL_CRC_SetDataWidth + * @param CRCx CRC instance + * @param dataWidth This parameter can be one of the following values: + * @arg @ref FL_CRC_DATA_WIDTH_8B + * @arg @ref FL_CRC_DATA_WIDTH_32B + * @retval None + */ +__STATIC_INLINE void FL_CRC_SetDataWidth(CRC_Type *CRCx, uint32_t dataWidth) +{ + MODIFY_REG(CRCx->CR, CRC_CR_OPWD_Msk, dataWidth); +} + +/** + * @brief Get CRC calculate operation width + * @rmtoll CR OPWD FL_CRC_GetDataWidth + * @param CRCx CRC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_CRC_DATA_WIDTH_8B + * @arg @ref FL_CRC_DATA_WIDTH_32B + */ +__STATIC_INLINE uint32_t FL_CRC_GetDataWidth(CRC_Type *CRCx) +{ + return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_OPWD_Msk)); +} + +/** + * @brief Set CRC parallel calculation mode + * @rmtoll CR PARA FL_CRC_SetCalculateMode + * @param CRCx CRC instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_CRC_CALCULATE_SERIAL + * @arg @ref FL_CRC_CALCULATE_PARALLEL + * @retval None + */ +__STATIC_INLINE void FL_CRC_SetCalculateMode(CRC_Type *CRCx, uint32_t mode) +{ + MODIFY_REG(CRCx->CR, CRC_CR_PARA_Msk, mode); +} + +/** + * @brief Get CRC parallel calculation mode + * @rmtoll CR PARA FL_CRC_GetCalculateMode + * @param CRCx CRC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_CRC_CALCULATE_SERIAL + * @arg @ref FL_CRC_CALCULATE_PARALLEL + */ +__STATIC_INLINE uint32_t FL_CRC_GetCalculateMode(CRC_Type *CRCx) +{ + return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_PARA_Msk)); +} + +/** + * @brief Set CRC reflected input + * @rmtoll CR RFLTIN FL_CRC_SetInputInvertMode + * @param CRCx CRC instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_CRC_INPUT_INVERT_NONE + * @arg @ref FL_CRC_INPUT_INVERT_BYTE + * @arg @ref FL_CRC_INPUT_INVERT_HALF_WORD + * @arg @ref FL_CRC_INPUT_INVERT_WORD + * @retval None + */ +__STATIC_INLINE void FL_CRC_SetInputInvertMode(CRC_Type *CRCx, uint32_t mode) +{ + MODIFY_REG(CRCx->CR, CRC_CR_RFLTIN_Msk, mode); +} + +/** + * @brief Get CRC reflected input status + * @rmtoll CR RFLTIN FL_CRC_GetInputInvertMode + * @param CRCx CRC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_CRC_INPUT_INVERT_NONE + * @arg @ref FL_CRC_INPUT_INVERT_BYTE + * @arg @ref FL_CRC_INPUT_INVERT_HALF_WORD + * @arg @ref FL_CRC_INPUT_INVERT_WORD + */ +__STATIC_INLINE uint32_t FL_CRC_GetInputInvertMode(CRC_Type *CRCx) +{ + return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_RFLTIN_Msk)); +} + +/** + * @brief Set CRC reflected output + * @rmtoll CR RFLTO FL_CRC_SetOutputInvertMode + * @param CRCx CRC instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_CRC_OUPUT_INVERT_NONE + * @arg @ref FL_CRC_OUPUT_INVERT_BYTE + * @retval None + */ +__STATIC_INLINE void FL_CRC_SetOutputInvertMode(CRC_Type *CRCx, uint32_t mode) +{ + MODIFY_REG(CRCx->CR, CRC_CR_RFLTO_Msk, mode); +} + +/** + * @brief Get CRC feflected output status + * @rmtoll CR RFLTO FL_CRC_GetOutputInvertMode + * @param CRCx CRC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_CRC_OUPUT_INVERT_NONE + * @arg @ref FL_CRC_OUPUT_INVERT_BYTE + */ +__STATIC_INLINE uint32_t FL_CRC_GetOutputInvertMode(CRC_Type *CRCx) +{ + return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_RFLTO_Msk)); +} + +/** + * @brief Get CRC result flag + * @rmtoll CR RES FL_CRC_IsActiveFlag_Zero + * @param CRCx CRC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CRC_IsActiveFlag_Zero(CRC_Type *CRCx) +{ + return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_RES_Msk) == (CRC_CR_RES_Msk)); +} + +/** + * @brief Get CRC operational flag + * @rmtoll CR BUSY FL_CRC_IsActiveFlag_Busy + * @param CRCx CRC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CRC_IsActiveFlag_Busy(CRC_Type *CRCx) +{ + return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_BUSY_Msk) == (CRC_CR_BUSY_Msk)); +} + +/** + * @brief Output XORed with CRC_XOR register enable + * @rmtoll CR XOR FL_CRC_EnableOutputXOR + * @param CRCx CRC instance + * @retval None + */ +__STATIC_INLINE void FL_CRC_EnableOutputXOR(CRC_Type *CRCx) +{ + SET_BIT(CRCx->CR, CRC_CR_XOR_Msk); +} + +/** + * @brief Get output XORed with CRC_XOR register enable status + * @rmtoll CR XOR FL_CRC_IsEnabledOutputXOR + * @param CRCx CRC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_CRC_IsEnabledOutputXOR(CRC_Type *CRCx) +{ + return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_XOR_Msk) == CRC_CR_XOR_Msk); +} + +/** + * @brief Output XORed with CRC_XOR register disable + * @rmtoll CR XOR FL_CRC_DisableOutputXOR + * @param CRCx CRC instance + * @retval None + */ +__STATIC_INLINE void FL_CRC_DisableOutputXOR(CRC_Type *CRCx) +{ + CLEAR_BIT(CRCx->CR, CRC_CR_XOR_Msk); +} + +/** + * @brief Polynomial width selection + * @rmtoll CR SEL FL_CRC_SetPolynomialWidth + * @param CRCx CRC instance + * @param width This parameter can be one of the following values: + * @arg @ref FL_CRC_POLYNOMIAL_32B + * @arg @ref FL_CRC_POLYNOMIAL_16B + * @arg @ref FL_CRC_POLYNOMIAL_8B + * @arg @ref FL_CRC_POLYNOMIAL_7B + * @retval None + */ +__STATIC_INLINE void FL_CRC_SetPolynomialWidth(CRC_Type *CRCx, uint32_t width) +{ + MODIFY_REG(CRCx->CR, CRC_CR_SEL_Msk, width); +} + +/** + * @brief Get Polynomial width Selection status + * @rmtoll CR SEL FL_CRC_GetPolynomialWidth + * @param CRCx CRC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_CRC_POLYNOMIAL_32B + * @arg @ref FL_CRC_POLYNOMIAL_16B + * @arg @ref FL_CRC_POLYNOMIAL_8B + * @arg @ref FL_CRC_POLYNOMIAL_7B + */ +__STATIC_INLINE uint32_t FL_CRC_GetPolynomialWidth(CRC_Type *CRCx) +{ + return (uint32_t)(READ_BIT(CRCx->CR, CRC_CR_SEL_Msk)); +} + +/** + * @brief Set linear feedback shift register + * @rmtoll LFSR FL_CRC_WriteInitialValue + * @param CRCx CRC instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_CRC_WriteInitialValue(CRC_Type *CRCx, uint32_t data) +{ + MODIFY_REG(CRCx->LFSR, (0xffffffffU << 0U), (data << 0U)); +} + +/** + * @brief Get linear feedback shift register value + * @rmtoll LFSR FL_CRC_ReadInitialValue + * @param CRCx CRC instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CRC_ReadInitialValue(CRC_Type *CRCx) +{ + return (uint32_t)(READ_BIT(CRCx->LFSR, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Set eXclusive XOR register + * @rmtoll XOR FL_CRC_WriteXORValue + * @param CRCx CRC instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_CRC_WriteXORValue(CRC_Type *CRCx, uint32_t data) +{ + MODIFY_REG(CRCx->XOR, (0xffffffffU << 0U), (data << 0U)); +} + +/** + * @brief Get eXclusive XOR register value + * @rmtoll XOR FL_CRC_ReadXORValue + * @param CRCx CRC instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CRC_ReadXORValue(CRC_Type *CRCx) +{ + return (uint32_t)(READ_BIT(CRCx->XOR, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Set CRC Polynominals + * @rmtoll POLY FL_CRC_WritePolynominalParam + * @param CRCx CRC instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_CRC_WritePolynominalParam(CRC_Type *CRCx, uint32_t data) +{ + MODIFY_REG(CRCx->POLY, (0xffffffffU << 0U), (data << 0U)); +} + +/** + * @brief Get CRC Polynominals + * @rmtoll POLY FL_CRC_ReadPolynominalParam + * @param CRCx CRC instance + * @retval + */ +__STATIC_INLINE uint32_t FL_CRC_ReadPolynominalParam(CRC_Type *CRCx) +{ + return (uint32_t)(READ_BIT(CRCx->POLY, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @} + */ + +/** @defgroup CRC_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_CRC_DeInit(CRC_Type *CRCx); +void FL_CRC_StructInit(FL_CRC_InitTypeDef *CRC_InitStruct); +FL_ErrorStatus FL_CRC_Init(CRC_Type *CRCx, FL_CRC_InitTypeDef *CRC_InitStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_CRC_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-14*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_dac.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_dac.h new file mode 100644 index 0000000..3008b7d --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_dac.h @@ -0,0 +1,752 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_dac.h + * @author FMSH Application Team + * @brief Head file of DAC FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_DAC_H +#define __FM33LG0XX_FL_DAC_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup DAC DAC + * @brief DAC FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup DAC_FL_ES_INIT DAC Exported Init structures + * @{ + */ + +/** + * @brief FL DAC Init Sturcture definition + */ +typedef struct +{ + /*DAC触发模式使能配置*/ + uint32_t triggerMode; + /*DAC触发源配置*/ + uint32_t triggerSource; + /*DAC采样保持模式配置*/ + uint32_t sampleHoldMode; + /*DAC保持时间配置*/ + uint32_t holdTime; + /*DAC采样时间配置*/ + uint32_t sampleTime; + /*DAC_Buffer模式配置*/ + uint32_t bufferMode; + /*DAC反馈开关配置*/ + uint32_t switchMode; + + +} FL_DAC_InitTypeDef; +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup DAC_FL_Exported_Constants DAC Exported Constants + * @{ + */ + +#define DAC_CR1_EN_Pos (0U) +#define DAC_CR1_EN_Msk (0x1U << DAC_CR1_EN_Pos) +#define DAC_CR1_EN DAC_CR1_EN_Msk + +#define DAC_CR2_DMAEN_Pos (1U) +#define DAC_CR2_DMAEN_Msk (0x1U << DAC_CR2_DMAEN_Pos) +#define DAC_CR2_DMAEN DAC_CR2_DMAEN_Msk + +#define DAC_CR2_TRGEN_Pos (0U) +#define DAC_CR2_TRGEN_Msk (0x1U << DAC_CR2_TRGEN_Pos) +#define DAC_CR2_TRGEN DAC_CR2_TRGEN_Msk + +#define DAC_CFGR_SHEN_Pos (8U) +#define DAC_CFGR_SHEN_Msk (0x1U << DAC_CFGR_SHEN_Pos) +#define DAC_CFGR_SHEN DAC_CFGR_SHEN_Msk + +#define DAC_CFGR_BUFEN_Pos (7U) +#define DAC_CFGR_BUFEN_Msk (0x1U << DAC_CFGR_BUFEN_Pos) +#define DAC_CFGR_BUFEN DAC_CFGR_BUFEN_Msk + +#define DAC_CFGR_TRGSEL_Pos (2U) +#define DAC_CFGR_TRGSEL_Msk (0xfU << DAC_CFGR_TRGSEL_Pos) +#define DAC_CFGR_TRGSEL DAC_CFGR_TRGSEL_Msk + +#define DAC_CFGR_SWIEN_Pos (0U) +#define DAC_CFGR_SWIEN_Msk (0x1U << DAC_CFGR_SWIEN_Pos) +#define DAC_CFGR_SWIEN DAC_CFGR_SWIEN_Msk + +#define DAC_SWTRGR_SWTRIG_Pos (0U) +#define DAC_SWTRGR_SWTRIG_Msk (0x1U << DAC_SWTRGR_SWTRIG_Pos) +#define DAC_SWTRGR_SWTRIG DAC_SWTRGR_SWTRIG_Msk + +#define DAC_DHR_DHR_Pos (0U) +#define DAC_DHR_DHR_Msk (0xfffU << DAC_DHR_DHR_Pos) +#define DAC_DHR_DHR DAC_DHR_DHR_Msk + +#define DAC_IER_DMAE_IE_Pos (3U) +#define DAC_IER_DMAE_IE_Msk (0x1U << DAC_IER_DMAE_IE_Pos) +#define DAC_IER_DMAE_IE DAC_IER_DMAE_IE_Msk + +#define DAC_IER_EOH_IE_Pos (2U) +#define DAC_IER_EOH_IE_Msk (0x1U << DAC_IER_EOH_IE_Pos) +#define DAC_IER_EOH_IE DAC_IER_EOH_IE_Msk + +#define DAC_IER_EOS_IE_Pos (1U) +#define DAC_IER_EOS_IE_Msk (0x1U << DAC_IER_EOS_IE_Pos) +#define DAC_IER_EOS_IE DAC_IER_EOS_IE_Msk + +#define DAC_IER_DOU_IE_Pos (0U) +#define DAC_IER_DOU_IE_Msk (0x1U << DAC_IER_DOU_IE_Pos) +#define DAC_IER_DOU_IE DAC_IER_DOU_IE_Msk + +#define DAC_ISR_DMAERR_Pos (3U) +#define DAC_ISR_DMAERR_Msk (0x1U << DAC_ISR_DMAERR_Pos) +#define DAC_ISR_DMAERR DAC_ISR_DMAERR_Msk + +#define DAC_ISR_EOH_Pos (2U) +#define DAC_ISR_EOH_Msk (0x1U << DAC_ISR_EOH_Pos) +#define DAC_ISR_EOH DAC_ISR_EOH_Msk + +#define DAC_ISR_EOS_Pos (1U) +#define DAC_ISR_EOS_Msk (0x1U << DAC_ISR_EOS_Pos) +#define DAC_ISR_EOS DAC_ISR_EOS_Msk + +#define DAC_ISR_DOU_Pos (0U) +#define DAC_ISR_DOU_Msk (0x1U << DAC_ISR_DOU_Pos) +#define DAC_ISR_DOU DAC_ISR_DOU_Msk + +#define DAC_SHTR_THLD_Pos (8U) +#define DAC_SHTR_THLD_Msk (0xffffU << DAC_SHTR_THLD_Pos) +#define DAC_SHTR_THLD DAC_SHTR_THLD_Msk + +#define DAC_SHTR_TSMPL_Pos (0U) +#define DAC_SHTR_TSMPL_Msk (0xffU << DAC_SHTR_TSMPL_Pos) +#define DAC_SHTR_TSMPL DAC_SHTR_TSMPL_Msk + + + + + + +#define FL_DAC_TRGI_SOFTWARE (0x0U << DAC_CFGR_TRGSEL_Pos) +#define FL_DAC_TRGI_ATIM (0x1U << DAC_CFGR_TRGSEL_Pos) +#define FL_DAC_TRGI_GPTIM1 (0x2U << DAC_CFGR_TRGSEL_Pos) +#define FL_DAC_TRGI_GPTIM2 (0x3U << DAC_CFGR_TRGSEL_Pos) +#define FL_DAC_TRGI_BSTIM16 (0x4U << DAC_CFGR_TRGSEL_Pos) +#define FL_DAC_TRGI_LPTIM16 (0x5U << DAC_CFGR_TRGSEL_Pos) +#define FL_DAC_TRGI_EXTI0 (0xcU << DAC_CFGR_TRGSEL_Pos) +#define FL_DAC_TRGI_EXTI4 (0xdU << DAC_CFGR_TRGSEL_Pos) +#define FL_DAC_TRGI_EXTI8 (0xeU << DAC_CFGR_TRGSEL_Pos) +#define FL_DAC_TRGI_EXTI12 (0xfU << DAC_CFGR_TRGSEL_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup DAC_FL_Exported_Functions DAC Exported Functions + * @{ + */ + +/** + * @brief Enable DAC + * @rmtoll CR1 EN FL_DAC_Enable + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_Enable(DAC_Type *DACx) +{ + SET_BIT(DACx->CR1, DAC_CR1_EN_Msk); +} + +/** + * @brief Disable DAC + * @rmtoll CR1 EN FL_DAC_Disable + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_Disable(DAC_Type *DACx) +{ + CLEAR_BIT(DACx->CR1, DAC_CR1_EN_Msk); +} + +/** + * @brief Get DAC Enable Status + * @rmtoll CR1 EN FL_DAC_IsEnabled + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsEnabled(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->CR1, DAC_CR1_EN_Msk) == DAC_CR1_EN_Msk); +} + +/** + * @brief Enable DAC DMA + * @rmtoll CR2 DMAEN FL_DAC_EnableDMAReq + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_EnableDMAReq(DAC_Type *DACx) +{ + SET_BIT(DACx->CR2, DAC_CR2_DMAEN_Msk); +} + +/** + * @brief Disable DAC DMA + * @rmtoll CR2 DMAEN FL_DAC_DisableDMAReq + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_DisableDMAReq(DAC_Type *DACx) +{ + CLEAR_BIT(DACx->CR2, DAC_CR2_DMAEN_Msk); +} + +/** + * @brief Get DAC DMA Enable Status + * @rmtoll CR2 DMAEN FL_DAC_IsEnabledDMAReq + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsEnabledDMAReq(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->CR2, DAC_CR2_DMAEN_Msk) == DAC_CR2_DMAEN_Msk); +} + +/** + * @brief Enable DAC Trigger + * @rmtoll CR2 TRGEN FL_DAC_EnableTriggerMode + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_EnableTriggerMode(DAC_Type *DACx) +{ + SET_BIT(DACx->CR2, DAC_CR2_TRGEN_Msk); +} + +/** + * @brief Disable DAC Trigger + * @rmtoll CR2 TRGEN FL_DAC_DisableTriggerMode + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_DisableTriggerMode(DAC_Type *DACx) +{ + CLEAR_BIT(DACx->CR2, DAC_CR2_TRGEN_Msk); +} + +/** + * @brief Get DAC Trigger Enable Status + * @rmtoll CR2 TRGEN FL_DAC_IsEnabledTriggerMode + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsEnabledTriggerMode(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->CR2, DAC_CR2_TRGEN_Msk) == DAC_CR2_TRGEN_Msk); +} + +/** + * @brief Enable DAC Sample Hold + * @rmtoll CFGR SHEN FL_DAC_EnableSampleHoldMode + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_EnableSampleHoldMode(DAC_Type *DACx) +{ + SET_BIT(DACx->CFGR, DAC_CFGR_SHEN_Msk); +} + +/** + * @brief Disable DAC Sample Hold + * @rmtoll CFGR SHEN FL_DAC_DisableSampleHoldMode + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_DisableSampleHoldMode(DAC_Type *DACx) +{ + CLEAR_BIT(DACx->CFGR, DAC_CFGR_SHEN_Msk); +} + +/** + * @brief Get DAC Sample Hold Enable Status + * @rmtoll CFGR SHEN FL_DAC_IsEnabledSampleHoldMode + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsEnabledSampleHoldMode(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->CFGR, DAC_CFGR_SHEN_Msk) == DAC_CFGR_SHEN_Msk); +} + +/** + * @brief Enable DAC Output Buffer + * @rmtoll CFGR BUFEN FL_DAC_EnableOutputBuffer + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_EnableOutputBuffer(DAC_Type *DACx) +{ + SET_BIT(DACx->CFGR, DAC_CFGR_BUFEN_Msk); +} + +/** + * @brief Disable DAC Output Buffer + * @rmtoll CFGR BUFEN FL_DAC_DisableOutputBuffer + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_DisableOutputBuffer(DAC_Type *DACx) +{ + CLEAR_BIT(DACx->CFGR, DAC_CFGR_BUFEN_Msk); +} + +/** + * @brief Get DAC Output Buffer Status + * @rmtoll CFGR BUFEN FL_DAC_IsEnabledOutputBuffer + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsEnabledOutputBuffer(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->CFGR, DAC_CFGR_BUFEN_Msk) == DAC_CFGR_BUFEN_Msk); +} + +/** + * @brief Set DAC Trigger Source + * @note Can Only Be Modified When TRGEN=0 + * @rmtoll CFGR TRGSEL FL_DAC_SetTriggerSource + * @param DACx DAC instance + * @param source This parameter can be one of the following values: + * @arg @ref FL_DAC_TRGI_SOFTWARE + * @arg @ref FL_DAC_TRGI_ATIM + * @arg @ref FL_DAC_TRGI_GPTIM1 + * @arg @ref FL_DAC_TRGI_GPTIM2 + * @arg @ref FL_DAC_TRGI_BSTIM16 + * @arg @ref FL_DAC_TRGI_LPTIM16 + * @arg @ref FL_DAC_TRGI_EXTI0 + * @arg @ref FL_DAC_TRGI_EXTI4 + * @arg @ref FL_DAC_TRGI_EXTI8 + * @arg @ref FL_DAC_TRGI_EXTI12 + * @retval None + */ +__STATIC_INLINE void FL_DAC_SetTriggerSource(DAC_Type *DACx, uint32_t source) +{ + MODIFY_REG(DACx->CFGR, DAC_CFGR_TRGSEL_Msk, source); +} + +/** + * @brief Get DAC Trigger Source + * @rmtoll CFGR TRGSEL FL_DAC_GetTriggerSource + * @param DACx DAC instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_DAC_TRGI_SOFTWARE + * @arg @ref FL_DAC_TRGI_ATIM + * @arg @ref FL_DAC_TRGI_GPTIM1 + * @arg @ref FL_DAC_TRGI_GPTIM2 + * @arg @ref FL_DAC_TRGI_BSTIM16 + * @arg @ref FL_DAC_TRGI_LPTIM16 + * @arg @ref FL_DAC_TRGI_EXTI0 + * @arg @ref FL_DAC_TRGI_EXTI4 + * @arg @ref FL_DAC_TRGI_EXTI8 + * @arg @ref FL_DAC_TRGI_EXTI12 + */ +__STATIC_INLINE uint32_t FL_DAC_GetTriggerSource(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->CFGR, DAC_CFGR_TRGSEL_Msk)); +} + +/** + * @brief Enable DAC DAC Feedback Switch + * @rmtoll CFGR SWIEN FL_DAC_EnableFeedbackSwitch + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_EnableFeedbackSwitch(DAC_Type *DACx) +{ + SET_BIT(DACx->CFGR, DAC_CFGR_SWIEN_Msk); +} + +/** + * @brief Disable DAC DAC Feedback Switch + * @rmtoll CFGR SWIEN FL_DAC_DisableFeedbackSwitch + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_DisableFeedbackSwitch(DAC_Type *DACx) +{ + CLEAR_BIT(DACx->CFGR, DAC_CFGR_SWIEN_Msk); +} + +/** + * @brief Get DAC Feedback Switch + * @rmtoll CFGR SWIEN FL_DAC_IsEnabledFeedbackSwitch + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsEnabledFeedbackSwitch(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->CFGR, DAC_CFGR_SWIEN_Msk) == DAC_CFGR_SWIEN_Msk); +} + +/** + * @brief Trigger DAC + * @rmtoll SWTRGR SWTRIG FL_DAC_EnableSoftwareTrigger + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_EnableSoftwareTrigger(DAC_Type *DACx) +{ + SET_BIT(DACx->SWTRGR, DAC_SWTRGR_SWTRIG_Msk); +} + +/** + * @brief Write DAC Data + * @rmtoll DHR DHR FL_DAC_WriteData + * @param DACx DAC instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_DAC_WriteData(DAC_Type *DACx, uint32_t data) +{ + MODIFY_REG(DACx->DHR, (0xfffU << 0U), (data << 0U)); +} + +/** + * @brief Read DAC Data + * @rmtoll DHR DHR FL_DAC_ReadData + * @param DACx DAC instance + * @retval + */ +__STATIC_INLINE uint32_t FL_DAC_ReadData(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->DHR, 0xfffU) >> 0U); +} + +/** + * @brief Enable DAC DMA Error interrupt + * @rmtoll IER DMAE_IE FL_DAC_EnableIT_DMAError + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_EnableIT_DMAError(DAC_Type *DACx) +{ + SET_BIT(DACx->IER, DAC_IER_DMAE_IE_Msk); +} + +/** + * @brief Disable DAC DMA Error interrupt + * @rmtoll IER DMAE_IE FL_DAC_DisableIT_DMAError + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_DisableIT_DMAError(DAC_Type *DACx) +{ + CLEAR_BIT(DACx->IER, DAC_IER_DMAE_IE_Msk); +} + +/** + * @brief Get DAC DMA Error interrupt Enable Status + * @rmtoll IER DMAE_IE FL_DAC_IsEnabledIT_DMAError + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsEnabledIT_DMAError(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->IER, DAC_IER_DMAE_IE_Msk) == DAC_IER_DMAE_IE_Msk); +} + +/** + * @brief Enable DAC End Of Holding Phase Interrupt + * @rmtoll IER EOH_IE FL_DAC_EnableIT_EndOfHolding + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_EnableIT_EndOfHolding(DAC_Type *DACx) +{ + SET_BIT(DACx->IER, DAC_IER_EOH_IE_Msk); +} + +/** + * @brief Disable DAC End Of Holding Phase Interrupt + * @rmtoll IER EOH_IE FL_DAC_DisableIT_EndOfHolding + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_DisableIT_EndOfHolding(DAC_Type *DACx) +{ + CLEAR_BIT(DACx->IER, DAC_IER_EOH_IE_Msk); +} + +/** + * @brief Get DAC End Of Holding Phase Interrupt Enable Status + * @rmtoll IER EOH_IE FL_DAC_IsEnabledIT_EndOfHolding + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsEnabledIT_EndOfHolding(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->IER, DAC_IER_EOH_IE_Msk) == DAC_IER_EOH_IE_Msk); +} + +/** + * @brief Enable DAC End Of Sampling Phase Interrupt + * @rmtoll IER EOS_IE FL_DAC_EnableIT_EndOfSampling + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_EnableIT_EndOfSampling(DAC_Type *DACx) +{ + SET_BIT(DACx->IER, DAC_IER_EOS_IE_Msk); +} + +/** + * @brief Disable DAC End Of Sampling Phase Interrupt + * @rmtoll IER EOS_IE FL_DAC_DisableIT_EndOfSampling + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_DisableIT_EndOfSampling(DAC_Type *DACx) +{ + CLEAR_BIT(DACx->IER, DAC_IER_EOS_IE_Msk); +} + +/** + * @brief Get DAC End Of Sampling Phase Interrupt Enable Status + * @rmtoll IER EOS_IE FL_DAC_IsEnabledIT_EndOfSampling + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsEnabledIT_EndOfSampling(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->IER, DAC_IER_EOS_IE_Msk) == DAC_IER_EOS_IE_Msk); +} + +/** + * @brief Enable DAC Data Output Updated Interrupt + * @rmtoll IER DOU_IE FL_DAC_EnableIT_DataOutputUpdate + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_EnableIT_DataOutputUpdate(DAC_Type *DACx) +{ + SET_BIT(DACx->IER, DAC_IER_DOU_IE_Msk); +} + +/** + * @brief Disable DAC Data Output Updated Interrupt + * @rmtoll IER DOU_IE FL_DAC_DisableIT_DataOutputUpdate + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_DisableIT_DataOutputUpdate(DAC_Type *DACx) +{ + CLEAR_BIT(DACx->IER, DAC_IER_DOU_IE_Msk); +} + +/** + * @brief Get DAC Data Output Updated Interrupt Enable Status + * @rmtoll IER DOU_IE FL_DAC_IsEnabledIT_DataOutputUpdate + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsEnabledIT_DataOutputUpdate(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->IER, DAC_IER_DOU_IE_Msk) == DAC_IER_DOU_IE_Msk); +} + +/** + * @brief Get DAC DMA Error Flag + * @rmtoll ISR DMAERR FL_DAC_IsActiveFlag_DMAError + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsActiveFlag_DMAError(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->ISR, DAC_ISR_DMAERR_Msk) == (DAC_ISR_DMAERR_Msk)); +} + +/** + * @brief Clear DAC DMA Error Flag + * @rmtoll ISR DMAERR FL_DAC_ClearFlag_DMAError + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_ClearFlag_DMAError(DAC_Type *DACx) +{ + WRITE_REG(DACx->ISR, DAC_ISR_DMAERR_Msk); +} + +/** + * @brief Get DAC End Of Holding Phase Flag + * @rmtoll ISR EOH FL_DAC_IsActiveFlag_EndOfHolding + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsActiveFlag_EndOfHolding(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->ISR, DAC_ISR_EOH_Msk) == (DAC_ISR_EOH_Msk)); +} + +/** + * @brief Clear DAC End Of Holding Phase Flag + * @rmtoll ISR EOH FL_DAC_ClearFlag_EndOfHolding + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_ClearFlag_EndOfHolding(DAC_Type *DACx) +{ + WRITE_REG(DACx->ISR, DAC_ISR_EOH_Msk); +} + +/** + * @brief Get DAC End Of Sampling Phase Flag + * @rmtoll ISR EOS FL_DAC_IsActiveFlag_EndOfSampling + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsActiveFlag_EndOfSampling(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->ISR, DAC_ISR_EOS_Msk) == (DAC_ISR_EOS_Msk)); +} + +/** + * @brief Clear DAC End Of Sampling Phase Flag + * @rmtoll ISR EOS FL_DAC_ClearFlag_EndOfSampling + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_ClearFlag_EndOfSampling(DAC_Type *DACx) +{ + WRITE_REG(DACx->ISR, DAC_ISR_EOS_Msk); +} + +/** + * @brief Get DAC Data Output Updated Flag + * @rmtoll ISR DOU FL_DAC_IsActiveFlag_DataOutputUpdate + * @param DACx DAC instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DAC_IsActiveFlag_DataOutputUpdate(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->ISR, DAC_ISR_DOU_Msk) == (DAC_ISR_DOU_Msk)); +} + +/** + * @brief Clear DAC Data Output Updated Flag + * @rmtoll ISR DOU FL_DAC_ClearFlag_DataOutputUpdate + * @param DACx DAC instance + * @retval None + */ +__STATIC_INLINE void FL_DAC_ClearFlag_DataOutputUpdate(DAC_Type *DACx) +{ + WRITE_REG(DACx->ISR, DAC_ISR_DOU_Msk); +} + +/** + * @brief Set DAC Holding Time + * @note Modification IS NOT ALLOWED When SHEN=1 + * @rmtoll SHTR THLD FL_DAC_WriteHoldingTime + * @param DACx DAC instance + * @param time + * @retval None + */ +__STATIC_INLINE void FL_DAC_WriteHoldingTime(DAC_Type *DACx, uint32_t time) +{ + MODIFY_REG(DACx->SHTR, (0xffffU << 8U), (time << 8U)); +} + +/** + * @brief Read DAC Holding Time + * @rmtoll SHTR THLD FL_DAC_ReadHoldingTime + * @param DACx DAC instance + * @retval + */ +__STATIC_INLINE uint32_t FL_DAC_ReadHoldingTime(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->SHTR, 0xffffU) >> 8U); +} + +/** + * @brief Set DAC Sampling Time Under Sample&Hold Mode + * @note Modification IS NOT ALLOWED When SHEN=1 + * @rmtoll SHTR TSMPL FL_DAC_WriteSamplingTime + * @param DACx DAC instance + * @param time + * @retval None + */ +__STATIC_INLINE void FL_DAC_WriteSamplingTime(DAC_Type *DACx, uint32_t time) +{ + MODIFY_REG(DACx->SHTR, (0xffU << 0U), (time << 0U)); +} + +/** + * @brief Read DAC Sampling Time Under Sample&Hold Mode + * @rmtoll SHTR TSMPL FL_DAC_ReadSamplingTime + * @param DACx DAC instance + * @retval + */ +__STATIC_INLINE uint32_t FL_DAC_ReadSamplingTime(DAC_Type *DACx) +{ + return (uint32_t)(READ_BIT(DACx->SHTR, 0xffU) >> 0U); +} + + +/** + * @} + */ + +/** @defgroup DAC_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_DAC_DeInit(DAC_Type *DACx); +FL_ErrorStatus FL_DAC_Init(DAC_Type *DACx, FL_DAC_InitTypeDef *DAC_InitStruct); +void FL_DAC_StructInit(FL_DAC_InitTypeDef *DAC_InitStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_DAC_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-12*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_def.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_def.h new file mode 100644 index 0000000..d503718 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_def.h @@ -0,0 +1,92 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_def.h + * @author FMSH Application Team + * @brief Header file of FL Driver Library Defines + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion --------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_DEF_H +#define __FM33LG0XX_FL_DEF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx.h" +#include "fm33_assert.h" +#include +#include +#include + +/* Macros ---------------------------------------------------------------------------------------------*/ +/** @defgroup FL_Exported_Macros FL Driver Library Private Macros + * @{ + */ + +/** + * @brief Bit-wise operation macros used by FL driver library functions + */ +#define SET_BIT(REG, BIT) ((REG) |= (BIT)) +#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) +#define READ_BIT(REG, BIT) ((REG) & (BIT)) +#define CLEAR_REG(REG) ((REG) = (0x0)) +#define WRITE_REG(REG, VAL) ((REG) = (VAL)) +#define READ_REG(REG) ((REG)) +#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) + +/** + * @} + */ + +/* Types ----------------------------------------------------------------------------------------------*/ +/** @defgroup FL_PT_Return FL Driver Library Private Return Type Defines + * @{ + */ + +typedef enum +{ + FL_RESET = 0U, + FL_SET = !FL_RESET +} FL_FlagStatus, FL_ITStatus; + +typedef enum +{ + FL_DISABLE = 0U, + FL_ENABLE = !FL_DISABLE +} FL_FunState; +#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == FL_DISABLE) || ((STATE) == FL_ENABLE)) + +typedef enum +{ + FL_FAIL = 0U, + FL_PASS = !FL_FAIL +} FL_ErrorStatus; + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_DEF_H */ + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_divas.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_divas.h new file mode 100644 index 0000000..539660a --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_divas.h @@ -0,0 +1,247 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_divas.h + * @author FMSH Application Team + * @brief Head file of DIVAS FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_DIVAS_H +#define __FM33LG0XX_FL_DIVAS_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup DIVAS DIVAS + * @brief DIVAS FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup DIVAS_FL_ES_INIT DIVAS Exported Init structures + * @{ + */ + +/** + * @brief FL DIVAS Init Sturcture definition + */ + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup DIVAS_FL_Exported_Constants DIVAS Exported Constants + * @{ + */ +#define FL_DIVAS_SR_BUSY_TIMEOUT (0xFFFU) + +#define DIVAS_SR_DIV0_Pos (1U) +#define DIVAS_SR_DIV0_Msk (0x1U << DIVAS_SR_DIV0_Pos) +#define DIVAS_SR_DIV0 DIVAS_SR_DIV0_Msk + +#define DIVAS_SR_BUSY_Pos (0U) +#define DIVAS_SR_BUSY_Msk (0x1U << DIVAS_SR_BUSY_Pos) +#define DIVAS_SR_BUSY DIVAS_SR_BUSY_Msk + +#define DIVAS_CR_MODE_Pos (0U) +#define DIVAS_CR_MODE_Msk (0x1U << DIVAS_CR_MODE_Pos) +#define DIVAS_CR_MODE DIVAS_CR_MODE_Msk + + + + + + +#define FL_DIVAS_MODE_DIV (0x0U << DIVAS_CR_MODE_Pos) +#define FL_DIVAS_MODE_ROOT (0x1U << DIVAS_CR_MODE_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup DIVAS_FL_Exported_Functions DIVAS Exported Functions + * @{ + */ + +/** + * @brief Write Operator Register + * @rmtoll OPRD FL_DIVAS_WriteOperand + * @param DIVASx DIVAS instance + * @param number + * @retval None + */ +__STATIC_INLINE void FL_DIVAS_WriteOperand(DIVAS_Type *DIVASx, uint32_t number) +{ + WRITE_REG(DIVASx->OPRD,(number << 0U)); +} + +/** + * @brief Read Operator Register + * @rmtoll OPRD FL_DIVAS_ReadOperand + * @param DIVASx DIVAS instance + * @retval + */ +__STATIC_INLINE int32_t FL_DIVAS_ReadOperand(DIVAS_Type *DIVASx) +{ + return (int32_t)(READ_BIT(DIVASx->OPRD, 0xffffffffU) >> 0U); +} + +/** + * @brief Write 16bit Signed Dividend + * @rmtoll DIVSOR FL_DIVAS_WriteDivisor + * @param DIVASx DIVAS instance + * @param number + * @retval None + */ +__STATIC_INLINE void FL_DIVAS_WriteDivisor(DIVAS_Type *DIVASx, uint32_t number) +{ + MODIFY_REG(DIVASx->DIVSOR, (0xffffU << 0U), (number << 0U)); +} + +/** + * @brief Read 16bit Signed Dividend + * @rmtoll DIVSOR FL_DIVAS_ReadDivisor + * @param DIVASx DIVAS instance + * @retval + */ +__STATIC_INLINE int32_t FL_DIVAS_ReadDivisor(DIVAS_Type *DIVASx) +{ + return (int32_t)(READ_BIT(DIVASx->DIVSOR, 0xffffU) >> 0U); +} + +/** + * @brief Read 32bit Signed QUTO + * @rmtoll QUOT FL_DIVAS_ReadQuotient + * @param DIVASx DIVAS instance + * @retval + */ +__STATIC_INLINE int32_t FL_DIVAS_ReadQuotient(DIVAS_Type *DIVASx) +{ + return (int32_t)(READ_BIT(DIVASx->QUOT, 0xffffffffU) >> 0U); +} + +/** + * @brief Read 16bit Signed Reminder + * @rmtoll REMD FL_DIVAS_ReadResidue + * @param DIVASx DIVAS instance + * @retval + */ +__STATIC_INLINE int16_t FL_DIVAS_ReadResidue(DIVAS_Type *DIVASx) +{ + return (int16_t)(READ_BIT(DIVASx->REMD, 0xffffU) >> 0U); +} + +/** + * @brief Read 16bit Unsigned Square Root + * @rmtoll ROOT FL_DIVAS_ReadRoot + * @param DIVASx DIVAS instance + * @retval + */ +__STATIC_INLINE uint16_t FL_DIVAS_ReadRoot(DIVAS_Type *DIVASx) +{ + return (uint16_t)(READ_BIT(DIVASx->ROOT, 0xffffU) >> 0U); +} + +/** + * @brief Get divided by 0 flag + * @rmtoll SR DIV0 FL_DIVAS_IsActiveFlag_DividedZero + * @param DIVASx DIVAS instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DIVAS_IsActiveFlag_DividedZero(DIVAS_Type *DIVASx) +{ + return (uint32_t)(READ_BIT(DIVASx->SR, DIVAS_SR_DIV0_Msk) == (DIVAS_SR_DIV0_Msk)); +} + +/** + * @brief Get Busy flag + * @rmtoll SR BUSY FL_DIVAS_IsActiveFlag_Busy + * @param DIVASx DIVAS instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DIVAS_IsActiveFlag_Busy(DIVAS_Type *DIVASx) +{ + return (uint32_t)(READ_BIT(DIVASx->SR, DIVAS_SR_BUSY_Msk) == (DIVAS_SR_BUSY_Msk)); +} + +/** + * @brief Set Work Mode + * @rmtoll CR MODE FL_DIVAS_SetMode + * @param DIVASx DIVAS instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_DIVAS_MODE_DIV + * @arg @ref FL_DIVAS_MODE_ROOT + * @retval None + */ +__STATIC_INLINE void FL_DIVAS_SetMode(DIVAS_Type *DIVASx, uint32_t mode) +{ + MODIFY_REG(DIVASx->CR, DIVAS_CR_MODE_Msk, mode); +} + +/** + * @brief Get Work Mode + * @rmtoll CR MODE FL_DIVAS_GetMode + * @param DIVASx DIVAS instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_DIVAS_MODE_DIV + * @arg @ref FL_DIVAS_MODE_ROOT + */ +__STATIC_INLINE uint32_t FL_DIVAS_GetMode(DIVAS_Type *DIVASx) +{ + return (uint32_t)(READ_BIT(DIVASx->CR, DIVAS_CR_MODE_Msk)); +} + +/** + * @} + */ + +/** @defgroup DIVAS_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_DIVAS_DeInit(DIVAS_Type *DIVASx); +FL_ErrorStatus FL_DIVAS_Init(DIVAS_Type *DIVASx); +uint32_t FL_DIVAS_Hdiv_Calculation(DIVAS_Type *DIVASx, int32_t DivisorEnd, int16_t Divisor, int32_t *Quotient, int16_t *Residue); +uint32_t FL_DIVAS_Root_Calculation(DIVAS_Type *DIVASx, uint32_t Root, uint16_t *Result); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_DIVAS_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-14*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_dma.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_dma.h new file mode 100644 index 0000000..685a89c --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_dma.h @@ -0,0 +1,1257 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_dma.h + * @author FMSH Application Team + * @brief Head file of DMA FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_DMA_H +#define __FM33LG0XX_FL_DMA_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup DMA DMA + * @brief DMA FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup DMA_FL_ES_INIT DMA Exported Init structures + * @{ + */ + +/** + * @brief FL DMA Init Sturcture definition + */ +typedef struct +{ + /*! DMA外设映射地址 */ + uint32_t periphAddress; + /*! DMA传输方向 */ + uint32_t direction; + /*! RAM地址增长方向 */ + uint32_t memoryAddressIncMode; + /*! RAM地址增长方向 */ + uint32_t flashAddressIncMode; + /*! DAM传输通道数据位宽 */ + uint32_t dataSize; + /*! DMA通道优先级 */ + uint32_t priority; + /*! 循环模式使能 */ + uint32_t circMode; + +} FL_DMA_InitTypeDef; + +/** + * @brief FL DMA Config Sturcture definition + */ +typedef struct +{ + /*! RAM地址 */ + uint32_t memoryAddress; + /*! DMA传输数据字节个数 */ + uint32_t transmissionCount; + +} FL_DMA_ConfigTypeDef; + +/** + * @brief Configuration with temporary structure variable users will not be used directly + */ +typedef struct +{ + __IO uint32_t CHCR; + __IO uint32_t CHMAD; +} CHANNEL; + +/** + * @brief Configuration with temporary structure variable users will not be used directly + */ +typedef struct +{ + __IO uint32_t RESV; + __IO CHANNEL Channel[7]; + __IO uint32_t CH7CR; + __IO uint32_t CH7FLSAD; + __IO uint32_t CH7MAD; +} DMA_ADDR; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup DMA_FL_Exported_Constants DMA Exported Constants + * @{ + */ + +#define DMA_GCR_ADDRERR_IE_Pos (1U) +#define DMA_GCR_ADDRERR_IE_Msk (0x1U << DMA_GCR_ADDRERR_IE_Pos) +#define DMA_GCR_ADDRERR_IE DMA_GCR_ADDRERR_IE_Msk + +#define DMA_GCR_EN_Pos (0U) +#define DMA_GCR_EN_Msk (0x1U << DMA_GCR_EN_Pos) +#define DMA_GCR_EN DMA_GCR_EN_Msk + +#define DMA_CHCR_TSIZE_Pos (16U) +#define DMA_CHCR_TSIZE_Msk (0xffffU << DMA_CHCR_TSIZE_Pos) +#define DMA_CHCR_TSIZE DMA_CHCR_TSIZE_Msk + +#define DMA_CHCR_PRI_Pos (12U) +#define DMA_CHCR_PRI_Msk (0x3U << DMA_CHCR_PRI_Pos) +#define DMA_CHCR_PRI DMA_CHCR_PRI_Msk + +#define DMA_CHCR_INC_Pos (11U) +#define DMA_CHCR_INC_Msk (0x1U << DMA_CHCR_INC_Pos) +#define DMA_CHCR_INC DMA_CHCR_INC_Msk + +#define DMA_CH7CR_RAM_INC_Pos (9U) +#define DMA_CH7CR_RAM_INC_Msk (0x1UL << DMA_CH7CR_RAM_INC_Pos) +#define DMA_CH7CR_RAM_INC DMA_CH7CR_RAM_INC_Msk + +#define DMA_CH7CR_FLASH_INC_Pos (8U) +#define DMA_CH7CR_FLASH_INC_Msk (0x1UL << DMA_CH7CR_FLASH_INC_Pos) +#define DMA_CH7CR_INC DMA_CH7CR_FLASH_INC_Msk + +#define DMA_CHCR_SSEL_Pos (8U) +#define DMA_CHCR_SSEL_Msk (0x7U << DMA_CHCR_SSEL_Pos) +#define DMA_CHCR_SSEL DMA_CHCR_SSEL_Msk + +#define DMA_CHCR_DIR_Pos (6U) +#define DMA_CHCR_DIR_Msk (0x1U << DMA_CHCR_DIR_Pos) +#define DMA_CHCR_DIR DMA_CHCR_DIR_Msk + +#define DMA_CH7CR_DIR_Pos (10U) +#define DMA_CH7CR_DIR_Msk (0x1UL << DMA_CH7CR_DIR_Pos) +#define DMA_CH7CR_DIR DMA_CH7CR_DIR_Msk + +#define DMA_CHCR_BDW_Pos (4U) +#define DMA_CHCR_BDW_Msk (0x3U << DMA_CHCR_BDW_Pos) +#define DMA_CHCR_BDW DMA_CHCR_BDW_Msk + +#define DMA_CHCR_CIRC_Pos (3U) +#define DMA_CHCR_CIRC_Msk (0x1U << DMA_CHCR_CIRC_Pos) +#define DMA_CHCR_CIRC DMA_CHCR_CIRC_Msk + +#define DMA_CHCR_FTIE_Pos (2U) +#define DMA_CHCR_FTIE_Msk (0x1U << DMA_CHCR_FTIE_Pos) +#define DMA_CHCR_FTIE DMA_CHCR_FTIE_Msk + +#define DMA_CHCR_HTIE_Pos (1U) +#define DMA_CHCR_HTIE_Msk (0x1U << DMA_CHCR_HTIE_Pos) +#define DMA_CHCR_HTIE DMA_CHCR_HTIE_Msk + +#define DMA_CHCR_EN_Pos (0U) +#define DMA_CHCR_EN_Msk (0x1U << DMA_CHCR_EN_Pos) +#define DMA_CHCR_EN DMA_CHCR_EN_Msk + +#define DMA_ISR_ADDRERR_Pos (16U) +#define DMA_ISR_ADDRERR_Msk (0x1U << DMA_ISR_ADDRERR_Pos) +#define DMA_ISR_ADDRERR DMA_ISR_ADDRERR_Msk + +#define DMA_ISR_CHFT_Pos (8U) +#define DMA_ISR_CHFT_Msk (0x1U << DMA_ISR_CHFT_Pos) +#define DMA_ISR_CHFT DMA_ISR_CHFT_Msk + +#define DMA_ISR_CHHT_Pos (0U) +#define DMA_ISR_CHHT_Msk (0x1U << DMA_ISR_CHHT_Pos) +#define DMA_ISR_CHHT DMA_ISR_CHHT_Msk + + + +#define FL_DMA_CHANNEL_0 (0x0U << 0U) +#define FL_DMA_CHANNEL_1 (0x1U << 0U) +#define FL_DMA_CHANNEL_2 (0x2U << 0U) +#define FL_DMA_CHANNEL_3 (0x3U << 0U) +#define FL_DMA_CHANNEL_4 (0x4U << 0U) +#define FL_DMA_CHANNEL_5 (0x5U << 0U) +#define FL_DMA_CHANNEL_6 (0x6U << 0U) +#define FL_DMA_CHANNEL_7 (0x7U << 0U) + + + +#define FL_DMA_PRIORITY_LOW (0x0U << DMA_CHCR_PRI_Pos) +#define FL_DMA_PRIORITY_MEDIUM (0x1U << DMA_CHCR_PRI_Pos) +#define FL_DMA_PRIORITY_HIGH (0x2U << DMA_CHCR_PRI_Pos) +#define FL_DMA_PRIORITY_VERYHIGH (0x3U << DMA_CHCR_PRI_Pos) + + +#define FL_DMA_MEMORY_INC_MODE_INCREASE (0x1U << DMA_CHCR_INC_Pos) +#define FL_DMA_MEMORY_INC_MODE_DECREASE (0x0U << DMA_CHCR_INC_Pos) +#define FL_DMA_CH7_RAM_INC_MODE_INCREASE (0x1U << DMA_CH7CR_RAM_INC_Pos) +#define FL_DMA_CH7_RAM_INC_MODE_DECREASE (0x0U << DMA_CH7CR_RAM_INC_Pos) +#define FL_DMA_CH7_FLASH_INC_MODE_INCREASE (0x1U << DMA_CH7CR_FLASH_INC_Pos) +#define FL_DMA_CH7_FLASH_INC_MODE_DECREASE (0x0U << DMA_CH7CR_FLASH_INC_Pos) + + +#define FL_DMA_PERIPHERAL_FUNCTION1 (0x0U << DMA_CHCR_SSEL_Pos) +#define FL_DMA_PERIPHERAL_FUNCTION2 (0x1U << DMA_CHCR_SSEL_Pos) +#define FL_DMA_PERIPHERAL_FUNCTION3 (0x2U << DMA_CHCR_SSEL_Pos) +#define FL_DMA_PERIPHERAL_FUNCTION4 (0x3U << DMA_CHCR_SSEL_Pos) +#define FL_DMA_PERIPHERAL_FUNCTION5 (0x4U << DMA_CHCR_SSEL_Pos) +#define FL_DMA_PERIPHERAL_FUNCTION6 (0x5U << DMA_CHCR_SSEL_Pos) +#define FL_DMA_PERIPHERAL_FUNCTION7 (0x6U << DMA_CHCR_SSEL_Pos) +#define FL_DMA_PERIPHERAL_FUNCTION8 (0x7U << DMA_CHCR_SSEL_Pos) + + +#define FL_DMA_DIR_PERIPHERAL_TO_RAM (0x0U << DMA_CHCR_DIR_Pos) +#define FL_DMA_DIR_RAM_TO_PERIPHERAL (0x1U << DMA_CHCR_DIR_Pos) +#define FL_DMA_DIR_FLASH_TO_RAM (0x1U << DMA_CH7CR_DIR_Pos) +#define FL_DMA_DIR_RAM_TO_FLASH (0x0U << DMA_CH7CR_DIR_Pos) + + +#define FL_DMA_BANDWIDTH_8B (0x0U << DMA_CHCR_BDW_Pos) +#define FL_DMA_BANDWIDTH_16B (0x1U << DMA_CHCR_BDW_Pos) +#define FL_DMA_BANDWIDTH_32B (0x2U << DMA_CHCR_BDW_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup DMA_FL_Exported_Functions DMA Exported Functions + * @{ + */ + +/** + * @brief DMA address error interrupt enable + * @rmtoll GCR ADDRERR_IE FL_DMA_EnableIT_AddressError + * @param DMAx DMA instance + * @retval None + */ +__STATIC_INLINE void FL_DMA_EnableIT_AddressError(DMA_Type *DMAx) +{ + SET_BIT(DMAx->GCR, DMA_GCR_ADDRERR_IE_Msk); +} + +/** + * @brief Get DMA address error interrupt enable status + * @rmtoll GCR ADDRERR_IE FL_DMA_IsEnabledIT_AddressError + * @param DMAx DMA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DMA_IsEnabledIT_AddressError(DMA_Type *DMAx) +{ + return (uint32_t)(READ_BIT(DMAx->GCR, DMA_GCR_ADDRERR_IE_Msk) == DMA_GCR_ADDRERR_IE_Msk); +} + +/** + * @brief DMA address error interrupt disable + * @rmtoll GCR ADDRERR_IE FL_DMA_DisableIT_AddressError + * @param DMAx DMA instance + * @retval None + */ +__STATIC_INLINE void FL_DMA_DisableIT_AddressError(DMA_Type *DMAx) +{ + CLEAR_BIT(DMAx->GCR, DMA_GCR_ADDRERR_IE_Msk); +} + +/** + * @brief DMA enable + * @rmtoll GCR EN FL_DMA_Enable + * @param DMAx DMA instance + * @retval None + */ +__STATIC_INLINE void FL_DMA_Enable(DMA_Type *DMAx) +{ + SET_BIT(DMAx->GCR, DMA_GCR_EN_Msk); +} + +/** + * @brief Get DMA enable status + * @rmtoll GCR EN FL_DMA_IsEnabled + * @param DMAx DMA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DMA_IsEnabled(DMA_Type *DMAx) +{ + return (uint32_t)(READ_BIT(DMAx->GCR, DMA_GCR_EN_Msk) == DMA_GCR_EN_Msk); +} + +/** + * @brief DMA disable + * @rmtoll GCR EN FL_DMA_Disable + * @param DMAx DMA instance + * @retval None + */ +__STATIC_INLINE void FL_DMA_Disable(DMA_Type *DMAx) +{ + CLEAR_BIT(DMAx->GCR, DMA_GCR_EN_Msk); +} + +/** + * @brief Set channelx transmission length + * @rmtoll CHCR TSIZE FL_DMA_WriteTransmissionSize + * @param DMAx DMA instance + * @param size + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_WriteTransmissionSize(DMA_Type *DMAx, uint32_t size, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + MODIFY_REG(Temp->Channel[channel].CHCR, (0xffffU << 16U), (size << 16U)); + } + else + { + MODIFY_REG(Temp->CH7CR, (0xfffU << 16U), (size << 16U)); + } +} + +/** + * @brief Get channelx transmission length + * @rmtoll CHCR TSIZE FL_DMA_ReadTransmissionSize + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval + */ +__STATIC_INLINE uint32_t FL_DMA_ReadTransmissionSize(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + return (uint32_t)(READ_BIT(Temp->Channel[channel].CHCR, (0xffffU << 16)) >> 16U); + } + else + { + return (uint32_t)(READ_BIT(Temp->CH7CR, (0xffffU << 16)) >> 16U); + } +} + +/** + * @brief Set channelx priority + * @rmtoll CHCR PRI FL_DMA_SetPriority + * @param DMAx DMA instance + * @param priority This parameter can be one of the following values: + * @arg @ref FL_DMA_PRIORITY_LOW + * @arg @ref FL_DMA_PRIORITY_MEDIUM + * @arg @ref FL_DMA_PRIORITY_HIGH + * @arg @ref FL_DMA_PRIORITY_VERYHIGH + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_SetPriority(DMA_Type *DMAx, uint32_t priority, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + MODIFY_REG(Temp->Channel[channel].CHCR, DMA_CHCR_PRI_Msk, priority); + } + else + { + MODIFY_REG(Temp->CH7CR, DMA_CHCR_PRI_Msk, priority); + } +} + +/** + * @brief Get channelx priority + * @rmtoll CHCR PRI FL_DMA_GetPriority + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref FL_DMA_PRIORITY_LOW + * @arg @ref FL_DMA_PRIORITY_MEDIUM + * @arg @ref FL_DMA_PRIORITY_HIGH + * @arg @ref FL_DMA_PRIORITY_VERYHIGH + */ +__STATIC_INLINE uint32_t FL_DMA_GetPriority(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + return (uint32_t)(READ_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_PRI_Msk)); + } + else + { + return (uint32_t)(READ_BIT(Temp->CH7CR, DMA_CHCR_PRI_Msk)); + } +} + +/** + * @brief Set channelx RAM address incremental + * @rmtoll CHCR INC FL_DMA_SetMemoryIncrementMode + + * @param DMAx DMA instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_DMA_MEMORY_INC_MODE_INCREASE + * @arg @ref FL_DMA_MEMORY_INC_MODE_DECREASE + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_SetMemoryIncrementMode(DMA_Type *DMAx, uint32_t mode, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + MODIFY_REG(Temp->Channel[channel].CHCR, DMA_CHCR_INC_Msk, mode); + } + else + { + MODIFY_REG(Temp->CH7CR, DMA_CH7CR_RAM_INC_Msk, mode); + } +} + +/** + * @brief Get channelx RAM address incremental status + * @rmtoll CHCR INC FL_DMA_GetMemoryIncrementMode + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref FL_DMA_MEMORY_INC_MODE_INCREASE + * @arg @ref FL_DMA_MEMORY_INC_MODE_DECREASE + * @arg @ref FL_DMA_CH7_RAM_INC_MODE_INCREASE + * @arg @ref FL_DMA_CH7_RAM_INC_MODE_REDUCE + */ +__STATIC_INLINE uint32_t FL_DMA_GetMemoryIncrementMode(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + return (uint32_t)(READ_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_INC_Msk)); + } + else + { + return (uint32_t)(READ_BIT(Temp->CH7CR, DMA_CH7CR_RAM_INC_Msk)); + } +} + +/** + * @brief + * @rmtoll CH7CR INC FL_DMA_SetFlashAddrIncremental + * @param DMAx DMA instance + * @param Incremental This parameter can be one of the following values: + * @arg @ref FL_DMA_CH7_FLASH_INC_MODE_INCREASE + * @arg @ref FL_DMA_CH7_FLASH_INC_MODE_REDUCE + * @retval None + */ +__STATIC_INLINE void FL_DMA_SetFlashAddrIncremental(DMA_Type *DMAx, uint32_t Incremental) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + MODIFY_REG(Temp->CH7CR, DMA_CH7CR_FLASH_INC_Msk, Incremental); +} + +/** + * @brief + * @rmtoll CHCR INC FL_DMA_GetFlashAddrIncremental + * @param DMAx DMA instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_DMA_CH7_FLASH_ADDR_INCREASE + * @arg @ref FL_DMA_CH7_FLASH_ADDR_REDUCE + */ +__STATIC_INLINE uint32_t FL_DMA_GetFlashAddrIncremental(DMA_Type *DMAx) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + return (uint32_t)(READ_BIT(Temp->CH7CR, DMA_CH7CR_FLASH_INC_Msk)); +} + +/** + * @brief Channelx request source select + * @rmtoll CHCR SSEL FL_DMA_SetPeripheralMap + * @param DMAx DMA instance + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION1 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION2 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION3 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION4 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION5 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION6 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION7 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION8 + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_SetPeripheralMap(DMA_Type *DMAx, uint32_t peripheral, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + MODIFY_REG(Temp->Channel[channel].CHCR, DMA_CHCR_SSEL_Msk, peripheral); + } +} + +/** + * @brief Get Channelx request source select status + * @rmtoll CHCR SSEL FL_DMA_GetPeripheralMap + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION1 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION2 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION3 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION4 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION5 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION6 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION7 + * @arg @ref FL_DMA_PERIPHERAL_FUNCTION8 + */ +__STATIC_INLINE uint32_t FL_DMA_GetPeripheralMap(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + return (uint32_t)(READ_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_SSEL_Msk)); + } + return 0; +} + +/** + * @brief Set channelx transmit direction + * @rmtoll CHCR DIR FL_DMA_SetTransmissionDirection + * @param DMAx DMA instance + * @param direction This parameter can be one of the following values: + * @arg @ref FL_DMA_DIR_PERIPHERAL_TO_RAM + * @arg @ref FL_DMA_DIR_RAM_TO_PERIPHERAL + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_SetTransmissionDirection(DMA_Type *DMAx, uint32_t direction, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + MODIFY_REG(Temp->Channel[channel].CHCR, DMA_CHCR_DIR_Msk, direction); + } + else + { + MODIFY_REG(Temp->CH7CR, DMA_CH7CR_DIR_Msk, direction); + } +} + +/** + * @brief Get channelx transmit direction + * @rmtoll CHCR DIR FL_DMA_GetTransmissionDirection + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref FL_DMA_DIR_PERIPHERAL_TO_RAM + * @arg @ref FL_DMA_DIR_RAM_TO_PERIPHERAL + */ +__STATIC_INLINE uint32_t FL_DMA_GetTransmissionDirection(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + return (uint32_t)(READ_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_DIR_Msk)); + } + else + { + return (uint32_t)(READ_BIT(Temp->CH7CR, DMA_CH7CR_DIR_Msk)); + } +} + +/** + * @brief Set transmit bandwidth + * @rmtoll CHCR BDW FL_DMA_SetBandwidth + * @param DMAx DMA instance + * @param bandwidth This parameter can be one of the following values: + * @arg @ref FL_DMA_BANDWIDTH_8B + * @arg @ref FL_DMA_BANDWIDTH_16B + * @arg @ref FL_DMA_BANDWIDTH_32B + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_SetBandwidth(DMA_Type *DMAx, uint32_t bandwidth, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + MODIFY_REG(Temp->Channel[channel].CHCR, DMA_CHCR_BDW_Msk, bandwidth); + } +} + +/** + * @brief Get transmit bandwidth + * @rmtoll CHCR BDW FL_DMA_GetBandwidth + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref FL_DMA_BANDWIDTH_8B + * @arg @ref FL_DMA_BANDWIDTH_16B + * @arg @ref FL_DMA_BANDWIDTH_32B + */ +__STATIC_INLINE uint32_t FL_DMA_GetBandwidth(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + return (uint32_t)(READ_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_BDW_Msk)); + } + else + { + /* FLASH 通道 默认位宽32Bit */ + return FL_DMA_BANDWIDTH_32B; + } +} + +/** + * @brief Circular mode enable + * @rmtoll CHCR CIRC FL_DMA_EnableCircularMode + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_EnableCircularMode(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + SET_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_CIRC_Msk); + } + else + { + SET_BIT(Temp->CH7CR, DMA_CHCR_CIRC_Msk); + } +} + +/** + * @brief Get circular mode enable status + * @rmtoll CHCR CIRC FL_DMA_IsEnabledCircularMode + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DMA_IsEnabledCircularMode(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + return (uint32_t)(READ_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_CIRC_Msk) == DMA_CHCR_CIRC_Msk); + } + else + { + return (uint32_t)(READ_BIT(Temp->CH7CR, DMA_CHCR_CIRC_Msk) == DMA_CHCR_CIRC_Msk); + } +} + +/** + * @brief Circular mode disable + * @rmtoll CHCR CIRC FL_DMA_DisableCircularMode + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_DisableCircularMode(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + CLEAR_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_CIRC_Msk); + } + else + { + CLEAR_BIT(Temp->CH7CR, DMA_CHCR_CIRC_Msk); + } +} + +/** + * @brief channelx transmit finished interrupt enable + * @rmtoll CHCR FTIE FL_DMA_EnableIT_TransferComplete + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_EnableIT_TransferComplete(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + SET_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_FTIE_Msk); + } + else + { + SET_BIT(Temp->CH7CR, DMA_CHCR_FTIE_Msk); + } +} + +/** + * @brief Get channelx transmit finished interrupt enable status + * @rmtoll CHCR FTIE FL_DMA_IsEnabledIT_TransferComplete + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DMA_IsEnabledIT_TransferComplete(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + return (uint32_t)(READ_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_FTIE_Msk) == DMA_CHCR_FTIE_Msk); + } + else + { + return (uint32_t)(READ_BIT(Temp->CH7CR, DMA_CHCR_FTIE_Msk) == DMA_CHCR_FTIE_Msk); + } +} + +/** + * @brief channelx transmit finished interrupt disable + * @rmtoll CHCR FTIE FL_DMA_DisableIT_TransferComplete + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_DisableIT_TransferComplete(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + CLEAR_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_FTIE_Msk); + } + else + { + CLEAR_BIT(Temp->CH7CR, DMA_CHCR_FTIE_Msk); + } +} + +/** + * @brief Channelx Half-transfer interrupt enable + * @rmtoll CHCR HTIE FL_DMA_EnableIT_TransferHalfComplete + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_EnableIT_TransferHalfComplete(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + SET_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_HTIE_Msk); + } + else + { + SET_BIT(Temp->CH7CR, DMA_CHCR_HTIE_Msk); + } +} + +/** + * @brief Get Channelx Half-transfer interrupt enable status + * @rmtoll CHCR HTIE FL_DMA_IsEnabledIT_TransferHalfComplete + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DMA_IsEnabledIT_TransferHalfComplete(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + return (uint32_t)(READ_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_HTIE_Msk) == DMA_CHCR_HTIE_Msk); + } + else + { + return (uint32_t)(READ_BIT(Temp->CH7CR, DMA_CHCR_HTIE_Msk) == DMA_CHCR_HTIE_Msk); + } +} + +/** + * @brief Channelx Half-transfer interrupt disable + * @rmtoll CHCR HTIE FL_DMA_DisableIT_TransferHalfComplete + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_DisableIT_TransferHalfComplete(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + CLEAR_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_HTIE_Msk); + } + else + { + CLEAR_BIT(Temp->CH7CR, DMA_CHCR_HTIE_Msk); + } +} + +/** + * @brief Channelx enable + * @rmtoll CHCR EN FL_DMA_EnableChannel + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_EnableChannel(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + SET_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_EN_Msk); + } + else + { + SET_BIT(Temp->CH7CR, DMA_CHCR_EN_Msk); + } +} + +/** + * @brief Get channelx enable status + * @rmtoll CHCR EN FL_DMA_IsEnabledChannel + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DMA_IsEnabledChannel(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + return (uint32_t)(READ_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_EN_Msk) == DMA_CHCR_EN_Msk); + } + else + { + return (uint32_t)(READ_BIT(Temp->CH7CR, DMA_CHCR_CIRC_Msk) == DMA_CHCR_EN_Msk); + } +} + +/** + * @brief Channelx disable + * @rmtoll CHCR EN FL_DMA_DisableChannel + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_DisableChannel(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + CLEAR_BIT(Temp->Channel[channel].CHCR, DMA_CHCR_EN_Msk); + } + else + { + CLEAR_BIT(Temp->CH7CR, DMA_CHCR_EN_Msk); + } +} + +/** + * @brief Set channelx memory pointer address + * @rmtoll MEMAD FL_DMA_WriteMemoryAddress + * @param DMAx DMA instance + * @param data + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_WriteMemoryAddress(DMA_Type *DMAx, uint32_t data, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + MODIFY_REG(Temp->Channel[channel].CHMAD, (0xffffffffU), (data)); + } + else + { + MODIFY_REG(Temp->CH7MAD, (0xfffU), (data)); + } +} + +/** + * @brief Get channelx memory pointer address + * @rmtoll MEMAD FL_DMA_ReadMemoryAddress + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval + */ +__STATIC_INLINE uint32_t FL_DMA_ReadMemoryAddress(DMA_Type *DMAx, uint32_t channel) +{ + DMA_ADDR *Temp = (DMA_ADDR *)DMAx; + if(channel <= FL_DMA_CHANNEL_6) + { + return (uint32_t)(READ_BIT(Temp->Channel[channel].CHMAD, (0xffffffffU))); + } + else + { + return (uint32_t)(READ_BIT(Temp->CH7MAD, (0xfffU))); + } +} + +/** + * @brief Set channel7 flash pointer address + * @rmtoll CH7FLSAD FL_DMA_WriteFlashAddress + * @param DMAx DMA instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_DMA_WriteFlashAddress(DMA_Type *DMAx, uint32_t data) +{ + MODIFY_REG(DMAx->CH7FLSAD, (0x7fffU << 0U), (data << 0U)); +} + +/** + * @brief Get channel7 flash pointer address + * @rmtoll CH7FLSAD FL_DMA_ReadFlashAddress + * @param DMAx DMA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_DMA_ReadFlashAddress(DMA_Type *DMAx) +{ + return (uint32_t)(READ_BIT(DMAx->CH7FLSAD, (0x7fffU << 0U)) >> 0U); +} + +/** + * @brief Get DMA address error flag + * @rmtoll ISR ADDRERR FL_DMA_IsActiveFlag_AddressError + * @param DMAx DMA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DMA_IsActiveFlag_AddressError(DMA_Type *DMAx) +{ + return (uint32_t)(READ_BIT(DMAx->ISR, DMA_ISR_ADDRERR_Msk) == (DMA_ISR_ADDRERR_Msk)); +} + +/** + * @brief Clear DMA address error flag + * @rmtoll ISR ADDRERR FL_DMA_ClearFlag_AddressError + * @param DMAx DMA instance + * @retval None + */ +__STATIC_INLINE void FL_DMA_ClearFlag_AddressError(DMA_Type *DMAx) +{ + WRITE_REG(DMAx->ISR, DMA_ISR_ADDRERR_Msk); +} + +/** + * @brief Get DMA channelx finished-transfer flag + * @rmtoll ISR CHFT FL_DMA_IsActiveFlag_TransferComplete + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DMA_IsActiveFlag_TransferComplete(DMA_Type *DMAx, uint32_t channel) +{ + return (uint32_t)(uint32_t)(READ_BIT(DMAx->ISR, (DMA_ISR_CHFT_Msk << channel)) + == (DMA_ISR_CHFT_Msk << channel)); +} + +/** + * @brief Clear DMA channelx finished-transfer flag + * @rmtoll ISR CHFT FL_DMA_ClearFlag_TransferComplete + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_ClearFlag_TransferComplete(DMA_Type *DMAx, uint32_t channel) +{ + WRITE_REG(DMAx->ISR, (DMA_ISR_CHFT_Msk << channel)); +} + +/** + * @brief Get DMA channel half-transfer flag + * @rmtoll ISR CHHT FL_DMA_IsActiveFlag_TransferHalfComplete + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_DMA_IsActiveFlag_TransferHalfComplete(DMA_Type *DMAx, uint32_t channel) +{ + return (uint32_t)(uint32_t)(READ_BIT(DMAx->ISR, (DMA_ISR_CHHT_Msk << channel)) + == (DMA_ISR_CHHT_Msk << channel)); +} + +/** + * @brief Clear DMA channel half-transfer flag + * @rmtoll ISR CHHT FL_DMA_ClearFlag_TransferHalfComplete + * @param DMAx DMA instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void FL_DMA_ClearFlag_TransferHalfComplete(DMA_Type *DMAx, uint32_t channel) +{ + WRITE_REG(DMAx->ISR, (DMA_ISR_CHHT_Msk << channel)); +} + +/** + * @} + */ + +/** @defgroup DMA_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_DMA_DeInit(DMA_Type *DMAx); +FL_ErrorStatus FL_DMA_Init(DMA_Type *DMAx, FL_DMA_InitTypeDef *initStruct, uint32_t channel); +void FL_DMA_StructInit(FL_DMA_InitTypeDef *InitStruct); + +FL_ErrorStatus FL_DMA_StartTransmission(DMA_Type *DMAx, FL_DMA_ConfigTypeDef *configStruct, uint32_t channel); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_DMA_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.1 @ 2020-10-20*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_exti.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_exti.h new file mode 100644 index 0000000..1a16330 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_exti.h @@ -0,0 +1,132 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_exti.h + * @author FMSH Application Team + * @brief Head file of EXTI FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_EXTI_H +#define __FM33LG0XX_FL_EXTI_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup EXTI EXTI + * @brief EXTI FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup EXTI_FL_ES_INIT EXTI Exported Init structures + * @{ + */ + +/** + * @brief FL EXTI Common Init Sturcture definition + */ +typedef struct +{ + /*! EXTI时钟源配置 */ + uint32_t clockSource; + +} FL_EXTI_CommonInitTypeDef; + +/** + * @brief FL EXTI Init Sturcture definition + */ +typedef struct +{ + /*! EXTI输入配置 */ + uint32_t input; + + /*! EXTI触发边沿配置 */ + uint32_t triggerEdge; + + /*! EXTI数字滤波配置 */ + uint32_t filter; + +} FL_EXTI_InitTypeDef; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup EXTI_FL_Exported_Constants EXTI Exported Constants + * @{ + */ + + + +#define FL_GPIO_EXTI_INPUT_GROUP0 (0x0U << 0U) +#define FL_GPIO_EXTI_INPUT_GROUP1 (0x1U << 0U) +#define FL_GPIO_EXTI_INPUT_GROUP2 (0x2U << 0U) +#define FL_GPIO_EXTI_INPUT_GROUP3 (0x3U << 0U) + + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup EXTI_FL_Exported_Functions EXTI Exported Functions + * @{ + */ + +/** + * @} + */ + +/** @defgroup EXTI_FL_EF_Init Initialization and de-initialization functions + * @{ + */ + +FL_ErrorStatus FL_EXTI_CommonInit(FL_EXTI_CommonInitTypeDef *init); +FL_ErrorStatus FL_EXTI_CommonDeinit(void); +void FL_EXTI_CommonStructInit(FL_EXTI_CommonInitTypeDef *init); + +FL_ErrorStatus FL_EXTI_Init(uint32_t extiLineX, FL_EXTI_InitTypeDef *init); +FL_ErrorStatus FL_EXTI_DeInit(uint32_t extiLineX); +void FL_EXTI_StructInit(FL_EXTI_InitTypeDef *init); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_EXTI_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.2 @ 2021-03-16*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_flash.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_flash.h new file mode 100644 index 0000000..6dea4ee --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_flash.h @@ -0,0 +1,1020 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_flash.h + * @author FMSH Application Team + * @brief Head file of FLASH FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_FLASH_H +#define __FM33LG0XX_FL_FLASH_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup FLASH FLASH + * @brief FLASH FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup FLASH_FL_ES_INIT FLASH Exported Init structures + * @{ + */ + +/** + * @brief FL FLASH Init Sturcture definition + */ + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup FLASH_FL_Exported_Constants FLASH Exported Constants + * @{ + */ + +#define FLASH_RDCR_WAIT_Pos (0U) +#define FLASH_RDCR_WAIT_Msk (0x3U << FLASH_RDCR_WAIT_Pos) +#define FLASH_RDCR_WAIT FLASH_RDCR_WAIT_Msk + +#define FLASH_PFCR_PFTBUF_Pos (1U) +#define FLASH_PFCR_PFTBUF_Msk (0x1U << FLASH_PFCR_PFTBUF_Pos) +#define FLASH_PFCR_PFTBUF FLASH_PFCR_PFTBUF_Msk + +#define FLASH_PFCR_PRFTEN_Pos (0U) +#define FLASH_PFCR_PRFTEN_Msk (0x1U << FLASH_PFCR_PRFTEN_Pos) +#define FLASH_PFCR_PRFTEN FLASH_PFCR_PRFTEN_Msk + +#define FLASH_OPTBR_IWDTSLP_Pos (31U) +#define FLASH_OPTBR_IWDTSLP_Msk (0x1U << FLASH_OPTBR_IWDTSLP_Pos) +#define FLASH_OPTBR_IWDTSLP FLASH_OPTBR_IWDTSLP_Msk + +#define FLASH_OPTBR_IFLOCK_Pos (17U) +#define FLASH_OPTBR_IFLOCK_Msk (0x3U << FLASH_OPTBR_IFLOCK_Pos) +#define FLASH_OPTBR_IFLOCK FLASH_OPTBR_IFLOCK_Msk + +#define FLASH_OPTBR_DFLSEN_Pos (10U) +#define FLASH_OPTBR_DFLSEN_Msk (0x1U << FLASH_OPTBR_DFLSEN_Pos) +#define FLASH_OPTBR_DFLSEN FLASH_OPTBR_DFLSEN_Msk + +#define FLASH_OPTBR_BTSEN_Pos (8U) +#define FLASH_OPTBR_BTSEN_Msk (0x3U << FLASH_OPTBR_BTSEN_Pos) +#define FLASH_OPTBR_BTSEN FLASH_OPTBR_BTSEN_Msk + +#define FLASH_OPTBR_ACLOCKEN_Pos (2U) +#define FLASH_OPTBR_ACLOCKEN_Msk (0x3U << FLASH_OPTBR_ACLOCKEN_Pos) +#define FLASH_OPTBR_ACLOCKEN FLASH_OPTBR_ACLOCKEN_Msk + +#define FLASH_OPTBR_DBRDPEN_Pos (0U) +#define FLASH_OPTBR_DBRDPEN_Msk (0x3U << FLASH_OPTBR_DBRDPEN_Pos) +#define FLASH_OPTBR_DBRDPEN FLASH_OPTBR_DBRDPEN_Msk + +#define FLASH_EPCR_ERTYPE_Pos (8U) +#define FLASH_EPCR_ERTYPE_Msk (0x3U << FLASH_EPCR_ERTYPE_Pos) +#define FLASH_EPCR_ERTYPE FLASH_EPCR_ERTYPE_Msk + +#define FLASH_EPCR_PREQ_Pos (1U) +#define FLASH_EPCR_PREQ_Msk (0x1U << FLASH_EPCR_PREQ_Pos) +#define FLASH_EPCR_PREQ FLASH_EPCR_PREQ_Msk + +#define FLASH_EPCR_EREQ_Pos (0U) +#define FLASH_EPCR_EREQ_Msk (0x1U << FLASH_EPCR_EREQ_Pos) +#define FLASH_EPCR_EREQ FLASH_EPCR_EREQ_Msk + +#define FLASH_IER_OPTIE_Pos (11U) +#define FLASH_IER_OPTIE_Msk (0x1U << FLASH_IER_OPTIE_Pos) +#define FLASH_IER_OPTIE FLASH_IER_OPTIE_Msk + +#define FLASH_IER_AUTHIE_Pos (10U) +#define FLASH_IER_AUTHIE_Msk (0x1U << FLASH_IER_AUTHIE_Pos) +#define FLASH_IER_AUTHIE FLASH_IER_AUTHIE_Msk + +#define FLASH_IER_KEYIE_Pos (9U) +#define FLASH_IER_KEYIE_Msk (0x1U << FLASH_IER_KEYIE_Pos) +#define FLASH_IER_KEYIE FLASH_IER_KEYIE_Msk + +#define FLASH_IER_CKIE_Pos (8U) +#define FLASH_IER_CKIE_Msk (0x1U << FLASH_IER_CKIE_Pos) +#define FLASH_IER_CKIE FLASH_IER_CKIE_Msk + +#define FLASH_IER_PRDIE_Pos (1U) +#define FLASH_IER_PRDIE_Msk (0x1U << FLASH_IER_PRDIE_Pos) +#define FLASH_IER_PRDIE FLASH_IER_PRDIE_Msk + +#define FLASH_IER_ERDIE_Pos (0U) +#define FLASH_IER_ERDIE_Msk (0x1U << FLASH_IER_ERDIE_Pos) +#define FLASH_IER_ERDIE FLASH_IER_ERDIE_Msk + +#define FLASH_ISR_KEYSTA_Pos (17U) +#define FLASH_ISR_KEYSTA_Msk (0x7U << FLASH_ISR_KEYSTA_Pos) +#define FLASH_ISR_KEYSTA FLASH_ISR_KEYSTA_Msk + +#define FLASH_ISR_BTSF_Pos (16U) +#define FLASH_ISR_BTSF_Msk (0x1U << FLASH_ISR_BTSF_Pos) +#define FLASH_ISR_BTSF FLASH_ISR_BTSF_Msk + +#define FLASH_ISR_OPTERR_Pos (11U) +#define FLASH_ISR_OPTERR_Msk (0x1U << FLASH_ISR_OPTERR_Pos) +#define FLASH_ISR_OPTERR FLASH_ISR_OPTERR_Msk + +#define FLASH_ISR_AUTHERR_Pos (10U) +#define FLASH_ISR_AUTHERR_Msk (0x1U << FLASH_ISR_AUTHERR_Pos) +#define FLASH_ISR_AUTHERR FLASH_ISR_AUTHERR_Msk + +#define FLASH_ISR_KEYERR_Pos (9U) +#define FLASH_ISR_KEYERR_Msk (0x1U << FLASH_ISR_KEYERR_Pos) +#define FLASH_ISR_KEYERR FLASH_ISR_KEYERR_Msk + +#define FLASH_ISR_CKERR_Pos (8U) +#define FLASH_ISR_CKERR_Msk (0x1U << FLASH_ISR_CKERR_Pos) +#define FLASH_ISR_CKERR FLASH_ISR_CKERR_Msk + +#define FLASH_ISR_PRD_Pos (1U) +#define FLASH_ISR_PRD_Msk (0x1U << FLASH_ISR_PRD_Pos) +#define FLASH_ISR_PRD FLASH_ISR_PRD_Msk + +#define FLASH_ISR_ERD_Pos (0U) +#define FLASH_ISR_ERD_Msk (0x1U << FLASH_ISR_ERD_Pos) +#define FLASH_ISR_ERD FLASH_ISR_ERD_Msk + + +#define FL_FLASH_ERASE_KEY (0x96969696U) +#define FL_FLASH_CHIP_ERASE_KEY (0x7D7D7D7DU) +#define FL_FLASH_PGAE_ERASE_KEY (0xEAEAEAEAU) +#define FL_FLASH_SECTOR_ERASE_KEY (0x3C3C3C3CU) +#define FL_FLASH_ERASE_REQUEST (0x1234ABCDU) +#define FL_FLASH_PROGRAM_KEY1 (0xA5A5A5A5U) +#define FL_FLASH_PROGRAM_KEY2 (0xF1F1F1F1U) +/*8M*/ +#define FL_FLASH_ERASE_TIMEOUT (0x0000FFFFU) +#define FL_FLASH_ADDRS_ALIGN (0x00000004U) + +#define FL_FLASH_MAX_PAGE_NUM (0x00000200U) +#define FL_FLASH_MAX_SECTOR_NUM (0x00000080U) +#define FL_FLASH_SECTOR_SIZE_BYTE (0x00000800U) +#define FL_FLASH_PGAE_SIZE_BYTE (0x00000200U) +#define FL_FLASH_ADDR_MAXPROGRAM (0x0003FFFFU) + + +#define FL_FLASH_INFORMATION1_REGIN (0x1U << 17U) +#define FL_FLASH_INFORMATION2_REGIN (0x1U << 18U) +#define FL_FLASH_BLOCK_0 (0x1U << 0U) +#define FL_FLASH_BLOCK_1 (0x1U << 1U) +#define FL_FLASH_BLOCK_2 (0x1U << 2U) +#define FL_FLASH_BLOCK_3 (0x1U << 3U) +#define FL_FLASH_BLOCK_4 (0x1U << 4U) +#define FL_FLASH_BLOCK_5 (0x1U << 5U) +#define FL_FLASH_BLOCK_6 (0x1U << 6U) +#define FL_FLASH_BLOCK_7 (0x1U << 7U) +#define FL_FLASH_BLOCK_8 (0x1U << 8U) +#define FL_FLASH_BLOCK_9 (0x1U << 9U) +#define FL_FLASH_BLOCK_10 (0x1U << 10U) +#define FL_FLASH_BLOCK_11 (0x1U << 11U) +#define FL_FLASH_BLOCK_12 (0x1U << 12U) +#define FL_FLASH_BLOCK_13 (0x1U << 13U) +#define FL_FLASH_BLOCK_14 (0x1U << 14U) +#define FL_FLASH_BLOCK_15 (0x1U << 15U) +#define FL_FLASH_LOCK_ALL (0x0U << 0U) +#define FL_FLASH_LOCK_SOFTWARE (0x2U << 0U) +#define FL_FLASH_LOCK_NONE (0x3U << 0U) +#define FL_FLASH_BOOTSWAP_ENABLE (0x2U << 8U) +#define FL_FLASH_BOOTSWAP_DISABLE (0x0U << 8U) +#define FL_FLASH_APPCODE_LOCK_ENABLE (0x2U << 2U) +#define FL_FLASH_APPCODE_LOCK_DISABLE (0x0U << 2U) +#define FL_FLASH_DEBUG_READ_ENABLE (0x2U << 0U) +#define FL_FLASH_DEBUG_READ_DISABLE (0x0U << 0U) + + + +#define FL_FLASH_READ_WAIT_0CYCLE (0x0U << FLASH_RDCR_WAIT_Pos) +#define FL_FLASH_READ_WAIT_1CYCLE (0x1U << FLASH_RDCR_WAIT_Pos) +#define FL_FLASH_READ_WAIT_2CYCLE (0x2U << FLASH_RDCR_WAIT_Pos) + + +#define FL_FLASH_IWDT_STOP_UNDER_SLEEP (0x0U << FLASH_OPTBR_IWDTSLP_Pos) +#define FL_FLASH_IWDT_WORK_UNDER_SLEEP (0x1U << FLASH_OPTBR_IWDTSLP_Pos) + +#define FL_FLASH_IF_UNLOCK (0x0U << FLASH_OPTBR_IFLOCK_Pos) +#define FL_FLASH_IF_LOCK (0x1U << FLASH_OPTBR_IFLOCK_Pos) + +#define FL_FLASH_DATA_FLASH_DISABLE (0x0U << FLASH_OPTBR_DFLSEN_Pos) +#define FL_FLASH_DATA_FLASH_ENABLE (0x1U << FLASH_OPTBR_DFLSEN_Pos) + +#define FL_FLASH_BOOT_SWAP_DISABLE (0x0U << FLASH_OPTBR_BTSEN_Pos) +#define FL_FLASH_BOOT_SWAP_ENABLE (0x1U << FLASH_OPTBR_BTSEN_Pos) + +#define FL_FLASH_FLASH_LOCK_DISABLE (0x0U << FLASH_OPTBR_ACLOCKEN_Pos) +#define FL_FLASH_FLASH_LOCK_ENABLE (0x1U << FLASH_OPTBR_ACLOCKEN_Pos) + +#define FL_FLASH_SWD_READ_PEOTECTION_DISABLE (0x0U << FLASH_OPTBR_DBRDPEN_Pos) +#define FL_FLASH_SWD_READ_PEOTECTION_ENABLE (0x1U << FLASH_OPTBR_DBRDPEN_Pos) + +#define FL_FLASH_ERASE_TYPE_PAGE (0x0U << FLASH_EPCR_ERTYPE_Pos) +#define FL_FLASH_ERASE_TYPE_SECTOR (0x1U << FLASH_EPCR_ERTYPE_Pos) + + +#define FL_FLASH_KEY_STATUS_LOCK (0x0U << FLASH_ISR_KEYSTA_Pos) +#define FL_FLASH_KEY_STATUS_PAGE_ERASE (0x2U << FLASH_ISR_KEYSTA_Pos) +#define FL_FLASH_KEY_STATUS_PROGRAM (0x3U << FLASH_ISR_KEYSTA_Pos) +#define FL_FLASH_KEY_STATUS_ERROR (0x4U << FLASH_ISR_KEYSTA_Pos) +#define FL_FLASH_KEY_STATUS_SECTOR_ERASE (0x5U << FLASH_ISR_KEYSTA_Pos) + +#define FL_FLASH_BOOT_SECTOR_0000H_1FFFH (0x0U << FLASH_ISR_BTSF_Pos) +#define FL_FLASH_BOOT_SECTOR_2000H_3FFFH (0x1U << FLASH_ISR_BTSF_Pos) + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup FLASH_FL_Exported_Functions FLASH Exported Functions + * @{ + */ + +/** + * @brief Flash wait cycles config + * @rmtoll RDCR WAIT FL_FLASH_SetReadWait + * @param FLASHx FLASH instance + * @param wait This parameter can be one of the following values: + * @arg @ref FL_FLASH_READ_WAIT_0CYCLE + * @arg @ref FL_FLASH_READ_WAIT_1CYCLE + * @arg @ref FL_FLASH_READ_WAIT_2CYCLE + * @retval None + */ +__STATIC_INLINE void FL_FLASH_SetReadWait(FLASH_Type *FLASHx, uint32_t wait) +{ + MODIFY_REG(FLASHx->RDCR, FLASH_RDCR_WAIT_Msk, wait); +} + +/** + * @brief Get flash wait cycles config status + * @rmtoll RDCR WAIT FL_FLASH_GetReadWait + * @param FLASHx FLASH instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_FLASH_READ_WAIT_0CYCLE + * @arg @ref FL_FLASH_READ_WAIT_1CYCLE + * @arg @ref FL_FLASH_READ_WAIT_2CYCLE + */ +__STATIC_INLINE uint32_t FL_FLASH_GetReadWait(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->RDCR, FLASH_RDCR_WAIT_Msk)); +} + +/** + * @brief Prefetch buffer Enable + * @rmtoll PFCR PFTBUF FL_FLASH_EnablePrefetchBuffer + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_EnablePrefetchBuffer(FLASH_Type *FLASHx) +{ + SET_BIT(FLASHx->PFCR, FLASH_PFCR_PFTBUF_Msk); +} + +/** + * @brief Get prefetch buffer enable status + * @rmtoll PFCR PFTBUF FL_FLASH_IsEnabledPrefetchBuffer + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsEnabledPrefetchBuffer(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->PFCR, FLASH_PFCR_PFTBUF_Msk) == FLASH_PFCR_PFTBUF_Msk); +} + +/** + * @brief Prefetch buffer disable + * @rmtoll PFCR PFTBUF FL_FLASH_DisablePrefetchBuffer + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_DisablePrefetchBuffer(FLASH_Type *FLASHx) +{ + CLEAR_BIT(FLASHx->PFCR, FLASH_PFCR_PFTBUF_Msk); +} + +/** + * @brief Prefetch Enable + * @rmtoll PFCR PRFTEN FL_FLASH_EnablePrefetch + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_EnablePrefetch(FLASH_Type *FLASHx) +{ + SET_BIT(FLASHx->PFCR, FLASH_PFCR_PRFTEN_Msk); +} + +/** + * @brief Get prefetch enable status + * @rmtoll PFCR PRFTEN FL_FLASH_IsEnabledPrefetch + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsEnabledPrefetch(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->PFCR, FLASH_PFCR_PRFTEN_Msk) == FLASH_PFCR_PRFTEN_Msk); +} + +/** + * @brief Prefetch disable + * @rmtoll PFCR PRFTEN FL_FLASH_DisablePrefetch + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_DisablePrefetch(FLASH_Type *FLASHx) +{ + CLEAR_BIT(FLASHx->PFCR, FLASH_PFCR_PRFTEN_Msk); +} + +/** + * @brief Get IWDT sleep enable status + * @rmtoll OPTBR IWDTSLP FL_FLASH_GetIWDTStateUnderSleep + * @param FLASHx FLASH instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_FLASH_IWDT_STOP_UNDER_SLEEP + * @arg @ref FL_FLASH_IWDT_WORK_UNDER_SLEEP + */ +__STATIC_INLINE uint32_t FL_FLASH_GetIWDTStateUnderSleep(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->OPTBR, FLASH_OPTBR_IWDTSLP_Msk)); +} + +/** + * @brief Get information2 lock enable flag + * @rmtoll OPTBR IFLOCK FL_FLASH_IsActiveFlag_IFLockedState + * @param FLASHx FLASH instance + * @param region This parameter can be one of the following values: + * @arg @ref FL_FLASH_INFORMATION1_REGIN + * @arg @ref FL_FLASH_INFORMATION2_REGIN + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsActiveFlag_IFLockedState(FLASH_Type *FLASHx, uint32_t region) +{ + return (uint32_t)(READ_BIT(FLASHx->OPTBR, FLASH_OPTBR_IFLOCK_Msk) == (region)); +} + +/** + * @brief Get dataflash enable status + * @rmtoll OPTBR DFLSEN FL_FLASH_GetDataFlashState + * @param FLASHx FLASH instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_FLASH_DATA_FLASH_DISABLE + * @arg @ref FL_FLASH_DATA_FLASH_ENABLE + */ +__STATIC_INLINE uint32_t FL_FLASH_GetDataFlashState(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->OPTBR, FLASH_OPTBR_DFLSEN_Msk)); +} + +/** + * @brief Get BootSwap enable status + * @rmtoll OPTBR BTSEN FL_FLASH_GetBootSwapState + * @param FLASHx FLASH instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_FLASH_BOOT_SWAP_DISABLE + * @arg @ref FL_FLASH_BOOT_SWAP_ENABLE + */ +__STATIC_INLINE uint32_t FL_FLASH_GetBootSwapState(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->OPTBR, FLASH_OPTBR_BTSEN_Msk)); +} + +/** + * @brief Get AppCode lock enable + * @rmtoll OPTBR ACLOCKEN FL_FLASH_GetFlashLockState + * @param FLASHx FLASH instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_FLASH_FLASH_LOCK_DISABLE + * @arg @ref FL_FLASH_FLASH_LOCK_ENABLE + */ +__STATIC_INLINE uint32_t FL_FLASH_GetFlashLockState(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->OPTBR, FLASH_OPTBR_ACLOCKEN_Msk)); +} + +/** + * @brief Get debug read protection enable status + * @rmtoll OPTBR DBRDPEN FL_FLASH_GetSWDReadProtectionState + * @param FLASHx FLASH instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_FLASH_SWD_READ_PEOTECTION_DISABLE + * @arg @ref FL_FLASH_SWD_READ_PEOTECTION_ENABLE + */ +__STATIC_INLINE uint32_t FL_FLASH_GetSWDReadProtectionState(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->OPTBR, FLASH_OPTBR_DBRDPEN_Msk)); +} + +/** + * @brief Set ACLOCK register low 32 bit + * @rmtoll ACLOCK1 FL_FLASH_SetFlashLowRegionLock + * @param FLASHx FLASH instance + * @param region This parameter can be one of the following values: + * @arg @ref FL_FLASH_BLOCK_0 + * @arg @ref FL_FLASH_BLOCK_1 + * @arg @ref FL_FLASH_BLOCK_2 + * @arg @ref FL_FLASH_BLOCK_3 + * @arg @ref FL_FLASH_BLOCK_4 + * @arg @ref FL_FLASH_BLOCK_5 + * @arg @ref FL_FLASH_BLOCK_6 + * @arg @ref FL_FLASH_BLOCK_7 + * @arg @ref FL_FLASH_BLOCK_8 + * @arg @ref FL_FLASH_BLOCK_9 + * @arg @ref FL_FLASH_BLOCK_10 + * @arg @ref FL_FLASH_BLOCK_11 + * @arg @ref FL_FLASH_BLOCK_12 + * @arg @ref FL_FLASH_BLOCK_13 + * @arg @ref FL_FLASH_BLOCK_14 + * @arg @ref FL_FLASH_BLOCK_15 + * @param mode This parameter can be one of the following values: + * @arg @ref FL_FLASH_LOCK_ALL + * @arg @ref FL_FLASH_LOCK_SOFTWARE + * @arg @ref FL_FLASH_LOCK_NONE + * @retval None + */ +__STATIC_INLINE void FL_FLASH_SetFlashLowRegionLock(FLASH_Type *FLASHx, uint32_t region, uint32_t mode) +{ + CLEAR_BIT(FLASHx->ACLOCK1, ((region * region) * (((mode == 3) ? 0 : (~mode)) & 0x03))); +} + +/** + * @brief Get ACLOCK register low 32 bit status + * @rmtoll ACLOCK1 FL_FLASH_GetFlashLowRegionLock + * @param FLASHx FLASH instance + * @param region This parameter can be one of the following values: + * @arg @ref FL_FLASH_BLOCK_0 + * @arg @ref FL_FLASH_BLOCK_1 + * @arg @ref FL_FLASH_BLOCK_2 + * @arg @ref FL_FLASH_BLOCK_3 + * @arg @ref FL_FLASH_BLOCK_4 + * @arg @ref FL_FLASH_BLOCK_5 + * @arg @ref FL_FLASH_BLOCK_6 + * @arg @ref FL_FLASH_BLOCK_7 + * @arg @ref FL_FLASH_BLOCK_8 + * @arg @ref FL_FLASH_BLOCK_9 + * @arg @ref FL_FLASH_BLOCK_10 + * @arg @ref FL_FLASH_BLOCK_11 + * @arg @ref FL_FLASH_BLOCK_12 + * @arg @ref FL_FLASH_BLOCK_13 + * @arg @ref FL_FLASH_BLOCK_14 + * @arg @ref FL_FLASH_BLOCK_15 + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_FLASH_GetFlashLowRegionLock(FLASH_Type *FLASHx, uint32_t region) +{ + return (uint32_t)(READ_BIT(FLASHx->ACLOCK1, ((region * region) * 0x03)) / (region * region)); +} + +/** + * @brief Set ACLOCK register high 32 bit + * @rmtoll ACLOCK2 FL_FLASH_SetFlashHighRegionLock + * @param FLASHx FLASH instance + * @param region This parameter can be one of the following values: + * @arg @ref FL_FLASH_BLOCK_0 + * @arg @ref FL_FLASH_BLOCK_1 + * @arg @ref FL_FLASH_BLOCK_2 + * @arg @ref FL_FLASH_BLOCK_3 + * @arg @ref FL_FLASH_BLOCK_4 + * @arg @ref FL_FLASH_BLOCK_5 + * @arg @ref FL_FLASH_BLOCK_6 + * @arg @ref FL_FLASH_BLOCK_7 + * @arg @ref FL_FLASH_BLOCK_8 + * @arg @ref FL_FLASH_BLOCK_9 + * @arg @ref FL_FLASH_BLOCK_10 + * @arg @ref FL_FLASH_BLOCK_11 + * @arg @ref FL_FLASH_BLOCK_12 + * @arg @ref FL_FLASH_BLOCK_13 + * @arg @ref FL_FLASH_BLOCK_14 + * @arg @ref FL_FLASH_BLOCK_15 + * @param mode This parameter can be one of the following values: + * @arg @ref FL_FLASH_LOCK_ALL + * @arg @ref FL_FLASH_LOCK_SOFTWARE + * @arg @ref FL_FLASH_LOCK_NONE + * @retval None + */ +__STATIC_INLINE void FL_FLASH_SetFlashHighRegionLock(FLASH_Type *FLASHx, uint32_t region, uint32_t mode) +{ + CLEAR_BIT(FLASHx->ACLOCK2, ((region * region) * (((mode == 3) ? 0 : (~mode)) & 0x03))); +} + +/** + * @brief Get ACLOCK register high 32 bit status + * @rmtoll ACLOCK2 FL_FLASH_GetFlashHighRegionLock + * @param FLASHx FLASH instance + * @param region This parameter can be one of the following values: + * @arg @ref FL_FLASH_BLOCK_0 + * @arg @ref FL_FLASH_BLOCK_1 + * @arg @ref FL_FLASH_BLOCK_2 + * @arg @ref FL_FLASH_BLOCK_3 + * @arg @ref FL_FLASH_BLOCK_4 + * @arg @ref FL_FLASH_BLOCK_5 + * @arg @ref FL_FLASH_BLOCK_6 + * @arg @ref FL_FLASH_BLOCK_7 + * @arg @ref FL_FLASH_BLOCK_8 + * @arg @ref FL_FLASH_BLOCK_9 + * @arg @ref FL_FLASH_BLOCK_10 + * @arg @ref FL_FLASH_BLOCK_11 + * @arg @ref FL_FLASH_BLOCK_12 + * @arg @ref FL_FLASH_BLOCK_13 + * @arg @ref FL_FLASH_BLOCK_14 + * @arg @ref FL_FLASH_BLOCK_15 + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_FLASH_GetFlashHighRegionLock(FLASH_Type *FLASHx, uint32_t region) +{ + return (uint32_t)(READ_BIT(FLASHx->ACLOCK2, ((region * region) * 0x03)) / (region * region)); +} + +/** + * @brief Set flash erase type + * @rmtoll EPCR ERTYPE FL_FLASH_SetFlashEraseType + * @param FLASHx FLASH instance + * @param type This parameter can be one of the following values: + * @arg @ref FL_FLASH_ERASE_TYPE_PAGE + * @arg @ref FL_FLASH_ERASE_TYPE_SECTOR + * @retval None + */ +__STATIC_INLINE void FL_FLASH_SetFlashEraseType(FLASH_Type *FLASHx, uint32_t type) +{ + MODIFY_REG(FLASHx->EPCR, FLASH_EPCR_ERTYPE_Msk, type); +} + +/** + * @brief Get flash erase type + * @rmtoll EPCR ERTYPE FL_FLASH_GetFlashEraseType + * @param FLASHx FLASH instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_FLASH_ERASE_TYPE_PAGE + * @arg @ref FL_FLASH_ERASE_TYPE_SECTOR + */ +__STATIC_INLINE uint32_t FL_FLASH_GetFlashEraseType(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->EPCR, FLASH_EPCR_ERTYPE_Msk)); +} + +/** + * @brief Program request enable + * @rmtoll EPCR PREQ FL_FLASH_EnableProgram + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_EnableProgram(FLASH_Type *FLASHx) +{ + CLEAR_BIT(FLASHx->EPCR, FLASH_EPCR_EREQ_Msk); + SET_BIT(FLASHx->EPCR, FLASH_EPCR_PREQ_Msk); +} + +/** + * @brief Erase request enable + * @rmtoll EPCR EREQ FL_FLASH_EnableErase + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_EnableErase(FLASH_Type *FLASHx) +{ + CLEAR_BIT(FLASHx->EPCR, FLASH_EPCR_PREQ_Msk); + SET_BIT(FLASHx->EPCR, FLASH_EPCR_EREQ_Msk); +} + +/** + * @brief Set flash key + * @rmtoll KEY FL_FLASH_UnlockFlash + * @param FLASHx FLASH instance + * @param key + * @retval None + */ +__STATIC_INLINE void FL_FLASH_UnlockFlash(FLASH_Type *FLASHx, uint32_t key) +{ + WRITE_REG(FLASHx->KEY, key); +} + +/** + * @brief Reset flash key + * @rmtoll KEY FL_FLASH_LockFlash + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_LockFlash(FLASH_Type *FLASHx) +{ + WRITE_REG(FLASHx->KEY, 0xFFFFFFFF); +} + +/** + * @brief OTP program error interrupt enable + * @rmtoll IER OPTIE FL_FLASH_EnableIT_OTPProgramError + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_EnableIT_OTPProgramError(FLASH_Type *FLASHx) +{ + SET_BIT(FLASHx->IER, FLASH_IER_OPTIE_Msk); +} + +/** + * @brief OTP program error interrupt disable + * @rmtoll IER OPTIE FL_FLASH_DisableIT_OTPProgramError + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_DisableIT_OTPProgramError(FLASH_Type *FLASHx) +{ + CLEAR_BIT(FLASHx->IER, FLASH_IER_OPTIE_Msk); +} + +/** + * @brief Get OTP program error interrupt enable status + * @rmtoll IER OPTIE FL_FLASH_IsEnabledIT_OTPProgramError + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsEnabledIT_OTPProgramError(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->IER, FLASH_IER_OPTIE_Msk) == FLASH_IER_OPTIE_Msk); +} + +/** + * @brief Flash authentication error interrupt enable + * @rmtoll IER AUTHIE FL_FLASH_EnableIT_AuthenticationError + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_EnableIT_AuthenticationError(FLASH_Type *FLASHx) +{ + SET_BIT(FLASHx->IER, FLASH_IER_AUTHIE_Msk); +} + +/** + * @brief Flash authentication error interrupt disable + * @rmtoll IER AUTHIE FL_FLASH_DisableIT_AuthenticationError + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_DisableIT_AuthenticationError(FLASH_Type *FLASHx) +{ + CLEAR_BIT(FLASHx->IER, FLASH_IER_AUTHIE_Msk); +} + +/** + * @brief Get flash authentication error interrupt enable status + * @rmtoll IER AUTHIE FL_FLASH_IsEnabledIT_AuthenticationError + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsEnabledIT_AuthenticationError(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->IER, FLASH_IER_AUTHIE_Msk) == FLASH_IER_AUTHIE_Msk); +} + +/** + * @brief Flash key error interrupt enable + * @rmtoll IER KEYIE FL_FLASH_EnableIT_KeyError + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_EnableIT_KeyError(FLASH_Type *FLASHx) +{ + SET_BIT(FLASHx->IER, FLASH_IER_KEYIE_Msk); +} + +/** + * @brief Flash key error interrupt disable + * @rmtoll IER KEYIE FL_FLASH_DisableIT_KeyError + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_DisableIT_KeyError(FLASH_Type *FLASHx) +{ + CLEAR_BIT(FLASHx->IER, FLASH_IER_KEYIE_Msk); +} + +/** + * @brief Get Flash key error interrupt enable status + * @rmtoll IER KEYIE FL_FLASH_IsEnabledIT_KeyError + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsEnabledIT_KeyError(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->IER, FLASH_IER_KEYIE_Msk) == FLASH_IER_KEYIE_Msk); +} + +/** + * @brief Erase/Program clock error interrupt enable + * @rmtoll IER CKIE FL_FLASH_EnableIT_ClockError + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_EnableIT_ClockError(FLASH_Type *FLASHx) +{ + SET_BIT(FLASHx->IER, FLASH_IER_CKIE_Msk); +} + +/** + * @brief Erase/Program clock error interrupt disable + * @rmtoll IER CKIE FL_FLASH_DisableIT_ClockError + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_DisableIT_ClockError(FLASH_Type *FLASHx) +{ + CLEAR_BIT(FLASHx->IER, FLASH_IER_CKIE_Msk); +} + +/** + * @brief Get Erase/Program clock error interrupt enable status + * @rmtoll IER CKIE FL_FLASH_IsEnabledIT_ClockError + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsEnabledIT_ClockError(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->IER, FLASH_IER_CKIE_Msk) == FLASH_IER_CKIE_Msk); +} + +/** + * @brief Program done interrupt enable + * @rmtoll IER PRDIE FL_FLASH_EnableIT_ProgramComplete + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_EnableIT_ProgramComplete(FLASH_Type *FLASHx) +{ + SET_BIT(FLASHx->IER, FLASH_IER_PRDIE_Msk); +} + +/** + * @brief Program done interrupt disable + * @rmtoll IER PRDIE FL_FLASH_DisableIT_ProgramComplete + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_DisableIT_ProgramComplete(FLASH_Type *FLASHx) +{ + CLEAR_BIT(FLASHx->IER, FLASH_IER_PRDIE_Msk); +} + +/** + * @brief Get program done interrupt enable status + * @rmtoll IER PRDIE FL_FLASH_IsEnabledIT_ProgramComplete + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsEnabledIT_ProgramComplete(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->IER, FLASH_IER_PRDIE_Msk) == FLASH_IER_PRDIE_Msk); +} + +/** + * @brief Erase done interrupt enable + * @rmtoll IER ERDIE FL_FLASH_EnableIT_EraseComplete + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_EnableIT_EraseComplete(FLASH_Type *FLASHx) +{ + SET_BIT(FLASHx->IER, FLASH_IER_ERDIE_Msk); +} + +/** + * @brief Erase done interrupt disable + * @rmtoll IER ERDIE FL_FLASH_DisableIT_EraseComplete + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_DisableIT_EraseComplete(FLASH_Type *FLASHx) +{ + CLEAR_BIT(FLASHx->IER, FLASH_IER_ERDIE_Msk); +} + +/** + * @brief Get erase done interrupt enable status + * @rmtoll IER ERDIE FL_FLASH_IsEnabledIT_EraseComplete + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsEnabledIT_EraseComplete(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->IER, FLASH_IER_ERDIE_Msk) == FLASH_IER_ERDIE_Msk); +} + +/** + * @brief Get flash key status + * @rmtoll ISR KEYSTA FL_FLASH_GetFlashLockStatus + * @param FLASHx FLASH instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_FLASH_KEY_STATUS_LOCK + * @arg @ref FL_FLASH_KEY_STATUS_PAGE_ERASE + * @arg @ref FL_FLASH_KEY_STATUS_PROGRAM + * @arg @ref FL_FLASH_KEY_STATUS_ERROR + * @arg @ref FL_FLASH_KEY_STATUS_SECTOR_ERASE + */ +__STATIC_INLINE uint32_t FL_FLASH_GetFlashLockStatus(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->ISR, FLASH_ISR_KEYSTA_Msk)); +} + +/** + * @brief Get BootSwap +register value + * @rmtoll ISR BTSF FL_FLASH_GetFlashSwapStatus + * @param FLASHx FLASH instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_FLASH_BOOT_SECTOR_0000H_1FFFH + * @arg @ref FL_FLASH_BOOT_SECTOR_2000H_3FFFH + */ +__STATIC_INLINE uint32_t FL_FLASH_GetFlashSwapStatus(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->ISR, FLASH_ISR_BTSF_Msk)); +} + +/** + * @brief Get OTP program Error Flag + * @rmtoll ISR OPTERR FL_FLASH_IsActiveFlag_OPTProgramError + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsActiveFlag_OPTProgramError(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->ISR, FLASH_ISR_OPTERR_Msk) == (FLASH_ISR_OPTERR_Msk)); +} + +/** + * @brief Clear OTP program Error Flag + * @rmtoll ISR OPTERR FL_FLASH_ClearFlag_OPTProgramError + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_ClearFlag_OPTProgramError(UART_Type *UARTx) +{ + WRITE_REG(UARTx->ISR, FLASH_ISR_OPTERR_Msk); +} + +/** + * @brief Get Flash Authentication Error Flag + * @rmtoll ISR AUTHERR FL_FLASH_IsActiveFlag_AuthenticationError + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsActiveFlag_AuthenticationError(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->ISR, FLASH_ISR_AUTHERR_Msk) == (FLASH_ISR_AUTHERR_Msk)); +} + +/** + * @brief ClearFlash Authentication Error Flag + * @rmtoll ISR AUTHERR FL_FLASH_ClearFlag_AuthenticationError + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_ClearFlag_AuthenticationError(FLASH_Type *FLASHx) +{ + WRITE_REG(FLASHx->ISR, FLASH_ISR_AUTHERR_Msk); +} + +/** + * @brief Get Flash Key Error Flag + * @rmtoll ISR KEYERR FL_FLASH_IsActiveFlag_KeyError + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsActiveFlag_KeyError(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->ISR, FLASH_ISR_KEYERR_Msk) == (FLASH_ISR_KEYERR_Msk)); +} + +/** + * @brief Clear Flash Key Error Flag + * @rmtoll ISR KEYERR FL_FLASH_ClearFlag_KeyError + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_ClearFlag_KeyError(FLASH_Type *FLASHx) +{ + WRITE_REG(FLASHx->ISR, FLASH_ISR_KEYERR_Msk); +} + +/** + * @brief Get Erase/Program Clock Error Flag + * @rmtoll ISR CKERR FL_FLASH_IsActiveFlag_ClockError + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsActiveFlag_ClockError(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->ISR, FLASH_ISR_CKERR_Msk) == (FLASH_ISR_CKERR_Msk)); +} + +/** + * @brief Clear Erase/Program Clock Error Flag + * @rmtoll ISR CKERR FL_FLASH_ClearFlag_ClockError + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_ClearFlag_ClockError(FLASH_Type *FLASHx) +{ + WRITE_REG(FLASHx->ISR, FLASH_ISR_CKERR_Msk); +} + +/** + * @brief Get Program Done Flag + * @rmtoll ISR PRD FL_FLASH_IsActiveFlag_ProgramComplete + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsActiveFlag_ProgramComplete(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->ISR, FLASH_ISR_PRD_Msk) == (FLASH_ISR_PRD_Msk)); +} + +/** + * @brief Clear Program Done Flag + * @rmtoll ISR PRD FL_FLASH_ClearFlag_ProgramComplete + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_ClearFlag_ProgramComplete(FLASH_Type *FLASHx) +{ + WRITE_REG(FLASHx->ISR, FLASH_ISR_PRD_Msk); +} + +/** + * @brief Get Erase Done Flag + * @rmtoll ISR ERD FL_FLASH_IsActiveFlag_EraseComplete + * @param FLASHx FLASH instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_FLASH_IsActiveFlag_EraseComplete(FLASH_Type *FLASHx) +{ + return (uint32_t)(READ_BIT(FLASHx->ISR, FLASH_ISR_ERD_Msk) == (FLASH_ISR_ERD_Msk)); +} + +/** + * @brief Clear Erase Done Flag + * @rmtoll ISR ERD FL_FLASH_ClearFlag_EraseComplete + * @param FLASHx FLASH instance + * @retval None + */ +__STATIC_INLINE void FL_FLASH_ClearFlag_EraseComplete(FLASH_Type *FLASHx) +{ + WRITE_REG(FLASHx->ISR, FLASH_ISR_ERD_Msk); +} + +/** + * @} + */ + +/** @defgroup FLASH_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_FLASH_PageErase(FLASH_Type *FLASHx, uint32_t address); +FL_ErrorStatus FL_FLASH_SectorErase(FLASH_Type *FLASHx, uint32_t address); + +FL_ErrorStatus FL_FLASH_Program_Word(FLASH_Type *FLASHx, uint32_t address, uint32_t data); +FL_ErrorStatus FL_FLASH_Program_Page(FLASH_Type *FLASHx, uint32_t pageNum, uint32_t *data); +FL_ErrorStatus FL_FLASH_Program_Sector(FLASH_Type *FLASHx, uint32_t sectorNum, uint32_t *data); + +FL_ErrorStatus FL_FLASH_Write_Dma(FLASH_Type *FLASHx, uint32_t address, uint32_t *data); +FL_ErrorStatus FL_FLASH_Read_Dma(FLASH_Type *FLASHx, uint32_t address, uint32_t *data, uint16_t length); + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_FLASH_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.1 @ 2020-12-15*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_gpio.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_gpio.h new file mode 100644 index 0000000..44117a3 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_gpio.h @@ -0,0 +1,2167 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_gpio.h + * @author FMSH Application Team + * @brief Head file of GPIO FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_GPIO_H +#define __FM33LG0XX_FL_GPIO_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup GPIO GPIO + * @brief GPIO FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup GPIO_FL_ES_INIT GPIO Exported Init structures + * @{ + */ + +/** + * @brief FL GPIO Init Sturcture definition + */ +typedef struct +{ + /*! PIN */ + uint32_t pin; + /*! 功能模式 */ + uint32_t mode; + /*! 输出类型 */ + uint32_t outputType; + /*! 上拉使能 */ + uint32_t pull; + /*! 数字功能重定向 */ + uint32_t remapPin; + /*! 模拟开关使能 */ + uint32_t analogSwitch; + +} FL_GPIO_InitTypeDef; + +typedef struct +{ + /*! 触发边沿 */ + uint32_t polarity; + +} FL_WKUP_InitTypeDef; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup GPIO_FL_Exported_Constants GPIO Exported Constants + * @{ + */ + +#define GPIO_FCR_Pos (0U) +#define GPIO_FCR_Msk (0x3U << GPIO_FCR_Pos) +#define GPIO_FCR GPIO_FCR_Msk + +#define GPIO_EXTIEDS0_Pos (0U) +#define GPIO_EXTIEDS0_Msk (0x3U << GPIO_EXTIEDS0_Pos) +#define GPIO_EXTIEDS0 GPIO_EXTIEDS0_Msk + +#define GPIO_EXTIEDS1_Pos (0U) +#define GPIO_EXTIEDS1_Msk (0x3U << GPIO_EXTIEDS1_Pos) +#define GPIO_EXTIEDS1 GPIO_EXTIEDS1_Msk + +#define GPIO_FOUTSEL_FOUT0_Pos (0U) +#define GPIO_FOUTSEL_FOUT0_Msk (0xfU << GPIO_FOUTSEL_FOUT0_Pos) +#define GPIO_FOUTSEL_FOUT0 GPIO_FOUTSEL_FOUT0_Msk + +#define GPIO_FOUTSEL_FOUT1_Pos (4U) +#define GPIO_FOUTSEL_FOUT1_Msk (0xfU << GPIO_FOUTSEL_FOUT1_Pos) +#define GPIO_FOUTSEL_FOUT1 GPIO_FOUTSEL_FOUT1_Msk + +#define GPIO_EXTISEL0_EXTI0_Pos (0U) +#define GPIO_EXTISEL0_EXTI0_Msk (0x3U << GPIO_EXTISEL0_EXTI0_Pos) +#define GPIO_EXTISEL0_EXTI0 GPIO_EXTISEL0_EXTI0_Msk + +#define GPIO_EXTISEL0_EXTI1_Pos (2U) +#define GPIO_EXTISEL0_EXTI1_Msk (0x3U << GPIO_EXTISEL0_EXTI1_Pos) +#define GPIO_EXTISEL0_EXTI1 GPIO_EXTISEL0_EXTI1_Msk + +#define GPIO_EXTISEL0_EXTI2_Pos (4U) +#define GPIO_EXTISEL0_EXTI2_Msk (0x3U << GPIO_EXTISEL0_EXTI2_Pos) +#define GPIO_EXTISEL0_EXTI2 GPIO_EXTISEL0_EXTI2_Msk + +#define GPIO_EXTISEL0_EXTI3_Pos (6U) +#define GPIO_EXTISEL0_EXTI3_Msk (0x3U << GPIO_EXTISEL0_EXTI3_Pos) +#define GPIO_EXTISEL0_EXTI3 GPIO_EXTISEL0_EXTI3_Msk + +#define GPIO_EXTISEL0_EXTI4_Pos (8U) +#define GPIO_EXTISEL0_EXTI4_Msk (0x3U << GPIO_EXTISEL0_EXTI4_Pos) +#define GPIO_EXTISEL0_EXTI4 GPIO_EXTISEL0_EXTI4_Msk + +#define GPIO_EXTISEL0_EXTI5_Pos (10U) +#define GPIO_EXTISEL0_EXTI5_Msk (0x3U << GPIO_EXTISEL0_EXTI5_Pos) +#define GPIO_EXTISEL0_EXTI5 GPIO_EXTISEL0_EXTI5_Msk + +#define GPIO_EXTISEL0_EXTI6_Pos (12U) +#define GPIO_EXTISEL0_EXTI6_Msk (0x3U << GPIO_EXTISEL0_EXTI6_Pos) +#define GPIO_EXTISEL0_EXTI6 GPIO_EXTISEL0_EXTI6_Msk + +#define GPIO_EXTISEL0_EXTI7_Pos (14U) +#define GPIO_EXTISEL0_EXTI7_Msk (0x3U << GPIO_EXTISEL0_EXTI7_Pos) +#define GPIO_EXTISEL0_EXTI7 GPIO_EXTISEL0_EXTI7_Msk + +#define GPIO_EXTISEL0_EXTI8_Pos (16U) +#define GPIO_EXTISEL0_EXTI8_Msk (0x3U << GPIO_EXTISEL0_EXTI8_Pos) +#define GPIO_EXTISEL0_EXTI8 GPIO_EXTISEL0_EXTI8_Msk + +#define GPIO_EXTISEL0_EXTI9_Pos (18U) +#define GPIO_EXTISEL0_EXTI9_Msk (0x3U << GPIO_EXTISEL0_EXTI9_Pos) +#define GPIO_EXTISEL0_EXTI9 GPIO_EXTISEL0_EXTI9_Msk + +#define GPIO_EXTISEL0_EXTI10_Pos (20U) +#define GPIO_EXTISEL0_EXTI10_Msk (0x3U << GPIO_EXTISEL0_EXTI10_Pos) +#define GPIO_EXTISEL0_EXTI10 GPIO_EXTISEL0_EXTI10_Msk + +#define GPIO_EXTISEL0_EXTI11_Pos (22U) +#define GPIO_EXTISEL0_EXTI11_Msk (0x3U << GPIO_EXTISEL0_EXTI11_Pos) +#define GPIO_EXTISEL0_EXTI11 GPIO_EXTISEL0_EXTI11_Msk + +#define GPIO_EXTISEL0_EXTI12_Pos (24U) +#define GPIO_EXTISEL0_EXTI12_Msk (0x3U << GPIO_EXTISEL0_EXTI12_Pos) +#define GPIO_EXTISEL0_EXTI12 GPIO_EXTISEL0_EXTI12_Msk + +#define GPIO_EXTISEL0_EXTI13_Pos (26U) +#define GPIO_EXTISEL0_EXTI13_Msk (0x3U << GPIO_EXTISEL0_EXTI13_Pos) +#define GPIO_EXTISEL0_EXTI13 GPIO_EXTISEL0_EXTI13_Msk + +#define GPIO_EXTISEL0_EXTI14_Pos (28U) +#define GPIO_EXTISEL0_EXTI14_Msk (0x3U << GPIO_EXTISEL0_EXTI14_Pos) +#define GPIO_EXTISEL0_EXTI14 GPIO_EXTISEL0_EXTI14_Msk + +#define GPIO_EXTISEL0_EXTI15_Pos (30U) +#define GPIO_EXTISEL0_EXTI15_Msk (0x3U << GPIO_EXTISEL0_EXTI15_Pos) +#define GPIO_EXTISEL0_EXTI15 GPIO_EXTISEL0_EXTI15_Msk + +#define GPIO_EXTISEL1_EXTI16_Pos (0U) +#define GPIO_EXTISEL1_EXTI16_Msk (0x3U << GPIO_EXTISEL1_EXTI16_Pos) +#define GPIO_EXTISEL1_EXTI16 GPIO_EXTISEL1_EXTI16_Msk + +#define GPIO_EXTISEL1_EXTI17_Pos (2U) +#define GPIO_EXTISEL1_EXTI17_Msk (0x3U << GPIO_EXTISEL1_EXTI17_Pos) +#define GPIO_EXTISEL1_EXTI17 GPIO_EXTISEL1_EXTI17_Msk + +#define GPIO_EXTISEL1_EXTI18_Pos (4U) +#define GPIO_EXTISEL1_EXTI18_Msk (0x3U << GPIO_EXTISEL1_EXTI18_Pos) +#define GPIO_EXTISEL1_EXTI18 GPIO_EXTISEL1_EXTI18_Msk + +#define GPIO_PINWKEN_EN_Pos (0U) +#define GPIO_PINWKEN_EN_Msk (0x3ffU << GPIO_PINWKEN_EN_Pos) +#define GPIO_PINWKEN_EN GPIO_PINWKEN_EN_Msk + +#define GPIO_PINWKEN_WKISEL_Pos (31U) +#define GPIO_PINWKEN_WKISEL_Msk (0x1U << GPIO_PINWKEN_WKISEL_Pos) +#define GPIO_PINWKEN_WKISEL GPIO_PINWKEN_WKISEL_Msk + +#define GPIO_PINWKEN_SEL_Pos (10U) +#define GPIO_PINWKEN_SEL_Msk (0x3U << GPIO_PINWKEN_SEL_Pos) +#define GPIO_PINWKEN_SEL GPIO_PINWKEN_SEL_Msk + + + +#define FL_GPIO_PIN_0 (0x1U << 0U) +#define FL_GPIO_PIN_1 (0x1U << 1U) +#define FL_GPIO_PIN_2 (0x1U << 2U) +#define FL_GPIO_PIN_3 (0x1U << 3U) +#define FL_GPIO_PIN_4 (0x1U << 4U) +#define FL_GPIO_PIN_5 (0x1U << 5U) +#define FL_GPIO_PIN_6 (0x1U << 6U) +#define FL_GPIO_PIN_7 (0x1U << 7U) +#define FL_GPIO_PIN_8 (0x1U << 8U) +#define FL_GPIO_PIN_9 (0x1U << 9U) +#define FL_GPIO_PIN_10 (0x1U << 10U) +#define FL_GPIO_PIN_11 (0x1U << 11U) +#define FL_GPIO_PIN_12 (0x1U << 12U) +#define FL_GPIO_PIN_13 (0x1U << 13U) +#define FL_GPIO_PIN_14 (0x1U << 14U) +#define FL_GPIO_PIN_15 (0x1U << 15U) +#define FL_GPIO_PIN_ALL (0xffffU << 0U) +#define FL_GPIO_EXTI_LINE_0 (0x1U << 0U) +#define FL_GPIO_EXTI_LINE_1 (0x1U << 1U) +#define FL_GPIO_EXTI_LINE_2 (0x1U << 2U) +#define FL_GPIO_EXTI_LINE_3 (0x1U << 3U) +#define FL_GPIO_EXTI_LINE_4 (0x1U << 4U) +#define FL_GPIO_EXTI_LINE_5 (0x1U << 5U) +#define FL_GPIO_EXTI_LINE_6 (0x1U << 6U) +#define FL_GPIO_EXTI_LINE_7 (0x1U << 7U) +#define FL_GPIO_EXTI_LINE_8 (0x1U << 8U) +#define FL_GPIO_EXTI_LINE_9 (0x1U << 9U) +#define FL_GPIO_EXTI_LINE_10 (0x1U << 10U) +#define FL_GPIO_EXTI_LINE_11 (0x1U << 11U) +#define FL_GPIO_EXTI_LINE_12 (0x1U << 12U) +#define FL_GPIO_EXTI_LINE_13 (0x1U << 13U) +#define FL_GPIO_EXTI_LINE_14 (0x1U << 14U) +#define FL_GPIO_EXTI_LINE_15 (0x1U << 15U) +#define FL_GPIO_EXTI_LINE_16 (0x1U << 16U) +#define FL_GPIO_EXTI_LINE_17 (0x1U << 17U) +#define FL_GPIO_EXTI_LINE_18 (0x1U << 18U) +#define FL_GPIO_EXTI_LINE_ALL (0x7ffffU << 0U) +#define FL_GPIO_EXTI_LINE_0_PA0 (0x0U << 0U) +#define FL_GPIO_EXTI_LINE_0_PA1 (0x1U << 0U) +#define FL_GPIO_EXTI_LINE_0_PA2 (0x2U << 0U) +#define FL_GPIO_EXTI_LINE_0_PA3 (0x3U << 0U) +#define FL_GPIO_EXTI_LINE_1_PA4 (0x0U << 2U) +#define FL_GPIO_EXTI_LINE_1_PA5 (0x1U << 2U) +#define FL_GPIO_EXTI_LINE_1_PA6 (0x2U << 2U) +#define FL_GPIO_EXTI_LINE_1_PA7 (0x3U << 2U) +#define FL_GPIO_EXTI_LINE_2_PA8 (0x0U << 4U) +#define FL_GPIO_EXTI_LINE_2_PA9 (0x1U << 4U) +#define FL_GPIO_EXTI_LINE_2_PA10 (0x2U << 4U) +#define FL_GPIO_EXTI_LINE_2_PA11 (0x3U << 4U) +#define FL_GPIO_EXTI_LINE_3_PA12 (0x0U << 6U) +#define FL_GPIO_EXTI_LINE_3_PA13 (0x1U << 6U) +#define FL_GPIO_EXTI_LINE_3_PA14 (0x2U << 6U) +#define FL_GPIO_EXTI_LINE_3_PA15 (0x3U << 6U) +#define FL_GPIO_EXTI_LINE_4_PB0 (0x0U << 8U) +#define FL_GPIO_EXTI_LINE_4_PB1 (0x1U << 8U) +#define FL_GPIO_EXTI_LINE_4_PB2 (0x2U << 8U) +#define FL_GPIO_EXTI_LINE_4_PB3 (0x3U << 8U) +#define FL_GPIO_EXTI_LINE_5_PB4 (0x0U << 10U) +#define FL_GPIO_EXTI_LINE_5_PB5 (0x1U << 10U) +#define FL_GPIO_EXTI_LINE_5_PB6 (0x2U << 10U) +#define FL_GPIO_EXTI_LINE_5_PB7 (0x3U << 10U) +#define FL_GPIO_EXTI_LINE_6_PB8 (0x0U << 12U) +#define FL_GPIO_EXTI_LINE_6_PB9 (0x1U << 12U) +#define FL_GPIO_EXTI_LINE_6_PB10 (0x2U << 12U) +#define FL_GPIO_EXTI_LINE_6_PB11 (0x3U << 12U) +#define FL_GPIO_EXTI_LINE_7_PB12 (0x0U << 14U) +#define FL_GPIO_EXTI_LINE_7_PB13 (0x1U << 14U) +#define FL_GPIO_EXTI_LINE_7_PB14 (0x2U << 14U) +#define FL_GPIO_EXTI_LINE_7_PB15 (0x3U << 14U) +#define FL_GPIO_EXTI_LINE_8_PC0 (0x0U << 16U) +#define FL_GPIO_EXTI_LINE_8_PC1 (0x1U << 16U) +#define FL_GPIO_EXTI_LINE_8_PC2 (0x2U << 16U) +#define FL_GPIO_EXTI_LINE_8_PC3 (0x3U << 16U) +#define FL_GPIO_EXTI_LINE_9_PC4 (0x0U << 18U) +#define FL_GPIO_EXTI_LINE_9_PC5 (0x1U << 18U) +#define FL_GPIO_EXTI_LINE_9_PC6 (0x2U << 18U) +#define FL_GPIO_EXTI_LINE_9_PC7 (0x3U << 18U) +#define FL_GPIO_EXTI_LINE_10_PC8 (0x0U << 20U) +#define FL_GPIO_EXTI_LINE_10_PC9 (0x1U << 20U) +#define FL_GPIO_EXTI_LINE_10_PC10 (0x2U << 20U) +#define FL_GPIO_EXTI_LINE_10_PC11 (0x3U << 20U) +#define FL_GPIO_EXTI_LINE_11_PC12 (0x0U << 22U) +#define FL_GPIO_EXTI_LINE_11_PC13 (0x1U << 22U) +#define FL_GPIO_EXTI_LINE_11_PC14 (0x2U << 22U) +#define FL_GPIO_EXTI_LINE_11_PC15 (0x3U << 22U) +#define FL_GPIO_EXTI_LINE_12_PD0 (0x0U << 24U) +#define FL_GPIO_EXTI_LINE_12_PD1 (0x1U << 24U) +#define FL_GPIO_EXTI_LINE_12_PD2 (0x2U << 24U) +#define FL_GPIO_EXTI_LINE_12_PD3 (0x3U << 24U) +#define FL_GPIO_EXTI_LINE_13_PD4 (0x0U << 26U) +#define FL_GPIO_EXTI_LINE_13_PD5 (0x1U << 26U) +#define FL_GPIO_EXTI_LINE_13_PD6 (0x2U << 26U) +#define FL_GPIO_EXTI_LINE_13_PD7 (0x3U << 26U) +#define FL_GPIO_EXTI_LINE_14_PD8 (0x0U << 28U) +#define FL_GPIO_EXTI_LINE_14_PD9 (0x1U << 28U) +#define FL_GPIO_EXTI_LINE_14_PD10 (0x2U << 28U) +#define FL_GPIO_EXTI_LINE_14_PD11 (0x3U << 28U) +#define FL_GPIO_EXTI_LINE_15_PD12 (0x0U << 30U) +#define FL_GPIO_EXTI_LINE_16_PE0 (0x0U << 0U) +#define FL_GPIO_EXTI_LINE_16_PE1 (0x1U << 0U) +#define FL_GPIO_EXTI_LINE_16_PE2 (0x2U << 0U) +#define FL_GPIO_EXTI_LINE_16_PE3 (0x3U << 0U) +#define FL_GPIO_EXTI_LINE_17_PE4 (0x0U << 2U) +#define FL_GPIO_EXTI_LINE_17_PE5 (0x1U << 2U) +#define FL_GPIO_EXTI_LINE_17_PE6 (0x2U << 2U) +#define FL_GPIO_EXTI_LINE_17_PE7 (0x3U << 2U) +#define FL_GPIO_EXTI_LINE_18_PE8 (0x0U << 4U) +#define FL_GPIO_EXTI_LINE_18_PE9 (0x1U << 4U) +#define FL_GPIO_WAKEUP_0 (0x1U << 0U) +#define FL_GPIO_WAKEUP_1 (0x1U << 1U) +#define FL_GPIO_WAKEUP_2 (0x1U << 2U) +#define FL_GPIO_WAKEUP_3 (0x1U << 3U) +#define FL_GPIO_WAKEUP_4 (0x1U << 4U) +#define FL_GPIO_WAKEUP_5 (0x1U << 5U) +#define FL_GPIO_WAKEUP_6 (0x1U << 6U) +#define FL_GPIO_WAKEUP_7 (0x1U << 7U) +#define FL_GPIO_WAKEUP_8 (0x1U << 8U) +#define FL_GPIO_WAKEUP_9 (0x1U << 9U) + + +#define FL_GPIO_OUTPUT_PUSHPULL (0) +#define FL_GPIO_OUTPUT_OPENDRAIN (1) + + +#define FL_GPIO_MODE_INPUT (0x0U << GPIO_FCR_Pos) +#define FL_GPIO_MODE_OUTPUT (0x1U << GPIO_FCR_Pos) +#define FL_GPIO_MODE_DIGITAL (0x2U << GPIO_FCR_Pos) +#define FL_GPIO_MODE_ANALOG (0x3U << GPIO_FCR_Pos) + + +#define FL_GPIO_EXTI_TRIGGER_EDGE_RISING (0x0U << GPIO_EXTIEDS0_Pos) +#define FL_GPIO_EXTI_TRIGGER_EDGE_FALLING (0x1U << GPIO_EXTIEDS0_Pos) +#define FL_GPIO_EXTI_TRIGGER_EDGE_BOTH (0x2U << GPIO_EXTIEDS0_Pos) +#define FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE (0x3U << GPIO_EXTIEDS0_Pos) + + +#define FL_GPIO_FOUT0_SELECT_XTLF (0x0U << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_RCLP (0x1U << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_RCHF_DIV64 (0x2U << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_LSCLK (0x3U << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_AHBCLK_DIV64 (0x4U << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_RTCTM (0x5U << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_PLLOUTPUT_DIV64 (0x6U << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_RTCCLK64HZ (0x7U << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_APBCLK_DIV64 (0x8U << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_PLLOUTPUT (0x9U << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_RCLF (0xaU << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_RCHF (0xbU << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_XTHF_DIV64 (0xcU << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_COMP1O (0xdU << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_CLK_8K (0xeU << GPIO_FOUTSEL_FOUT0_Pos) +#define FL_GPIO_FOUT0_SELECT_ADC_CLK (0xfU << GPIO_FOUTSEL_FOUT0_Pos) + + +#define FL_GPIO_FOUT1_SELECT_XTLF (0x0U << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_RCLP (0x1U << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_ADCCLK (0x2U << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_LSCLK (0x3U << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_EOC (0x4U << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_RTCTM (0x5U << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_PLLOUTPUT_DIV64 (0x6U << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_EOCAL (0x7U << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_APBCLK_DIV64 (0x8U << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_ROSC_TDLV (0x9U << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_RCLF (0xaU << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_RCHF (0xbU << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_XTHF_DIV64 (0xcU << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_ADCCLK_DIV64 (0xdU << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_CLK_8K (0xeU << GPIO_FOUTSEL_FOUT1_Pos) +#define FL_GPIO_FOUT1_SELECT_ROSC_TDHV (0xfU << GPIO_FOUTSEL_FOUT1_Pos) + + +#define FL_GPIO_WAKEUP_INT_ENTRY_NMI (0x0U << GPIO_PINWKEN_WKISEL_Pos) +#define FL_GPIO_WAKEUP_INT_ENTRY_38 (0x1U << GPIO_PINWKEN_WKISEL_Pos) + + +#define FL_GPIO_WAKEUP_TRIGGER_RISING (0x1U << GPIO_PINWKEN_SEL_Pos) +#define FL_GPIO_WAKEUP_TRIGGER_FALLING (0x0U << GPIO_PINWKEN_SEL_Pos) +#define FL_GPIO_WAKEUP_TRIGGER_BOTH (0x2U << GPIO_PINWKEN_SEL_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup GPIO_FL_Exported_Functions GPIO Exported Functions + * @{ + */ + +/** + * @brief GPIOx input enable + * @rmtoll INEN FL_GPIO_EnablePinInput + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_EnablePinInput(GPIO_Type *GPIOx, uint32_t pin) +{ + SET_BIT(GPIOx->INEN, ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief CPIOx input disable + * @rmtoll INEN FL_GPIO_DisablePinInput + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_DisablePinInput(GPIO_Type *GPIOx, uint32_t pin) +{ + CLEAR_BIT(GPIOx->INEN, ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief Get GPIOx input enable status + * @rmtoll INEN FL_GPIO_IsEnabledPinInput + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPIO_IsEnabledPinInput(GPIO_Type *GPIOx, uint32_t pin) +{ + return (uint32_t)(READ_BIT(GPIOx->INEN, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief GPIOx Pull-Up enable + * @rmtoll PUEN FL_GPIO_EnablePinPullup + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_EnablePinPullup(GPIO_Type *GPIOx, uint32_t pin) +{ + SET_BIT(GPIOx->PUEN, ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief GPIOx Pull-Up disable + * @rmtoll PUEN FL_GPIO_DisablePinPullup + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_DisablePinPullup(GPIO_Type *GPIOx, uint32_t pin) +{ + CLEAR_BIT(GPIOx->PUEN, ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief Get GPIOx Pull-Up enable status + * @rmtoll PUEN FL_GPIO_IsEnabledPinPullup + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPIO_IsEnabledPinPullup(GPIO_Type *GPIOx, uint32_t pin) +{ + return (uint32_t)(READ_BIT(GPIOx->PUEN, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief GPIOx Open-Drain enable + * @rmtoll ODEN FL_GPIO_EnablePinOpenDrain + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_EnablePinOpenDrain(GPIO_Type *GPIOx, uint32_t pin) +{ + SET_BIT(GPIOx->ODEN, ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief Open-Drain disable + * @rmtoll ODEN FL_GPIO_DisablePinOpenDrain + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_DisablePinOpenDrain(GPIO_Type *GPIOx, uint32_t pin) +{ + CLEAR_BIT(GPIOx->ODEN, ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief Get Open-Drain enable status + * @rmtoll ODEN FL_GPIO_IsEnabledPinOpenDrain + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPIO_IsEnabledPinOpenDrain(GPIO_Type *GPIOx, uint32_t pin) +{ + return (uint32_t)(READ_BIT(GPIOx->ODEN, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief GPIOx digital function enable + * @rmtoll DFS FL_GPIO_EnablePinRemap + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_EnablePinRemap(GPIO_Type *GPIOx, uint32_t pin) +{ + SET_BIT(GPIOx->DFS, ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief GPIOx digital function disable + * @rmtoll DFS FL_GPIO_DisablePinRemap + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_DisablePinRemap(GPIO_Type *GPIOx, uint32_t pin) +{ + CLEAR_BIT(GPIOx->DFS, ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief Get GPIOx digital function enable status + * @rmtoll DFS FL_GPIO_IsEnabledPinRemap + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPIO_IsEnabledPinRemap(GPIO_Type *GPIOx, uint32_t pin) +{ + return (uint32_t)(READ_BIT(GPIOx->DFS, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief GPIOx analog channel enable + * @rmtoll ANEN FL_GPIO_EnablePinAnalogSwitch + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_EnablePinAnalogSwitch(GPIO_Type *GPIOx, uint32_t pin) +{ + SET_BIT(GPIOx->ANEN, ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief GPIOx analog channel disable + * @rmtoll ANEN FL_GPIO_DisablePinAnalogSwitch + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_DisablePinAnalogSwitch(GPIO_Type *GPIOx, uint32_t pin) +{ + CLEAR_BIT(GPIOx->ANEN, ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief Get GPIOx analog channel enable status + * @rmtoll ANEN FL_GPIO_IsEnabledPinAnalogSwitch + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPIO_IsEnabledPinAnalogSwitch(GPIO_Type *GPIOx, uint32_t pin) +{ + return (uint32_t)(READ_BIT(GPIOx->ANEN, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief Set Portx mode + * @rmtoll FCR FL_GPIO_SetPinMode + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @param mode This parameter can be one of the following values: + * @arg @ref FL_GPIO_MODE_INPUT + * @arg @ref FL_GPIO_MODE_OUTPUT + * @arg @ref FL_GPIO_MODE_DIGITAL + * @arg @ref FL_GPIO_MODE_ANALOG + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetPinMode(GPIO_Type *GPIOx, uint32_t pin, uint32_t mode) +{ + MODIFY_REG(GPIOx->FCR, ((pin * pin) * GPIO_FCR), ((pin * pin) * mode)); +} + +/** + * @brief Get Portx mode + * @rmtoll FCR FL_GPIO_GetPinMode + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPIO_MODE_INPUT + * @arg @ref FL_GPIO_MODE_OUTPUT + * @arg @ref FL_GPIO_MODE_DIGITAL + * @arg @ref FL_GPIO_MODE_ANALOG + */ +__STATIC_INLINE uint32_t FL_GPIO_GetPinMode(GPIO_Type *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->FCR, ((Pin * Pin) * GPIO_FCR)) / (Pin * Pin)); +} + +/** + * @brief Set GPIO output data + * @rmtoll DO FL_GPIO_WriteOutputPort + * @param GPIOx GPIO Port + * @param output Level value for each pin of the port + * @retval None + */ +__STATIC_INLINE void FL_GPIO_WriteOutputPort(GPIO_Type *GPIOx, uint32_t output) +{ + MODIFY_REG(GPIOx->DO, (0xffffU << 0U), (output << 0U)); +} + +/** + * @brief Get GPIO output data + * @rmtoll DO FL_GPIO_ReadOutputPort + * @param GPIOx GPIO Port + * @retval Output data register value of port + */ +__STATIC_INLINE uint32_t FL_GPIO_ReadOutputPort(GPIO_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->DO, (0xffffU << 0U)) >> 0U); +} + +/** + * @brief Get GPIO output pin status + * @rmtoll DO FL_GPIO_GetOutputPin + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPIO_GetOutputPin(GPIO_Type *GPIOx, uint32_t pin) +{ + return (uint32_t)(READ_BIT(GPIOx->DO, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief Toggle output pin + * @rmtoll DO FL_GPIO_ToggleOutputPin + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_ToggleOutputPin(GPIO_Type *GPIOx, uint32_t pin) +{ + if(pin&GPIOx->DO) + { + WRITE_REG(GPIOx->DRST, pin); + } + else + { + WRITE_REG(GPIOx->DSET, pin); + } +} + +/** + * @brief Get input data + * @rmtoll DIN FL_GPIO_ReadInputPort + * @param GPIOx GPIO Port + * @retval Input data register value of port + */ +__STATIC_INLINE uint32_t FL_GPIO_ReadInputPort(GPIO_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->DIN, (0xffffU << 0U)) >> 0U); +} + +/** + * @brief Get GPIO input set status + * @rmtoll DIN FL_GPIO_GetInputPin + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPIO_GetInputPin(GPIO_Type *GPIOx, uint32_t pin) +{ + return (uint32_t)(READ_BIT(GPIOx->DIN, ((pin & 0xffff) << 0x0U)) == ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief Set pin output 1 + * @rmtoll DSET FL_GPIO_SetOutputPin + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetOutputPin(GPIO_Type *GPIOx, uint32_t pin) +{ + SET_BIT(GPIOx->DSET, ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief Set pin output 0 + * @rmtoll DRST FL_GPIO_ResetOutputPin + * @param GPIOx GPIO Port + * @param pin This parameter can be one of the following values: + * @arg @ref FL_GPIO_PIN_0 + * @arg @ref FL_GPIO_PIN_1 + * @arg @ref FL_GPIO_PIN_2 + * @arg @ref FL_GPIO_PIN_3 + * @arg @ref FL_GPIO_PIN_4 + * @arg @ref FL_GPIO_PIN_5 + * @arg @ref FL_GPIO_PIN_6 + * @arg @ref FL_GPIO_PIN_7 + * @arg @ref FL_GPIO_PIN_8 + * @arg @ref FL_GPIO_PIN_9 + * @arg @ref FL_GPIO_PIN_10 + * @arg @ref FL_GPIO_PIN_11 + * @arg @ref FL_GPIO_PIN_12 + * @arg @ref FL_GPIO_PIN_13 + * @arg @ref FL_GPIO_PIN_14 + * @arg @ref FL_GPIO_PIN_15 + * @arg @ref FL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_ResetOutputPin(GPIO_Type *GPIOx, uint32_t pin) +{ + SET_BIT(GPIOx->DRST, ((pin & 0xffff) << 0x0U)); +} + +/** + * @brief EXTI edge0 select + * @rmtoll EXTIEDS0 FL_GPIO_SetTriggerEdge0 + * @param GPIOx GPIO Port + * @param line This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_0 + * @arg @ref FL_GPIO_EXTI_LINE_1 + * @arg @ref FL_GPIO_EXTI_LINE_2 + * @arg @ref FL_GPIO_EXTI_LINE_3 + * @arg @ref FL_GPIO_EXTI_LINE_4 + * @arg @ref FL_GPIO_EXTI_LINE_5 + * @arg @ref FL_GPIO_EXTI_LINE_6 + * @arg @ref FL_GPIO_EXTI_LINE_7 + * @arg @ref FL_GPIO_EXTI_LINE_8 + * @arg @ref FL_GPIO_EXTI_LINE_9 + * @arg @ref FL_GPIO_EXTI_LINE_10 + * @arg @ref FL_GPIO_EXTI_LINE_11 + * @arg @ref FL_GPIO_EXTI_LINE_12 + * @arg @ref FL_GPIO_EXTI_LINE_13 + * @arg @ref FL_GPIO_EXTI_LINE_14 + * @arg @ref FL_GPIO_EXTI_LINE_15 + * @param edge This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_RISING + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_FALLING + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_BOTH + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetTriggerEdge0(GPIO_COMMON_Type *GPIOx, uint32_t line, uint32_t edge) +{ + MODIFY_REG(GPIOx->EXTIEDS0, ((line * line) * GPIO_EXTIEDS0), ((line * line) * edge)); +} + +/** + * @brief Get EXTI edge0 select + * @rmtoll EXTIEDS0 FL_GPIO_GetTriggerEdge0 + * @param GPIOx GPIO Port + * @param line This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_0 + * @arg @ref FL_GPIO_EXTI_LINE_1 + * @arg @ref FL_GPIO_EXTI_LINE_2 + * @arg @ref FL_GPIO_EXTI_LINE_3 + * @arg @ref FL_GPIO_EXTI_LINE_4 + * @arg @ref FL_GPIO_EXTI_LINE_5 + * @arg @ref FL_GPIO_EXTI_LINE_6 + * @arg @ref FL_GPIO_EXTI_LINE_7 + * @arg @ref FL_GPIO_EXTI_LINE_8 + * @arg @ref FL_GPIO_EXTI_LINE_9 + * @arg @ref FL_GPIO_EXTI_LINE_10 + * @arg @ref FL_GPIO_EXTI_LINE_11 + * @arg @ref FL_GPIO_EXTI_LINE_12 + * @arg @ref FL_GPIO_EXTI_LINE_13 + * @arg @ref FL_GPIO_EXTI_LINE_14 + * @arg @ref FL_GPIO_EXTI_LINE_15 + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_RISING + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_FALLING + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_BOTH + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE + */ +__STATIC_INLINE uint32_t FL_GPIO_GetTriggerEdge0(GPIO_COMMON_Type *GPIOx, uint32_t line) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTIEDS0, ((line * line) * GPIO_EXTIEDS0)) / (line * line)); +} + +/** + * @brief EXTI edge1 select + * @rmtoll EXTIEDS1 FL_GPIO_SetTriggerEdge1 + * @param GPIOx GPIO Port + * @param line This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_16 + * @arg @ref FL_GPIO_EXTI_LINE_17 + * @arg @ref FL_GPIO_EXTI_LINE_18 + * @param edge This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_RISING + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_FALLING + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_BOTH + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetTriggerEdge1(GPIO_COMMON_Type *GPIOx, uint32_t line, uint32_t edge) +{ + MODIFY_REG(GPIOx->EXTIEDS1, (((line >> 16) * (line >> 16)) * GPIO_EXTIEDS1), + (((line >> 16) * (line >> 16)) * edge)); +} + +/** + * @brief Get EXTI edge1 select + * @rmtoll EXTIEDS1 FL_GPIO_GetTriggerEdge1 + * @param GPIOx GPIO Port + * @param line This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_16 + * @arg @ref FL_GPIO_EXTI_LINE_17 + * @arg @ref FL_GPIO_EXTI_LINE_18 + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_RISING + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_FALLING + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_BOTH + * @arg @ref FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE + */ +__STATIC_INLINE uint32_t FL_GPIO_GetTriggerEdge1(GPIO_COMMON_Type *GPIOx, uint32_t line) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTIEDS1, + (((line>>16) * (line>>16)) * GPIO_EXTIEDS1)) / ((line>>16) * (line>>16))); +} + +/** + * @brief EXTI digital filter enable + * @rmtoll EXTIDF FL_GPIO_EnableDigitalFilter + * @param GPIOx GPIO Port + * @param line This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_0 + * @arg @ref FL_GPIO_EXTI_LINE_1 + * @arg @ref FL_GPIO_EXTI_LINE_2 + * @arg @ref FL_GPIO_EXTI_LINE_3 + * @arg @ref FL_GPIO_EXTI_LINE_4 + * @arg @ref FL_GPIO_EXTI_LINE_5 + * @arg @ref FL_GPIO_EXTI_LINE_6 + * @arg @ref FL_GPIO_EXTI_LINE_7 + * @arg @ref FL_GPIO_EXTI_LINE_8 + * @arg @ref FL_GPIO_EXTI_LINE_9 + * @arg @ref FL_GPIO_EXTI_LINE_10 + * @arg @ref FL_GPIO_EXTI_LINE_11 + * @arg @ref FL_GPIO_EXTI_LINE_12 + * @arg @ref FL_GPIO_EXTI_LINE_13 + * @arg @ref FL_GPIO_EXTI_LINE_14 + * @arg @ref FL_GPIO_EXTI_LINE_15 + * @arg @ref FL_GPIO_EXTI_LINE_16 + * @arg @ref FL_GPIO_EXTI_LINE_17 + * @arg @ref FL_GPIO_EXTI_LINE_18 + * @arg @ref FL_GPIO_EXTI_LINE_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_EnableDigitalFilter(GPIO_COMMON_Type *GPIOx, uint32_t line) +{ + SET_BIT(GPIOx->EXTIDF, ((line & 0x7ffff) << 0x0U)); +} + +/** + * @brief EXTI digital filter disable + * @rmtoll EXTIDF FL_GPIO_DisableDigitalFilter + * @param GPIOx GPIO Port + * @param line This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_0 + * @arg @ref FL_GPIO_EXTI_LINE_1 + * @arg @ref FL_GPIO_EXTI_LINE_2 + * @arg @ref FL_GPIO_EXTI_LINE_3 + * @arg @ref FL_GPIO_EXTI_LINE_4 + * @arg @ref FL_GPIO_EXTI_LINE_5 + * @arg @ref FL_GPIO_EXTI_LINE_6 + * @arg @ref FL_GPIO_EXTI_LINE_7 + * @arg @ref FL_GPIO_EXTI_LINE_8 + * @arg @ref FL_GPIO_EXTI_LINE_9 + * @arg @ref FL_GPIO_EXTI_LINE_10 + * @arg @ref FL_GPIO_EXTI_LINE_11 + * @arg @ref FL_GPIO_EXTI_LINE_12 + * @arg @ref FL_GPIO_EXTI_LINE_13 + * @arg @ref FL_GPIO_EXTI_LINE_14 + * @arg @ref FL_GPIO_EXTI_LINE_15 + * @arg @ref FL_GPIO_EXTI_LINE_16 + * @arg @ref FL_GPIO_EXTI_LINE_17 + * @arg @ref FL_GPIO_EXTI_LINE_18 + * @arg @ref FL_GPIO_EXTI_LINE_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_DisableDigitalFilter(GPIO_COMMON_Type *GPIOx, uint32_t line) +{ + CLEAR_BIT(GPIOx->EXTIDF, ((line & 0x7ffff) << 0x0U)); +} + +/** + * @brief Get EXTI digital filter enable status + * @rmtoll EXTIDF FL_GPIO_IsEnabledDigitalFilter + * @param GPIOx GPIO Port + * @param line This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_0 + * @arg @ref FL_GPIO_EXTI_LINE_1 + * @arg @ref FL_GPIO_EXTI_LINE_2 + * @arg @ref FL_GPIO_EXTI_LINE_3 + * @arg @ref FL_GPIO_EXTI_LINE_4 + * @arg @ref FL_GPIO_EXTI_LINE_5 + * @arg @ref FL_GPIO_EXTI_LINE_6 + * @arg @ref FL_GPIO_EXTI_LINE_7 + * @arg @ref FL_GPIO_EXTI_LINE_8 + * @arg @ref FL_GPIO_EXTI_LINE_9 + * @arg @ref FL_GPIO_EXTI_LINE_10 + * @arg @ref FL_GPIO_EXTI_LINE_11 + * @arg @ref FL_GPIO_EXTI_LINE_12 + * @arg @ref FL_GPIO_EXTI_LINE_13 + * @arg @ref FL_GPIO_EXTI_LINE_14 + * @arg @ref FL_GPIO_EXTI_LINE_15 + * @arg @ref FL_GPIO_EXTI_LINE_16 + * @arg @ref FL_GPIO_EXTI_LINE_17 + * @arg @ref FL_GPIO_EXTI_LINE_18 + * @arg @ref FL_GPIO_EXTI_LINE_ALL + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPIO_IsEnabledDigitalFilter(GPIO_COMMON_Type *GPIOx, uint32_t line) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTIDF, ((line & 0x7ffff) << 0x0U)) == ((line & 0x7ffff) << 0x0U)); +} + +/** + * @brief Get external interrupt flag status + * @rmtoll EXTIISR FL_GPIO_IsActiveFlag_EXTI + * @param GPIOx GPIO Port + * @param line This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_0 + * @arg @ref FL_GPIO_EXTI_LINE_1 + * @arg @ref FL_GPIO_EXTI_LINE_2 + * @arg @ref FL_GPIO_EXTI_LINE_3 + * @arg @ref FL_GPIO_EXTI_LINE_4 + * @arg @ref FL_GPIO_EXTI_LINE_5 + * @arg @ref FL_GPIO_EXTI_LINE_6 + * @arg @ref FL_GPIO_EXTI_LINE_7 + * @arg @ref FL_GPIO_EXTI_LINE_8 + * @arg @ref FL_GPIO_EXTI_LINE_9 + * @arg @ref FL_GPIO_EXTI_LINE_10 + * @arg @ref FL_GPIO_EXTI_LINE_11 + * @arg @ref FL_GPIO_EXTI_LINE_12 + * @arg @ref FL_GPIO_EXTI_LINE_13 + * @arg @ref FL_GPIO_EXTI_LINE_14 + * @arg @ref FL_GPIO_EXTI_LINE_15 + * @arg @ref FL_GPIO_EXTI_LINE_16 + * @arg @ref FL_GPIO_EXTI_LINE_17 + * @arg @ref FL_GPIO_EXTI_LINE_18 + * @arg @ref FL_GPIO_EXTI_LINE_ALL + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPIO_IsActiveFlag_EXTI(GPIO_COMMON_Type *GPIOx, uint32_t line) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTIISR, ((line & 0x7ffff) << 0x0U)) == ((line & 0x7ffff) << 0x0U)); +} + +/** + * @brief Clear external interrupt flag + * @rmtoll EXTIISR FL_GPIO_ClearFlag_EXTI + * @param GPIOx GPIO Port + * @param line This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_0 + * @arg @ref FL_GPIO_EXTI_LINE_1 + * @arg @ref FL_GPIO_EXTI_LINE_2 + * @arg @ref FL_GPIO_EXTI_LINE_3 + * @arg @ref FL_GPIO_EXTI_LINE_4 + * @arg @ref FL_GPIO_EXTI_LINE_5 + * @arg @ref FL_GPIO_EXTI_LINE_6 + * @arg @ref FL_GPIO_EXTI_LINE_7 + * @arg @ref FL_GPIO_EXTI_LINE_8 + * @arg @ref FL_GPIO_EXTI_LINE_9 + * @arg @ref FL_GPIO_EXTI_LINE_10 + * @arg @ref FL_GPIO_EXTI_LINE_11 + * @arg @ref FL_GPIO_EXTI_LINE_12 + * @arg @ref FL_GPIO_EXTI_LINE_13 + * @arg @ref FL_GPIO_EXTI_LINE_14 + * @arg @ref FL_GPIO_EXTI_LINE_15 + * @arg @ref FL_GPIO_EXTI_LINE_16 + * @arg @ref FL_GPIO_EXTI_LINE_17 + * @arg @ref FL_GPIO_EXTI_LINE_18 + * @arg @ref FL_GPIO_EXTI_LINE_ALL + * @retval None + */ +__STATIC_INLINE void FL_GPIO_ClearFlag_EXTI(GPIO_COMMON_Type *GPIOx, uint32_t line) +{ + WRITE_REG(GPIOx->EXTIISR, ((line & 0x7ffff) << 0x0U)); +} + +/** + * @brief Get EXTI input set status + * @rmtoll EXTIDI FL_GPIO_GetEXTILine + * @param GPIOx GPIO Port + * @param line This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_0 + * @arg @ref FL_GPIO_EXTI_LINE_1 + * @arg @ref FL_GPIO_EXTI_LINE_2 + * @arg @ref FL_GPIO_EXTI_LINE_3 + * @arg @ref FL_GPIO_EXTI_LINE_4 + * @arg @ref FL_GPIO_EXTI_LINE_5 + * @arg @ref FL_GPIO_EXTI_LINE_6 + * @arg @ref FL_GPIO_EXTI_LINE_7 + * @arg @ref FL_GPIO_EXTI_LINE_8 + * @arg @ref FL_GPIO_EXTI_LINE_9 + * @arg @ref FL_GPIO_EXTI_LINE_10 + * @arg @ref FL_GPIO_EXTI_LINE_11 + * @arg @ref FL_GPIO_EXTI_LINE_12 + * @arg @ref FL_GPIO_EXTI_LINE_13 + * @arg @ref FL_GPIO_EXTI_LINE_14 + * @arg @ref FL_GPIO_EXTI_LINE_15 + * @arg @ref FL_GPIO_EXTI_LINE_16 + * @arg @ref FL_GPIO_EXTI_LINE_17 + * @arg @ref FL_GPIO_EXTI_LINE_18 + * @arg @ref FL_GPIO_EXTI_LINE_ALL + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPIO_GetEXTILine(GPIO_COMMON_Type *GPIOx, uint32_t line) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTIDI, ((line & 0x7ffff) << 0x0U)) == ((line & 0x7ffff) << 0x0U)); +} + +/** + * @brief Get EXTI input status + * @rmtoll EXTIDI FL_GPIO_ReadEXTILines + * @param GPIOx GPIO Port + * @retval EXTI data register value of port + */ +__STATIC_INLINE uint32_t FL_GPIO_ReadEXTILines(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTIDI, (0x7ffffU << 0U)) >> 0U); +} + +/** + * @brief Set FOUT0 frequency output + * @rmtoll FOUTSEL FOUT0 FL_GPIO_SetFOUT0 + * @param GPIOx GPIO Port + * @param select This parameter can be one of the following values: + * @arg @ref FL_GPIO_FOUT0_SELECT_XTLF + * @arg @ref FL_GPIO_FOUT0_SELECT_RCLP + * @arg @ref FL_GPIO_FOUT0_SELECT_RCHF_DIV64 + * @arg @ref FL_GPIO_FOUT0_SELECT_LSCLK + * @arg @ref FL_GPIO_FOUT0_SELECT_AHBCLK_DIV64 + * @arg @ref FL_GPIO_FOUT0_SELECT_RTCTM + * @arg @ref FL_GPIO_FOUT0_SELECT_PLLOUTPUT_DIV64 + * @arg @ref FL_GPIO_FOUT0_SELECT_RTCCLK64HZ + * @arg @ref FL_GPIO_FOUT0_SELECT_APBCLK_DIV64 + * @arg @ref FL_GPIO_FOUT0_SELECT_PLLOUTPUT + * @arg @ref FL_GPIO_FOUT0_SELECT_RCLF + * @arg @ref FL_GPIO_FOUT0_SELECT_RCHF + * @arg @ref FL_GPIO_FOUT0_SELECT_XTHF_DIV64 + * @arg @ref FL_GPIO_FOUT0_SELECT_COMP1O + * @arg @ref FL_GPIO_FOUT0_SELECT_CLK_8K + * @arg @ref FL_GPIO_FOUT0_SELECT_ADC_CLK + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetFOUT0(GPIO_COMMON_Type *GPIOx, uint32_t select) +{ + MODIFY_REG(GPIOx->FOUTSEL, GPIO_FOUTSEL_FOUT0_Msk, select); +} + +/** + * @brief Get FOUT0 frequency output + * @rmtoll FOUTSEL FOUT0 FL_GPIO_GetFOUT0 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPIO_FOUT0_SELECT_XTLF + * @arg @ref FL_GPIO_FOUT0_SELECT_RCLP + * @arg @ref FL_GPIO_FOUT0_SELECT_RCHF_DIV64 + * @arg @ref FL_GPIO_FOUT0_SELECT_LSCLK + * @arg @ref FL_GPIO_FOUT0_SELECT_AHBCLK_DIV64 + * @arg @ref FL_GPIO_FOUT0_SELECT_RTCTM + * @arg @ref FL_GPIO_FOUT0_SELECT_PLLOUTPUT_DIV64 + * @arg @ref FL_GPIO_FOUT0_SELECT_RTCCLK64HZ + * @arg @ref FL_GPIO_FOUT0_SELECT_APBCLK_DIV64 + * @arg @ref FL_GPIO_FOUT0_SELECT_PLLOUTPUT + * @arg @ref FL_GPIO_FOUT0_SELECT_RCLF + * @arg @ref FL_GPIO_FOUT0_SELECT_RCHF + * @arg @ref FL_GPIO_FOUT0_SELECT_XTHF_DIV64 + * @arg @ref FL_GPIO_FOUT0_SELECT_COMP1O + * @arg @ref FL_GPIO_FOUT0_SELECT_CLK_8K + * @arg @ref FL_GPIO_FOUT0_SELECT_ADC_CLK + */ +__STATIC_INLINE uint32_t FL_GPIO_GetFOUT0(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->FOUTSEL, GPIO_FOUTSEL_FOUT0_Msk)); +} + +/** + * @brief Set FOUT1 frequency output + * @rmtoll FOUTSEL FOUT1 FL_GPIO_SetFOUT1 + * @param GPIOx GPIO Port + * @param select This parameter can be one of the following values: + * @arg @ref FL_GPIO_FOUT1_SELECT_XTLF + * @arg @ref FL_GPIO_FOUT1_SELECT_RCLP + * @arg @ref FL_GPIO_FOUT1_SELECT_ADCCLK + * @arg @ref FL_GPIO_FOUT1_SELECT_LSCLK + * @arg @ref FL_GPIO_FOUT1_SELECT_EOC + * @arg @ref FL_GPIO_FOUT1_SELECT_RTCTM + * @arg @ref FL_GPIO_FOUT1_SELECT_PLLOUTPUT_DIV64 + * @arg @ref FL_GPIO_FOUT1_SELECT_EOCAL + * @arg @ref FL_GPIO_FOUT1_SELECT_APBCLK_DIV64 + * @arg @ref FL_GPIO_FOUT1_SELECT_ROSC_TDLV + * @arg @ref FL_GPIO_FOUT1_SELECT_RCLF + * @arg @ref FL_GPIO_FOUT1_SELECT_RCHF + * @arg @ref FL_GPIO_FOUT1_SELECT_XTHF_DIV64 + * @arg @ref FL_GPIO_FOUT1_SELECT_ADCCLK_DIV64 + * @arg @ref FL_GPIO_FOUT1_SELECT_CLK_8K + * @arg @ref FL_GPIO_FOUT1_SELECT_ROSC_TDHV + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetFOUT1(GPIO_COMMON_Type *GPIOx, uint32_t select) +{ + MODIFY_REG(GPIOx->FOUTSEL, GPIO_FOUTSEL_FOUT1_Msk, select); +} + +/** + * @brief Get FOUT1 frequency output + * @rmtoll FOUTSEL FOUT1 FL_GPIO_GetFOUT1 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPIO_FOUT1_SELECT_XTLF + * @arg @ref FL_GPIO_FOUT1_SELECT_RCLP + * @arg @ref FL_GPIO_FOUT1_SELECT_ADCCLK + * @arg @ref FL_GPIO_FOUT1_SELECT_LSCLK + * @arg @ref FL_GPIO_FOUT1_SELECT_EOC + * @arg @ref FL_GPIO_FOUT1_SELECT_RTCTM + * @arg @ref FL_GPIO_FOUT1_SELECT_PLLOUTPUT_DIV64 + * @arg @ref FL_GPIO_FOUT1_SELECT_EOCAL + * @arg @ref FL_GPIO_FOUT1_SELECT_APBCLK_DIV64 + * @arg @ref FL_GPIO_FOUT1_SELECT_ROSC_TDLV + * @arg @ref FL_GPIO_FOUT1_SELECT_RCLF + * @arg @ref FL_GPIO_FOUT1_SELECT_RCHF + * @arg @ref FL_GPIO_FOUT1_SELECT_XTHF_DIV64 + * @arg @ref FL_GPIO_FOUT1_SELECT_ADCCLK_DIV64 + * @arg @ref FL_GPIO_FOUT1_SELECT_CLK_8K + * @arg @ref FL_GPIO_FOUT1_SELECT_ROSC_TDHV + */ +__STATIC_INLINE uint32_t FL_GPIO_GetFOUT1(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->FOUTSEL, GPIO_FOUTSEL_FOUT1_Msk)); +} + +/** + * @brief Set EXTI0 interrupt input + * @rmtoll EXTISEL0 EXTI0 FL_GPIO_SetExtiLine0 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_0_PA0 + * @arg @ref FL_GPIO_EXTI_LINE_0_PA1 + * @arg @ref FL_GPIO_EXTI_LINE_0_PA2 + * @arg @ref FL_GPIO_EXTI_LINE_0_PA3 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine0(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI0_Msk, EXTIPin); +} + +/** + * @brief Get EXTI0 interrupt input + * @rmtoll EXTISEL0 EXTI0 FL_GPIO_GetExtiLine0 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine0(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI0_Msk)); +} + +/** + * @brief Set EXTI1 interrupt input + * @rmtoll EXTISEL0 EXTI1 FL_GPIO_SetExtiLine1 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_1_PA4 + * @arg @ref FL_GPIO_EXTI_LINE_1_PA5 + * @arg @ref FL_GPIO_EXTI_LINE_1_PA6 + * @arg @ref FL_GPIO_EXTI_LINE_1_PA7 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine1(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI1_Msk, EXTIPin); +} + +/** + * @brief Get EXTI1 interrupt input + * @rmtoll EXTISEL0 EXTI1 FL_GPIO_GetExtiLine1 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine1(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI1_Msk)); +} + +/** + * @brief Set EXTI2 interrupt input + * @rmtoll EXTISEL0 EXTI2 FL_GPIO_SetExtiLine2 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_2_PA8 + * @arg @ref FL_GPIO_EXTI_LINE_2_PA9 + * @arg @ref FL_GPIO_EXTI_LINE_2_PA10 + * @arg @ref FL_GPIO_EXTI_LINE_2_PA11 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine2(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI2_Msk, EXTIPin); +} + +/** + * @brief Get EXTI2 interrupt input + * @rmtoll EXTISEL0 EXTI2 FL_GPIO_GetExtiLine2 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine2(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI2_Msk)); +} + +/** + * @brief Set EXTI3 interrupt input + * @rmtoll EXTISEL0 EXTI3 FL_GPIO_SetExtiLine3 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_3_PA12 + * @arg @ref FL_GPIO_EXTI_LINE_3_PA13 + * @arg @ref FL_GPIO_EXTI_LINE_3_PA14 + * @arg @ref FL_GPIO_EXTI_LINE_3_PA15 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine3(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI3_Msk, EXTIPin); +} + +/** + * @brief Get EXTI3 interrupt input + * @rmtoll EXTISEL0 EXTI3 FL_GPIO_GetExtiLine3 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine3(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI3_Msk)); +} + +/** + * @brief Set EXTI4 interrupt input + * @rmtoll EXTISEL0 EXTI4 FL_GPIO_SetExtiLine4 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_4_PB0 + * @arg @ref FL_GPIO_EXTI_LINE_4_PB1 + * @arg @ref FL_GPIO_EXTI_LINE_4_PB2 + * @arg @ref FL_GPIO_EXTI_LINE_4_PB3 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine4(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI4_Msk, EXTIPin); +} + +/** + * @brief Get EXTI4 interrupt input + * @rmtoll EXTISEL0 EXTI4 FL_GPIO_GetExtiLine4 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine4(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI4_Msk)); +} + +/** + * @brief Set EXTI5 interrupt input + * @rmtoll EXTISEL0 EXTI5 FL_GPIO_SetExtiLine5 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_5_PB4 + * @arg @ref FL_GPIO_EXTI_LINE_5_PB5 + * @arg @ref FL_GPIO_EXTI_LINE_5_PB6 + * @arg @ref FL_GPIO_EXTI_LINE_5_PB7 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine5(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI5_Msk, EXTIPin); +} + +/** + * @brief Get EXTI5 interrupt input + * @rmtoll EXTISEL0 EXTI5 FL_GPIO_GetExtiLine5 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine5(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI5_Msk)); +} + +/** + * @brief Set EXTI6 interrupt input + * @rmtoll EXTISEL0 EXTI6 FL_GPIO_SetExtiLine6 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_6_PB8 + * @arg @ref FL_GPIO_EXTI_LINE_6_PB9 + * @arg @ref FL_GPIO_EXTI_LINE_6_PB10 + * @arg @ref FL_GPIO_EXTI_LINE_6_PB11 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine6(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI6_Msk, EXTIPin); +} + +/** + * @brief Get EXTI6 interrupt input + * @rmtoll EXTISEL0 EXTI6 FL_GPIO_GetExtiLine6 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine6(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI6_Msk)); +} + +/** + * @brief Set EXTI7 interrupt input + * @rmtoll EXTISEL0 EXTI7 FL_GPIO_SetExtiLine7 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_7_PB12 + * @arg @ref FL_GPIO_EXTI_LINE_7_PB13 + * @arg @ref FL_GPIO_EXTI_LINE_7_PB14 + * @arg @ref FL_GPIO_EXTI_LINE_7_PB15 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine7(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI7_Msk, EXTIPin); +} + +/** + * @brief Get EXTI7 interrupt input + * @rmtoll EXTISEL0 EXTI7 FL_GPIO_GetExtiLine7 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine7(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI7_Msk)); +} + +/** + * @brief Set EXTI8 interrupt input + * @rmtoll EXTISEL0 EXTI8 FL_GPIO_SetExtiLine8 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_8_PC0 + * @arg @ref FL_GPIO_EXTI_LINE_8_PC1 + * @arg @ref FL_GPIO_EXTI_LINE_8_PC2 + * @arg @ref FL_GPIO_EXTI_LINE_8_PC3 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine8(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI8_Msk, EXTIPin); +} + +/** + * @brief Get EXTI8 interrupt input + * @rmtoll EXTISEL0 EXTI8 FL_GPIO_GetExtiLine8 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine8(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI8_Msk)); +} + +/** + * @brief Set EXTI9 interrupt input + * @rmtoll EXTISEL0 EXTI9 FL_GPIO_SetExtiLine9 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_9_PC4 + * @arg @ref FL_GPIO_EXTI_LINE_9_PC5 + * @arg @ref FL_GPIO_EXTI_LINE_9_PC6 + * @arg @ref FL_GPIO_EXTI_LINE_9_PC7 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine9(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI9_Msk, EXTIPin); +} + +/** + * @brief Get EXTI9 interrupt input + * @rmtoll EXTISEL0 EXTI9 FL_GPIO_GetExtiLine9 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine9(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI9_Msk)); +} + +/** + * @brief Set EXTI10 interrupt input + * @rmtoll EXTISEL0 EXTI10 FL_GPIO_SetExtiLine10 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_10_PC8 + * @arg @ref FL_GPIO_EXTI_LINE_10_PC9 + * @arg @ref FL_GPIO_EXTI_LINE_10_PC10 + * @arg @ref FL_GPIO_EXTI_LINE_10_PC11 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine10(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI10_Msk, EXTIPin); +} + +/** + * @brief Get EXTI10 interrupt input + * @rmtoll EXTISEL0 EXTI10 FL_GPIO_GetExtiLine10 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine10(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI10_Msk)); +} + +/** + * @brief Set EXTI11 interrupt input + * @rmtoll EXTISEL0 EXTI11 FL_GPIO_SetExtiLine11 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_11_PC12 + * @arg @ref FL_GPIO_EXTI_LINE_11_PC13 + * @arg @ref FL_GPIO_EXTI_LINE_11_PC14 + * @arg @ref FL_GPIO_EXTI_LINE_11_PC15 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine11(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI11_Msk, EXTIPin); +} + +/** + * @brief Get EXTI11 interrupt input + * @rmtoll EXTISEL0 EXTI11 FL_GPIO_GetExtiLine11 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine11(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI11_Msk)); +} + +/** + * @brief Set EXTI12 interrupt input + * @rmtoll EXTISEL0 EXTI12 FL_GPIO_SetExtiLine12 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_12_PD0 + * @arg @ref FL_GPIO_EXTI_LINE_12_PD1 + * @arg @ref FL_GPIO_EXTI_LINE_12_PD2 + * @arg @ref FL_GPIO_EXTI_LINE_12_PD3 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine12(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI12_Msk, EXTIPin); +} + +/** + * @brief Get EXTI12 interrupt input + * @rmtoll EXTISEL0 EXTI12 FL_GPIO_GetExtiLine12 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine12(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI12_Msk)); +} + +/** + * @brief Set EXTI13 interrupt input + * @rmtoll EXTISEL0 EXTI13 FL_GPIO_SetExtiLine13 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_13_PD4 + * @arg @ref FL_GPIO_EXTI_LINE_13_PD5 + * @arg @ref FL_GPIO_EXTI_LINE_13_PD6 + * @arg @ref FL_GPIO_EXTI_LINE_13_PD7 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine13(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI13_Msk, EXTIPin); +} + +/** + * @brief Get EXTI13 interrupt input + * @rmtoll EXTISEL0 EXTI13 FL_GPIO_GetExtiLine13 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine13(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI13_Msk)); +} + +/** + * @brief Set EXTI14 interrupt input + * @rmtoll EXTISEL0 EXTI14 FL_GPIO_SetExtiLine14 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_14_PD8 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine14(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI14_Msk, EXTIPin); +} + +/** + * @brief Get EXTI14 interrupt input + * @rmtoll EXTISEL0 EXTI14 FL_GPIO_GetExtiLine14 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine14(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI14_Msk)); +} + +/** + * @brief Set EXTI15 interrupt input + * @rmtoll EXTISEL0 EXTI15 FL_GPIO_SetExtiLine15 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_14_PD9 + * @arg @ref FL_GPIO_EXTI_LINE_14_PD10 + * @arg @ref FL_GPIO_EXTI_LINE_14_PD11 + * @arg @ref FL_GPIO_EXTI_LINE_15_PD12 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine15(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI15_Msk, EXTIPin); +} + +/** + * @brief Get EXTI15 interrupt input + * @rmtoll EXTISEL0 EXTI15 FL_GPIO_GetExtiLine15 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine15(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL0, GPIO_EXTISEL0_EXTI15_Msk)); +} + +/** + * @brief Set EXTI16 interrupt input + * @rmtoll EXTISEL1 EXTI16 FL_GPIO_SetExtiLine16 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_16_PE0 + * @arg @ref FL_GPIO_EXTI_LINE_16_PE1 + * @arg @ref FL_GPIO_EXTI_LINE_16_PE2 + * @arg @ref FL_GPIO_EXTI_LINE_16_PE3 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine16(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL1, GPIO_EXTISEL1_EXTI16_Msk, EXTIPin); +} + +/** + * @brief Get EXTI16 interrupt input + * @rmtoll EXTISEL1 EXTI16 FL_GPIO_GetExtiLine16 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine16(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL1, GPIO_EXTISEL1_EXTI16_Msk)); +} + +/** + * @brief Set EXTI17 interrupt input + * @rmtoll EXTISEL1 EXTI17 FL_GPIO_SetExtiLine17 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_17_PE4 + * @arg @ref FL_GPIO_EXTI_LINE_17_PE5 + * @arg @ref FL_GPIO_EXTI_LINE_17_PE6 + * @arg @ref FL_GPIO_EXTI_LINE_17_PE7 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine17(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL1, GPIO_EXTISEL1_EXTI17_Msk, EXTIPin); +} + +/** + * @brief Get EXTI17 interrupt input + * @rmtoll EXTISEL1 EXTI17 FL_GPIO_GetExtiLine17 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine17(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL1, GPIO_EXTISEL1_EXTI17_Msk)); +} + +/** + * @brief Set EXTI18 interrupt input + * @rmtoll EXTISEL1 EXTI18 FL_GPIO_SetExtiLine18 + * @param GPIOx GPIO Port + * @param EXTIPin This parameter can be one of the following values: + * @arg @ref FL_GPIO_EXTI_LINE_18_PE8 + * @arg @ref FL_GPIO_EXTI_LINE_18_PE9 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetExtiLine18(GPIO_COMMON_Type *GPIOx, uint32_t EXTIPin) +{ + MODIFY_REG(GPIOx->EXTISEL1, GPIO_EXTISEL1_EXTI18_Msk, EXTIPin); +} + +/** + * @brief Get EXTI18 interrupt input + * @rmtoll EXTISEL1 EXTI18 FL_GPIO_GetExtiLine18 + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPIO_GetExtiLine18(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->EXTISEL1, GPIO_EXTISEL1_EXTI18_Msk)); +} + +/** + * @brief Get WKUP enable status + * @rmtoll PINWKEN EN FL_GPIO_IsEnabledWakeup + * @param GPIOx GPIO Port + * @param wakeup This parameter can be one of the following values: + * @arg @ref FL_GPIO_WAKEUP_0 + * @arg @ref FL_GPIO_WAKEUP_1 + * @arg @ref FL_GPIO_WAKEUP_2 + * @arg @ref FL_GPIO_WAKEUP_3 + * @arg @ref FL_GPIO_WAKEUP_4 + * @arg @ref FL_GPIO_WAKEUP_5 + * @arg @ref FL_GPIO_WAKEUP_6 + * @arg @ref FL_GPIO_WAKEUP_7 + * @arg @ref FL_GPIO_WAKEUP_8 + * @arg @ref FL_GPIO_WAKEUP_9 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPIO_IsEnabledWakeup(GPIO_COMMON_Type *GPIOx, uint32_t wakeup) +{ + return (uint32_t)(READ_BIT(GPIOx->PINWKEN, ((wakeup & 0x3ff) << 0x0U)) == ((wakeup & 0x3ff) << 0x0U)); +} + +/** + * @brief WKUP enable + * @rmtoll PINWKEN EN FL_GPIO_EnableWakeup + * @param GPIOx GPIO Port + * @param wakeup This parameter can be one of the following values: + * @arg @ref FL_GPIO_WAKEUP_0 + * @arg @ref FL_GPIO_WAKEUP_1 + * @arg @ref FL_GPIO_WAKEUP_2 + * @arg @ref FL_GPIO_WAKEUP_3 + * @arg @ref FL_GPIO_WAKEUP_4 + * @arg @ref FL_GPIO_WAKEUP_5 + * @arg @ref FL_GPIO_WAKEUP_6 + * @arg @ref FL_GPIO_WAKEUP_7 + * @arg @ref FL_GPIO_WAKEUP_8 + * @arg @ref FL_GPIO_WAKEUP_9 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_EnableWakeup(GPIO_COMMON_Type *GPIOx, uint32_t wakeup) +{ + SET_BIT(GPIOx->PINWKEN, ((wakeup & 0x3ff) << 0x0U)); +} + +/** + * @brief WKUP disable + * @rmtoll PINWKEN EN FL_GPIO_DisableWakeup + * @param GPIOx GPIO Port + * @param wakeup This parameter can be one of the following values: + * @arg @ref FL_GPIO_WAKEUP_0 + * @arg @ref FL_GPIO_WAKEUP_1 + * @arg @ref FL_GPIO_WAKEUP_2 + * @arg @ref FL_GPIO_WAKEUP_3 + * @arg @ref FL_GPIO_WAKEUP_4 + * @arg @ref FL_GPIO_WAKEUP_5 + * @arg @ref FL_GPIO_WAKEUP_6 + * @arg @ref FL_GPIO_WAKEUP_7 + * @arg @ref FL_GPIO_WAKEUP_8 + * @arg @ref FL_GPIO_WAKEUP_9 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_DisableWakeup(GPIO_COMMON_Type *GPIOx, uint32_t wakeup) +{ + CLEAR_BIT(GPIOx->PINWKEN, ((wakeup & 0x3ff) << 0x0U)); +} + +/** + * @brief Get WKUP interrupt entry + * @rmtoll PINWKEN WKISEL FL_GPIO_GetWakeupInterruptEntry + * @param GPIOx GPIO Port + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPIO_WAKEUP_INT_ENTRY_NMI + * @arg @ref FL_GPIO_WAKEUP_INT_ENTRY_38 + */ +__STATIC_INLINE uint32_t FL_GPIO_GetWakeupInterruptEntry(GPIO_COMMON_Type *GPIOx) +{ + return (uint32_t)(READ_BIT(GPIOx->PINWKEN, GPIO_PINWKEN_WKISEL_Msk)); +} + +/** + * @brief Set wkup interrupt entry + * @rmtoll PINWKEN WKISEL FL_GPIO_SetWakeupInterruptEntry + * @param GPIOx GPIO Port + * @param wakeup This parameter can be one of the following values: + * @arg @ref FL_GPIO_WAKEUP_INT_ENTRY_NMI + * @arg @ref FL_GPIO_WAKEUP_INT_ENTRY_38 + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetWakeupInterruptEntry(GPIO_COMMON_Type *GPIOx, uint32_t wakeup) +{ + MODIFY_REG(GPIOx->PINWKEN, GPIO_PINWKEN_WKISEL_Msk, wakeup); +} + +/** + * @brief Set WKUP edge polarity + * @rmtoll PINWKEN SEL FL_GPIO_SetWakeupEdge + * @param GPIOx GPIO Port + * @param wakeup This parameter can be one of the following values: + * @arg @ref FL_GPIO_WAKEUP_0 + * @arg @ref FL_GPIO_WAKEUP_1 + * @arg @ref FL_GPIO_WAKEUP_2 + * @arg @ref FL_GPIO_WAKEUP_3 + * @arg @ref FL_GPIO_WAKEUP_4 + * @arg @ref FL_GPIO_WAKEUP_5 + * @arg @ref FL_GPIO_WAKEUP_6 + * @arg @ref FL_GPIO_WAKEUP_7 + * @arg @ref FL_GPIO_WAKEUP_8 + * @arg @ref FL_GPIO_WAKEUP_9 + * @param mode This parameter can be one of the following values: + * @arg @ref FL_GPIO_WAKEUP_TRIGGER_RISING + * @arg @ref FL_GPIO_WAKEUP_TRIGGER_FALLING + * @arg @ref FL_GPIO_WAKEUP_TRIGGER_BOTH + * @retval None + */ +__STATIC_INLINE void FL_GPIO_SetWakeupEdge(GPIO_COMMON_Type *GPIOx, uint32_t wakeup, uint32_t mode) +{ + MODIFY_REG(GPIOx->PINWKEN, ((wakeup * wakeup) * GPIO_PINWKEN_SEL), ((wakeup * wakeup) * mode)); +} + +/** + * @brief Get WKUP edge polarity + * @rmtoll PINWKEN SEL FL_GPIO_GetWakeupEdge + * @param GPIOx GPIO Port + * @param wakeup This parameter can be one of the following values: + * @arg @ref FL_GPIO_WAKEUP_0 + * @arg @ref FL_GPIO_WAKEUP_1 + * @arg @ref FL_GPIO_WAKEUP_2 + * @arg @ref FL_GPIO_WAKEUP_3 + * @arg @ref FL_GPIO_WAKEUP_4 + * @arg @ref FL_GPIO_WAKEUP_5 + * @arg @ref FL_GPIO_WAKEUP_6 + * @arg @ref FL_GPIO_WAKEUP_7 + * @arg @ref FL_GPIO_WAKEUP_8 + * @arg @ref FL_GPIO_WAKEUP_9 + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPIO_WAKEUP_TRIGGER_RISING + * @arg @ref FL_GPIO_WAKEUP_TRIGGER_FALLING + * @arg @ref FL_GPIO_WAKEUP_TRIGGER_BOTH + */ +__STATIC_INLINE uint32_t FL_GPIO_GetWakeupEdge(GPIO_COMMON_Type *GPIOx, uint32_t wakeup) +{ + return (uint32_t)(READ_BIT(GPIOx->PINWKEN, ((wakeup * wakeup) * GPIO_PINWKEN_SEL)) / (wakeup * wakeup)); +} + +/** + * @} + */ + +/** @defgroup GPIO_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_GPIO_Init(GPIO_Type *GPIOx, FL_GPIO_InitTypeDef *initStruct); +FL_ErrorStatus FL_GPIO_DeInit(GPIO_Type *GPIOx, uint32_t pin); +void FL_GPIO_StructInit(FL_GPIO_InitTypeDef *initStruct); + +FL_ErrorStatus FL_WKUP_Init(FL_WKUP_InitTypeDef *initStruct, uint32_t wakeup); +FL_ErrorStatus FL_WKUP_DeInit(uint32_t wakeup); +void FL_WKUP_StructInit(FL_WKUP_InitTypeDef *initStruct); + +void FL_GPIO_ALLPIN_LPM_MODE(void); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_GPIO_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.1 @ 2020-10-20*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_gptim.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_gptim.h new file mode 100644 index 0000000..b86506d --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_gptim.h @@ -0,0 +1,2963 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_gptim.h + * @author FMSH Application Team + * @brief Head file of GPTIM FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_GPTIM_H +#define __FM33LG0XX_FL_GPTIM_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup GPTIM GPTIM + * @brief GPTIM FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup GPTIM_FL_ES_INIT GPTIM Exported Init structures + * @{ + */ + +/** + * @brief FL GPTIM Init Sturcture definition + */ +typedef struct +{ + /*! 预分频系数 */ + uint32_t prescaler; + /*! 计数模式 */ + uint32_t counterMode; + /*! 自动重装载值 */ + uint32_t autoReload; + /*! 预装载使能 */ + uint32_t autoReloadState; + /*!定时器分频系数与数字滤波器所使用的采样时钟分频比*/ + uint32_t clockDivision; + +} FL_GPTIM_InitTypeDef; +/** + * @brief GTIM SlaveMode Init Sturcture definition + */ +typedef struct +{ + /*! ITRx 源*/ + uint32_t ITRSourceGroup; + /*! 外部时钟源模式 */ + uint32_t slaveMode; + /*! 输入触发信号选择 */ + uint32_t triggerSrc; + /*! Trigger 延迟*/ + uint32_t triggerDelay; + +} FL_GPTIM_SlaveInitTypeDef; +/** + * @brief TIM Input Capture configuration structure definition. + */ + +typedef struct +{ + /*! 输入捕获使能 */ + uint32_t captureState; + /*! 输入捕获极性 */ + uint32_t ICPolarity; + /*! 通道映射激活的输入选择 */ + uint32_t ICActiveInput; + /*! 输入分频 */ + uint32_t ICPrescaler; + /*! 输入滤波 */ + uint32_t ICFilter; + +} FL_GPTIM_IC_InitTypeDef; +/** + * @brief TIM ETR configuration structure definition. + */ + +typedef struct +{ + /*! 外部触发使能 */ + uint32_t useExternalTrigger; + /*! 外部时钟滤波 */ + uint32_t ETRFilter; + /*! 外部时钟分频 */ + uint32_t ETRClockDivision; + /*! 外部时钟触发极性 */ + uint32_t ETRPolarity; + +} FL_GPTIM_ETR_InitTypeDef; + +/** + * @brief TIM Output Compare configuration structure definition. + */ +typedef struct +{ + /*! 比较输出模式 */ + uint32_t OCMode; + /*! 比较输出通道快速模式使能 */ + uint32_t OCFastMode; + /*! 输出比较预装载 */ + uint32_t OCPreload; + /*! 通道比较值 */ + uint32_t compareValue; + /*! 比较输出极性 */ + uint32_t OCPolarity; + /*! ETR清0使能 */ + uint32_t OCETRFStatus; + +} FL_GPTIM_OC_InitTypeDef; + +/** + * @} + */ + +/** + * GPTIM0~GPTIM2 ITRSEL_Group 映射表 + * + * ===================== GPTIM0 ====================== + * --------------------------------------------------- + * ITRx | Group | Function Name | Function Type + * --------------------------------------------------- + * ITR0 | 0 | ATIM_TRGO | 计数触发 + * | 1 | UART0_RX | 宽度捕捉 + * | 2 | UART1_RX | 宽度捕捉 + * | 3 | UART3_RX | 宽度捕捉 + * --------------------------------------------------- + * ITR1 | 0 | GPTIM2_TRGO | 计数触发 + * | 1 | XTHF | 周期捕捉 + * | 2 | RCHF | 周期捕捉 + * | 3 | LPUART1_RX | 周期捕捉 + * --------------------------------------------------- + * ITR2 | 0 | BSTIM32_TRGO | 计数触发 + * | 1 | LPUART2_RX | 宽度捕捉 + * | 2 | RCLP | 周期捕捉 + * | 3 | XTLF | 周期捕捉 + * --------------------------------------------------- + * ITR3 | 0 | COMP1_TRGO | 计数触发 + * | 1 | RCLF | 周期捕捉 + * | 2 | COMP2_TRGO | 计数触发 + * | 3 | LPT32_TRGO | 计数触发 + * --------------------------------------------------- + * + * ===================== GPTIM1 ====================== + * --------------------------------------------------- + * ITRx | Group | Function Name | Function Type + * --------------------------------------------------- + * ITR0 | 0 | ATIM_TRGO | 计数触发 + * | 1 | UART0_RX | 宽度捕捉 + * | 2 | UART1_RX | 宽度捕捉 + * | 3 | UART3_RX | 宽度捕捉 + * --------------------------------------------------- + * ITR1 | 0 | GPTIM0_TRGO | 计数触发 + * | 1 | LUT1_TRGO | 周期捕捉 + * | 2 | RCHF | 周期捕捉 + * | 3 | ADC_EOC_TRGO | 计数触发 + * --------------------------------------------------- + * ITR2 | 0 | BSTIM32_TRGO | 计数触发 + * | 1 | LSCLK | 周期捕捉 + * | 2 | RCLP | 周期捕捉 + * | 3 | XTLF | 周期捕捉 + * --------------------------------------------------- + * ITR3 | 0 | COMP1_TRGO | 计数触发 + * | 1 | LUT3_TRGO | 周期捕捉 + * | 2 | COMP2_TRGO | 计数触发 + * | 3 | LPT32_TRGO | 计数触发 + * --------------------------------------------------- + * + * ===================== GPTIM2 ====================== + * --------------------------------------------------- + * ITRx | Group | Function Name | Function Type + * --------------------------------------------------- + * ITR0 | 0 | ATIM_TRGO | 计数触发 + * | 1 | UART3_RX | 宽度捕捉 + * | 2 | UART4_RX | 宽度捕捉 + * | 3 | LUT0_TRGO | 宽度捕捉 + * --------------------------------------------------- + * ITR1 | 0 | GPTIM1_TRGO | 计数触发 + * | 1 | XTHF | 周期捕捉 + * | 2 | RCHF | 周期捕捉 + * | 3 | ADC_EOC_TRGO | 计数触发 + * --------------------------------------------------- + * ITR2 | 0 | BSTIM16_TRGO | 计数触发 + * | 1 | LSCLK | 周期捕捉 + * | 2 | RCLP | 周期捕捉 + * | 3 | XTLF | 周期捕捉 + * --------------------------------------------------- + * ITR3 | 0 | COMP1_TRGO | 计数触发 + * | 1 | LUT2_TRGO | 周期捕捉 + * | 2 | COMP2_TRGO | 计数触发 + * | 3 | LPT16_TRGO | 计数触发 + * --------------------------------------------------- + * + */ + +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup GPTIM_FL_Exported_Constants GPTIM Exported Constants + * @{ + */ + +#define GPTIM_CR1_CKD_Pos (8U) +#define GPTIM_CR1_CKD_Msk (0x3U << GPTIM_CR1_CKD_Pos) +#define GPTIM_CR1_CKD GPTIM_CR1_CKD_Msk + +#define GPTIM_CR1_ARPE_Pos (7U) +#define GPTIM_CR1_ARPE_Msk (0x1U << GPTIM_CR1_ARPE_Pos) +#define GPTIM_CR1_ARPE GPTIM_CR1_ARPE_Msk + +#define GPTIM_CR1_CMS_Pos (5U) +#define GPTIM_CR1_CMS_Msk (0x3U << GPTIM_CR1_CMS_Pos) +#define GPTIM_CR1_CMS GPTIM_CR1_CMS_Msk + +#define GPTIM_CR1_DIR_Pos (4U) +#define GPTIM_CR1_DIR_Msk (0x1U << GPTIM_CR1_DIR_Pos) +#define GPTIM_CR1_DIR GPTIM_CR1_DIR_Msk + +#define GPTIM_CR1_OPM_Pos (3U) +#define GPTIM_CR1_OPM_Msk (0x1U << GPTIM_CR1_OPM_Pos) +#define GPTIM_CR1_OPM GPTIM_CR1_OPM_Msk + +#define GPTIM_CR1_URS_Pos (2U) +#define GPTIM_CR1_URS_Msk (0x1U << GPTIM_CR1_URS_Pos) +#define GPTIM_CR1_URS GPTIM_CR1_URS_Msk + +#define GPTIM_CR1_UDIS_Pos (1U) +#define GPTIM_CR1_UDIS_Msk (0x1U << GPTIM_CR1_UDIS_Pos) +#define GPTIM_CR1_UDIS GPTIM_CR1_UDIS_Msk + +#define GPTIM_CR1_CEN_Pos (0U) +#define GPTIM_CR1_CEN_Msk (0x1U << GPTIM_CR1_CEN_Pos) +#define GPTIM_CR1_CEN GPTIM_CR1_CEN_Msk + +#define GPTIM_CR2_TI1S_Pos (7U) +#define GPTIM_CR2_TI1S_Msk (0x1U << GPTIM_CR2_TI1S_Pos) +#define GPTIM_CR2_TI1S GPTIM_CR2_TI1S_Msk + +#define GPTIM_CR2_MMS_Pos (4U) +#define GPTIM_CR2_MMS_Msk (0x7U << GPTIM_CR2_MMS_Pos) +#define GPTIM_CR2_MMS GPTIM_CR2_MMS_Msk + +#define GPTIM_CR2_CCDS_Pos (3U) +#define GPTIM_CR2_CCDS_Msk (0x1U << GPTIM_CR2_CCDS_Pos) +#define GPTIM_CR2_CCDS GPTIM_CR2_CCDS_Msk + +#define GPTIM_SMCR_ETP_Pos (15U) +#define GPTIM_SMCR_ETP_Msk (0x1U << GPTIM_SMCR_ETP_Pos) +#define GPTIM_SMCR_ETP GPTIM_SMCR_ETP_Msk + +#define GPTIM_SMCR_ECE_Pos (14U) +#define GPTIM_SMCR_ECE_Msk (0x1U << GPTIM_SMCR_ECE_Pos) +#define GPTIM_SMCR_ECE GPTIM_SMCR_ECE_Msk + +#define GPTIM_SMCR_ETPS_Pos (12U) +#define GPTIM_SMCR_ETPS_Msk (0x3U << GPTIM_SMCR_ETPS_Pos) +#define GPTIM_SMCR_ETPS GPTIM_SMCR_ETPS_Msk + +#define GPTIM_SMCR_ETF_Pos (8U) +#define GPTIM_SMCR_ETF_Msk (0xfU << GPTIM_SMCR_ETF_Pos) +#define GPTIM_SMCR_ETF GPTIM_SMCR_ETF_Msk + +#define GPTIM_SMCR_MSM_Pos (7U) +#define GPTIM_SMCR_MSM_Msk (0x1U << GPTIM_SMCR_MSM_Pos) +#define GPTIM_SMCR_MSM GPTIM_SMCR_MSM_Msk + +#define GPTIM_SMCR_TS_Pos (4U) +#define GPTIM_SMCR_TS_Msk (0x7U << GPTIM_SMCR_TS_Pos) +#define GPTIM_SMCR_TS GPTIM_SMCR_TS_Msk + +#define GPTIM_SMCR_SMS_Pos (0U) +#define GPTIM_SMCR_SMS_Msk (0x7U << GPTIM_SMCR_SMS_Pos) +#define GPTIM_SMCR_SMS GPTIM_SMCR_SMS_Msk + +#define GPTIM_DIER_CC1BURSTEN_Pos (16U) +#define GPTIM_DIER_CC1BURSTEN_Msk (0x1U << GPTIM_DIER_CC1BURSTEN_Pos) +#define GPTIM_DIER_CC1BURSTEN GPTIM_DIER_CC1BURSTEN_Msk + +#define GPTIM_DIER_CC2BURSTEN_Pos (17U) +#define GPTIM_DIER_CC2BURSTEN_Msk (0x1U << GPTIM_DIER_CC2BURSTEN_Pos) +#define GPTIM_DIER_CC2BURSTEN GPTIM_DIER_CC2BURSTEN_Msk + +#define GPTIM_DIER_CC3BURSTEN_Pos (18U) +#define GPTIM_DIER_CC3BURSTEN_Msk (0x1U << GPTIM_DIER_CC3BURSTEN_Pos) +#define GPTIM_DIER_CC3BURSTEN GPTIM_DIER_CC3BURSTEN_Msk + +#define GPTIM_DIER_CC4BURSTEN_Pos (19U) +#define GPTIM_DIER_CC4BURSTEN_Msk (0x1U << GPTIM_DIER_CC4BURSTEN_Pos) +#define GPTIM_DIER_CC4BURSTEN GPTIM_DIER_CC4BURSTEN_Msk + +#define GPTIM_DIER_TDE_Pos (14U) +#define GPTIM_DIER_TDE_Msk (0x1U << GPTIM_DIER_TDE_Pos) +#define GPTIM_DIER_TDE GPTIM_DIER_TDE_Msk + +#define GPTIM_DIER_CCDE_Pos (9U) +#define GPTIM_DIER_CCDE_Msk (0xfU << GPTIM_DIER_CCDE_Pos) +#define GPTIM_DIER_CCDE GPTIM_DIER_CCDE_Msk + +#define GPTIM_DIER_UDE_Pos (8U) +#define GPTIM_DIER_UDE_Msk (0x1U << GPTIM_DIER_UDE_Pos) +#define GPTIM_DIER_UDE GPTIM_DIER_UDE_Msk + +#define GPTIM_DIER_TIE_Pos (6U) +#define GPTIM_DIER_TIE_Msk (0x1U << GPTIM_DIER_TIE_Pos) +#define GPTIM_DIER_TIE GPTIM_DIER_TIE_Msk + +#define GPTIM_DIER_CCIE_Pos (1U) +#define GPTIM_DIER_CCIE_Msk (0xfU << GPTIM_DIER_CCIE_Pos) +#define GPTIM_DIER_CCIE GPTIM_DIER_CCIE_Msk + +#define GPTIM_DIER_UIE_Pos (0U) +#define GPTIM_DIER_UIE_Msk (0x1U << GPTIM_DIER_UIE_Pos) +#define GPTIM_DIER_UIE GPTIM_DIER_UIE_Msk + +#define GPTIM_ISR_CCOF_Pos (9U) +#define GPTIM_ISR_CCOF_Msk (0xfU << GPTIM_ISR_CCOF_Pos) +#define GPTIM_ISR_CCOF GPTIM_ISR_CCOF_Msk + +#define GPTIM_ISR_TIF_Pos (6U) +#define GPTIM_ISR_TIF_Msk (0x1U << GPTIM_ISR_TIF_Pos) +#define GPTIM_ISR_TIF GPTIM_ISR_TIF_Msk + +#define GPTIM_ISR_CCIF_Pos (1U) +#define GPTIM_ISR_CCIF_Msk (0xfU << GPTIM_ISR_CCIF_Pos) +#define GPTIM_ISR_CCIF GPTIM_ISR_CCIF_Msk + +#define GPTIM_ISR_UIF_Pos (0U) +#define GPTIM_ISR_UIF_Msk (0x1U << GPTIM_ISR_UIF_Pos) +#define GPTIM_ISR_UIF GPTIM_ISR_UIF_Msk + +#define GPTIM_EGR_TG_Pos (6U) +#define GPTIM_EGR_TG_Msk (0x1U << GPTIM_EGR_TG_Pos) +#define GPTIM_EGR_TG GPTIM_EGR_TG_Msk + +#define GPTIM_EGR_CCG_Pos (1U) +#define GPTIM_EGR_CCG_Msk (0x3U << GPTIM_EGR_CCG_Pos) +#define GPTIM_EGR_CCG GPTIM_EGR_CCG_Msk + +#define GPTIM_EGR_UG_Pos (0U) +#define GPTIM_EGR_UG_Msk (0x1U << GPTIM_EGR_UG_Pos) +#define GPTIM_EGR_UG GPTIM_EGR_UG_Msk + +#define GPTIM_DCR_DBL_Pos (8U) +#define GPTIM_DCR_DBL_Msk (0x1fU << GPTIM_DCR_DBL_Pos) +#define GPTIM_DCR_DBL GPTIM_DCR_DBL_Msk + +#define GPTIM_DCR_DBA_Pos (0U) +#define GPTIM_DCR_DBA_Msk (0x1fU << GPTIM_DCR_DBA_Pos) +#define GPTIM_DCR_DBA GPTIM_DCR_DBA_Msk + +#define GPTIM_ITRSEL_Pos (0U) +#define GPTIM_ITRSEL_Msk (0x3U << GPTIM_ITRSEL_Pos) +#define GPTIM_ITRSEL GPTIM_ITRSEL_Msk + +#define GPTIM_CCMR_OCCE_Pos (7U) +#define GPTIM_CCMR_OCCE_Msk (0x1U << GPTIM_CCMR_OCCE_Pos) +#define GPTIM_CCMR_OCCE GPTIM_CCMR_OCCE_Msk + +#define GPTIM_CCMR_OCM_Pos (4U) +#define GPTIM_CCMR_OCM_Msk (0x7U << GPTIM_CCMR_OCM_Pos) +#define GPTIM_CCMR_OCM GPTIM_CCMR_OCM_Msk + +#define GPTIM_CCMR_OCPE_Pos (3U) +#define GPTIM_CCMR_OCPE_Msk (0x1U << GPTIM_CCMR_OCPE_Pos) +#define GPTIM_CCMR_OCPE GPTIM_CCMR_OCPE_Msk + +#define GPTIM_CCMR_OCFE_Pos (2U) +#define GPTIM_CCMR_OCFE_Msk (0x1U << GPTIM_CCMR_OCFE_Pos) +#define GPTIM_CCMR_OCFE GPTIM_CCMR_OCFE_Msk + +#define GPTIM_CCMR_ICF_Pos (4U) +#define GPTIM_CCMR_ICF_Msk (0xfU << GPTIM_CCMR_ICF_Pos) +#define GPTIM_CCMR_ICF GPTIM_CCMR_ICF_Msk + +#define GPTIM_CCMR_ICPSC_Pos (2U) +#define GPTIM_CCMR_ICPSC_Msk (0x3U << GPTIM_CCMR_ICPSC_Pos) +#define GPTIM_CCMR_ICPSC GPTIM_CCMR_ICPSC_Msk + +#define GPTIM_CCMR_CCS_Pos (0U) +#define GPTIM_CCMR_CCS_Msk (0x3U << GPTIM_CCMR_CCS_Pos) +#define GPTIM_CCMR_CCS GPTIM_CCMR_CCS_Msk + +#define GPTIM_CCER_CCOP_Pos (1U) +#define GPTIM_CCER_CCOP_Msk (0x1U << GPTIM_CCER_CCOP_Pos) +#define GPTIM_CCER_CCOP GPTIM_CCER_CCOP_Msk + +#define GPTIM_CCER_CCIP_Pos (1U) +#define GPTIM_CCER_CCIP_Msk (0x1U << GPTIM_CCER_CCIP_Pos) +#define GPTIM_CCER_CCIP GPTIM_CCER_CCIP_Msk + +#define GPTIM_CCER_CCE_Pos (0U) +#define GPTIM_CCER_CCE_Msk (0x1U << GPTIM_CCER_CCE_Pos) +#define GPTIM_CCER_CCE GPTIM_CCER_CCE_Msk + + + +#define FL_GPTIM_CHANNEL_1 (0x1U << 0U) +#define FL_GPTIM_CHANNEL_2 (0x1U << 1U) +#define FL_GPTIM_CHANNEL_3 (0x1U << 2U) +#define FL_GPTIM_CHANNEL_4 (0x1U << 3U) +#define FL_GPTIM_ITR0 (0x1U << 0U) +#define FL_GPTIM_ITR1 (0x1U << 1U) +#define FL_GPTIM_ITR2 (0x1U << 2U) +#define FL_GPTIM_ITR3 (0x1U << 3U) + + + +#define FL_GPTIM_CLK_DIVISION_DIV1 (0x0U << GPTIM_CR1_CKD_Pos) +#define FL_GPTIM_CLK_DIVISION_DIV2 (0x1U << GPTIM_CR1_CKD_Pos) +#define FL_GPTIM_CLK_DIVISION_DIV4 (0x2U << GPTIM_CR1_CKD_Pos) + + +#define FL_GPTIM_COUNTER_ALIGNED_EDGE (0x0U << GPTIM_CR1_CMS_Pos) +#define FL_GPTIM_COUNTER_ALIGNED_CENTER_DOWN (0x1U << GPTIM_CR1_CMS_Pos) +#define FL_GPTIM_COUNTER_ALIGNED_CENTER_UP (0x2U << GPTIM_CR1_CMS_Pos) +#define FL_GPTIM_COUNTER_ALIGNED_CENTER_UP_DOWN (0x3U << GPTIM_CR1_CMS_Pos) + + +#define FL_GPTIM_COUNTER_DIR_UP (0x0U << GPTIM_CR1_DIR_Pos) +#define FL_GPTIM_COUNTER_DIR_DOWN (0x1U << GPTIM_CR1_DIR_Pos) + + +#define FL_GPTIM_ONE_PULSE_MODE_CONTINUOUS (0x0U << GPTIM_CR1_OPM_Pos) +#define FL_GPTIM_ONE_PULSE_MODE_SINGLE (0x1U << GPTIM_CR1_OPM_Pos) + + +#define FL_GPTIM_UPDATE_SOURCE_REGULAR (0x0U << GPTIM_CR1_URS_Pos) +#define FL_GPTIM_UPDATE_SOURCE_COUNTER (0x1U << GPTIM_CR1_URS_Pos) + + +#define FL_GPTIM_TRGO_RESET (0x0U << GPTIM_CR2_MMS_Pos) +#define FL_GPTIM_TRGO_ENABLE (0x1U << GPTIM_CR2_MMS_Pos) +#define FL_GPTIM_TRGO_UPDATE (0x2U << GPTIM_CR2_MMS_Pos) +#define FL_GPTIM_TRGO_CC1IF (0x3U << GPTIM_CR2_MMS_Pos) +#define FL_GPTIM_TRGO_OC1REF (0x4U << GPTIM_CR2_MMS_Pos) +#define FL_GPTIM_TRGO_OC2REF (0x5U << GPTIM_CR2_MMS_Pos) +#define FL_GPTIM_TRGO_OC3REF (0x6U << GPTIM_CR2_MMS_Pos) +#define FL_GPTIM_TRGO_OC4REF (0x7U << GPTIM_CR2_MMS_Pos) + + +#define FL_GPTIM_DMA_REQ_CC (0x0U << GPTIM_CR2_CCDS_Pos) +#define FL_GPTIM_DMA_REQ_UPDATE (0x1U << GPTIM_CR2_CCDS_Pos) + + +#define FL_GPTIM_ETR_POLARITY_NORMAL (0x0U << GPTIM_SMCR_ETP_Pos) +#define FL_GPTIM_ETR_POLARITY_INVERT (0x1U << GPTIM_SMCR_ETP_Pos) + + +#define FL_GPTIM_ETR_PSC_DIV1 (0x0U << GPTIM_SMCR_ETPS_Pos) +#define FL_GPTIM_ETR_PSC_DIV2 (0x1U << GPTIM_SMCR_ETPS_Pos) +#define FL_GPTIM_ETR_PSC_DIV4 (0x2U << GPTIM_SMCR_ETPS_Pos) +#define FL_GPTIM_ETR_PSC_DIV8 (0x3U << GPTIM_SMCR_ETPS_Pos) + + +#define FL_GPTIM_ETR_FILTER_DIV1 (0x0U << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV1_N2 (0x1U << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV1_N4 (0x2U << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV1_N8 (0x3U << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV2_N6 (0x4U << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV2_N8 (0x5U << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV4_N6 (0x6U << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV4_N8 (0x7U << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV8_N6 (0x8U << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV8_N8 (0x9U << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV16_N5 (0xaU << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV16_N6 (0xbU << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV16_N8 (0xcU << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV32_N5 (0xdU << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV32_N6 (0xeU << GPTIM_SMCR_ETF_Pos) +#define FL_GPTIM_ETR_FILTER_DIV32_N8 (0xfU << GPTIM_SMCR_ETF_Pos) + + +#define FL_GPTIM_TIM_TS_ITR0 (0x0U << GPTIM_SMCR_TS_Pos) +#define FL_GPTIM_TIM_TS_ITR1 (0x1U << GPTIM_SMCR_TS_Pos) +#define FL_GPTIM_TIM_TS_ITR2 (0x2U << GPTIM_SMCR_TS_Pos) +#define FL_GPTIM_TIM_TS_ITR3 (0x3U << GPTIM_SMCR_TS_Pos) +#define FL_GPTIM_TIM_TS_TI1F_ED (0x4U << GPTIM_SMCR_TS_Pos) +#define FL_GPTIM_TIM_TS_TI1FP1 (0x5U << GPTIM_SMCR_TS_Pos) +#define FL_GPTIM_TIM_TS_TI2FP2 (0x6U << GPTIM_SMCR_TS_Pos) +#define FL_GPTIM_TIM_TS_ETRF (0x7U << GPTIM_SMCR_TS_Pos) + + +#define FL_GPTIM_SLAVE_MODE_PROHIBITED (0x0U << GPTIM_SMCR_SMS_Pos) +#define FL_GPTIM_SLAVE_MODE_ENCODER_X2_TI1 (0x1U << GPTIM_SMCR_SMS_Pos) +#define FL_GPTIM_SLAVE_MODE_ENCODER_X2_TI2 (0x2U << GPTIM_SMCR_SMS_Pos) +#define FL_GPTIM_SLAVE_MODE_ENCODER_X4_TI1TI2 (0x3U << GPTIM_SMCR_SMS_Pos) +#define FL_GPTIM_SLAVE_MODE_TRGI_RISE_RST (0x4U << GPTIM_SMCR_SMS_Pos) +#define FL_GPTIM_SLAVE_MODE_TRGI_HIGH_RUN (0x5U << GPTIM_SMCR_SMS_Pos) +#define FL_GPTIM_SLAVE_MODE_TRGI_RISE_RUN (0x6U << GPTIM_SMCR_SMS_Pos) +#define FL_GPTIM_SLAVE_MODE_TRGI_CLK (0x7U << GPTIM_SMCR_SMS_Pos) + + +#define FL_GPTIM_DMA_BURST_LENGTH_1 (0x0U << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_2 (0x1U << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_3 (0x2U << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_4 (0x3U << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_5 (0x4U << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_6 (0x5U << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_7 (0x6U << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_8 (0x7U << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_9 (0x8U << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_10 (0x9U << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_11 (0xaU << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_12 (0xbU << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_13 (0xcU << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_14 (0xdU << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_15 (0xeU << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_16 (0xfU << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_17 (0x10U << GPTIM_DCR_DBL_Pos) +#define FL_GPTIM_DMA_BURST_LENGTH_18 (0x11U << GPTIM_DCR_DBL_Pos) + + +#define FL_GPTIM_DMA_BURST_ADDR_CR1 (0x0U << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_CR2 (0x1U << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_SMCR (0x2U << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_DIER (0x3U << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_SR (0x4U << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_EGR (0x5U << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_CCMR1 (0x6U << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_CCMR2 (0x7U << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_CCER (0x8U << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_CNT (0x9U << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_PSC (0xaU << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_ARR (0xbU << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_RCR (0xcU << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_CCR1 (0xdU << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_CCR2 (0xeU << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_CCR3 (0xfU << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_CCR4 (0x10U << GPTIM_DCR_DBA_Pos) +#define FL_GPTIM_DMA_BURST_ADDR_BDTR (0x11U << GPTIM_DCR_DBA_Pos) + + +#define FL_GPTIM_ITRSEL_GROUP0 (0x0U << GPTIM_ITRSEL_Pos) +#define FL_GPTIM_ITRSEL_GROUP1 (0x1U << GPTIM_ITRSEL_Pos) +#define FL_GPTIM_ITRSEL_GROUP2 (0x2U << GPTIM_ITRSEL_Pos) +#define FL_GPTIM_ITRSEL_GROUP3 (0x3U << GPTIM_ITRSEL_Pos) + + +#define FL_GPTIM_OC_MODE_FROZEN (0x0U << GPTIM_CCMR_OCM_Pos) +#define FL_GPTIM_OC_MODE_ACTIVE (0x1U << GPTIM_CCMR_OCM_Pos) +#define FL_GPTIM_OC_MODE_INACTIVE (0x2U << GPTIM_CCMR_OCM_Pos) +#define FL_GPTIM_OC_MODE_TOGGLE (0x3U << GPTIM_CCMR_OCM_Pos) +#define FL_GPTIM_OC_MODE_FORCED_INACTIVE (0x4U << GPTIM_CCMR_OCM_Pos) +#define FL_GPTIM_OC_MODE_FORCED_ACTIVE (0x5U << GPTIM_CCMR_OCM_Pos) +#define FL_GPTIM_OC_MODE_PWM1 (0x6U << GPTIM_CCMR_OCM_Pos) +#define FL_GPTIM_OC_MODE_PWM2 (0x7U << GPTIM_CCMR_OCM_Pos) + + +#define FL_GPTIM_IC_FILTER_DIV1 (0x0U << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV1_N2 (0x1U << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV1_N4 (0x2U << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV1_N8 (0x3U << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV2_N6 (0x4U << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV2_N8 (0x5U << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV4_N6 (0x6U << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV4_N8 (0x7U << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV8_N6 (0x8U << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV8_N8 (0x9U << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV16_N5 (0xaU << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV16_N6 (0xbU << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV16_N8 (0xcU << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV32_N5 (0xdU << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV32_N6 (0xeU << GPTIM_CCMR_ICF_Pos) +#define FL_GPTIM_IC_FILTER_DIV32_N8 (0xfU << GPTIM_CCMR_ICF_Pos) + + +#define FL_GPTIM_IC_PSC_DIV1 (0x0U << GPTIM_CCMR_ICPSC_Pos) +#define FL_GPTIM_IC_PSC_DIV2 (0x1U << GPTIM_CCMR_ICPSC_Pos) +#define FL_GPTIM_IC_PSC_DIV4 (0x2U << GPTIM_CCMR_ICPSC_Pos) +#define FL_GPTIM_IC_PSC_DIV8 (0x3U << GPTIM_CCMR_ICPSC_Pos) + + +#define FL_GPTIM_CHANNEL_MODE_OUTPUT (0x0U << GPTIM_CCMR_CCS_Pos) +#define FL_GPTIM_CHANNEL_MODE_INPUT_NORMAL (0x1U << GPTIM_CCMR_CCS_Pos) +#define FL_GPTIM_CHANNEL_MODE_INPUT_CROSSOVER (0x2U << GPTIM_CCMR_CCS_Pos) +#define FL_GPTIM_CHANNEL_MODE_INPUT_TRC (0x3U << GPTIM_CCMR_CCS_Pos) + + +#define FL_GPTIM_OC_POLARITY_NORMAL (0x0U << GPTIM_CCER_CCOP_Pos) +#define FL_GPTIM_OC_POLARITY_INVERT (0x1U << GPTIM_CCER_CCOP_Pos) + + +#define FL_GPTIM_IC_POLARITY_NORMAL (0x0U << GPTIM_CCER_CCIP_Pos) +#define FL_GPTIM_IC_POLARITY_INVERT (0x1U << GPTIM_CCER_CCIP_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup GPTIM_FL_Exported_Functions GPTIM Exported Functions + * @{ + */ + +/** + * @brief + * @rmtoll CR1 CKD FL_GPTIM_SetClockDivision + * @param TIMx TIM instance + * @param div This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CLK_DIVISION_DIV1 + * @arg @ref FL_GPTIM_CLK_DIVISION_DIV2 + * @arg @ref FL_GPTIM_CLK_DIVISION_DIV4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetClockDivision(GPTIM_Type *TIMx, uint32_t div) +{ + MODIFY_REG(TIMx->CR1, GPTIM_CR1_CKD_Msk, div); +} + +/** + * @brief + * @rmtoll CR1 CKD FL_GPTIM_GetClockDivision + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_CLK_DIVISION_DIV1 + * @arg @ref FL_GPTIM_CLK_DIVISION_DIV2 + * @arg @ref FL_GPTIM_CLK_DIVISION_DIV4 + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetClockDivision(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, GPTIM_CR1_CKD_Msk)); +} + +/** + * @brief + * @rmtoll CR1 ARPE FL_GPTIM_EnableARRPreload + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableARRPreload(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->CR1, GPTIM_CR1_ARPE_Msk); +} + +/** + * @brief + * @rmtoll CR1 ARPE FL_GPTIM_IsEnabledARRPreload + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledARRPreload(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, GPTIM_CR1_ARPE_Msk) == GPTIM_CR1_ARPE_Msk); +} + +/** + * @brief + * @rmtoll CR1 ARPE FL_GPTIM_DisableARRPreload + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableARRPreload(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->CR1, GPTIM_CR1_ARPE_Msk); +} + +/** + * @brief + * @rmtoll CR1 CMS FL_GPTIM_SetCounterAlignedMode + * @param TIMx TIM instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_GPTIM_COUNTER_ALIGNED_EDGE + * @arg @ref FL_GPTIM_COUNTER_ALIGNED_CENTER_DOWN + * @arg @ref FL_GPTIM_COUNTER_ALIGNED_CENTER_UP + * @arg @ref FL_GPTIM_COUNTER_ALIGNED_CENTER_UP_DOWN + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetCounterAlignedMode(GPTIM_Type *TIMx, uint32_t mode) +{ + MODIFY_REG(TIMx->CR1, GPTIM_CR1_CMS_Msk, mode); +} + +/** + * @brief + * @rmtoll CR1 CMS FL_GPTIM_GetCounterAlignedMode + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_COUNTER_ALIGNED_EDGE + * @arg @ref FL_GPTIM_COUNTER_ALIGNED_CENTER_DOWN + * @arg @ref FL_GPTIM_COUNTER_ALIGNED_CENTER_UP + * @arg @ref FL_GPTIM_COUNTER_ALIGNED_CENTER_UP_DOWN + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetCounterAlignedMode(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, GPTIM_CR1_CMS_Msk)); +} + +/** + * @brief + * @rmtoll CR1 DIR FL_GPTIM_SetCounterDirection + * @param TIMx TIM instance + * @param dir This parameter can be one of the following values: + * @arg @ref FL_GPTIM_COUNTER_DIR_UP + * @arg @ref FL_GPTIM_COUNTER_DIR_DOWN + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetCounterDirection(GPTIM_Type *TIMx, uint32_t dir) +{ + MODIFY_REG(TIMx->CR1, GPTIM_CR1_DIR_Msk, dir); +} + +/** + * @brief + * @rmtoll CR1 DIR FL_GPTIM_GetCounterDirection + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_COUNTER_DIR_UP + * @arg @ref FL_GPTIM_COUNTER_DIR_DOWN + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetCounterDirection(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, GPTIM_CR1_DIR_Msk)); +} + +/** + * @brief + * @rmtoll CR1 OPM FL_GPTIM_SetOnePulseMode + * @param TIMx TIM instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_GPTIM_ONE_PULSE_MODE_CONTINUOUS + * @arg @ref FL_GPTIM_ONE_PULSE_MODE_SINGLE + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetOnePulseMode(GPTIM_Type *TIMx, uint32_t mode) +{ + MODIFY_REG(TIMx->CR1, GPTIM_CR1_OPM_Msk, mode); +} + +/** + * @brief + * @rmtoll CR1 OPM FL_GPTIM_GetOnePulseMode + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_ONE_PULSE_MODE_CONTINUOUS + * @arg @ref FL_GPTIM_ONE_PULSE_MODE_SINGLE + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetOnePulseMode(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, GPTIM_CR1_OPM_Msk)); +} + +/** + * @brief + * @rmtoll CR1 URS FL_GPTIM_SetUpdateSource + * @param TIMx TIM instance + * @param source This parameter can be one of the following values: + * @arg @ref FL_GPTIM_UPDATE_SOURCE_REGULAR + * @arg @ref FL_GPTIM_UPDATE_SOURCE_COUNTER + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetUpdateSource(GPTIM_Type *TIMx, uint32_t source) +{ + MODIFY_REG(TIMx->CR1, GPTIM_CR1_URS_Msk, source); +} + +/** + * @brief + * @rmtoll CR1 URS FL_GPTIM_GetUpdateSource + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_UPDATE_SOURCE_REGULAR + * @arg @ref FL_GPTIM_UPDATE_SOURCE_COUNTER + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetUpdateSource(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, GPTIM_CR1_URS_Msk)); +} + +/** + * @brief + * @rmtoll CR1 UDIS FL_GPTIM_EnableUpdateEvent + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableUpdateEvent(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->CR1, GPTIM_CR1_UDIS_Msk); +} + +/** + * @brief + * @rmtoll CR1 UDIS FL_GPTIM_IsEnabledUpdateEvent + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledUpdateEvent(GPTIM_Type *TIMx) +{ + return (uint32_t)!(READ_BIT(TIMx->CR1, GPTIM_CR1_UDIS_Msk) == GPTIM_CR1_UDIS_Msk); +} + +/** + * @brief + * @rmtoll CR1 UDIS FL_GPTIM_DisableUpdateEvent + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableUpdateEvent(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->CR1, GPTIM_CR1_UDIS_Msk); +} + +/** + * @brief + * @rmtoll CR1 CEN FL_GPTIM_Enable + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_Enable(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->CR1, GPTIM_CR1_CEN_Msk); +} + +/** + * @brief + * @rmtoll CR1 CEN FL_GPTIM_IsEnabled + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabled(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR1, GPTIM_CR1_CEN_Msk) == GPTIM_CR1_CEN_Msk); +} + +/** + * @brief + * @rmtoll CR1 CEN FL_GPTIM_Disable + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_Disable(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->CR1, GPTIM_CR1_CEN_Msk); +} + +/** + * @brief + * @rmtoll CR2 TI1S FL_GPTIM_IC_EnableXORCombination + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_IC_EnableXORCombination(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->CR2, GPTIM_CR2_TI1S_Msk); +} + +/** + * @brief + * @rmtoll CR2 TI1S FL_GPTIM_IC_IsEnabledXORCombination + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IC_IsEnabledXORCombination(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR2, GPTIM_CR2_TI1S_Msk) == GPTIM_CR2_TI1S_Msk); +} + +/** + * @brief + * @rmtoll CR2 TI1S FL_GPTIM_IC_DisableXORCombination + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_IC_DisableXORCombination(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->CR2, GPTIM_CR2_TI1S_Msk); +} + +/** + * @brief + * @rmtoll CR2 MMS FL_GPTIM_SetTriggerOutput + * @param TIMx TIM instance + * @param triggerOutput This parameter can be one of the following values: + * @arg @ref FL_GPTIM_TRGO_RESET + * @arg @ref FL_GPTIM_TRGO_ENABLE + * @arg @ref FL_GPTIM_TRGO_UPDATE + * @arg @ref FL_GPTIM_TRGO_CC1IF + * @arg @ref FL_GPTIM_TRGO_OC1REF + * @arg @ref FL_GPTIM_TRGO_OC2REF + * @arg @ref FL_GPTIM_TRGO_OC3REF + * @arg @ref FL_GPTIM_TRGO_OC4REF + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetTriggerOutput(GPTIM_Type *TIMx, uint32_t triggerOutput) +{ + MODIFY_REG(TIMx->CR2, GPTIM_CR2_MMS_Msk, triggerOutput); +} + +/** + * @brief + * @rmtoll CR2 MMS FL_GPTIM_GetTriggerOutput + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_TRGO_RESET + * @arg @ref FL_GPTIM_TRGO_ENABLE + * @arg @ref FL_GPTIM_TRGO_UPDATE + * @arg @ref FL_GPTIM_TRGO_CC1IF + * @arg @ref FL_GPTIM_TRGO_OC1REF + * @arg @ref FL_GPTIM_TRGO_OC2REF + * @arg @ref FL_GPTIM_TRGO_OC3REF + * @arg @ref FL_GPTIM_TRGO_OC4REF + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetTriggerOutput(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR2, GPTIM_CR2_MMS_Msk)); +} + +/** + * @brief + * @rmtoll CR2 CCDS FL_GPTIM_CC_SetDMAReqTrigger + * @param TIMx TIM instance + * @param trigger This parameter can be one of the following values: + * @arg @ref FL_GPTIM_DMA_REQ_CC + * @arg @ref FL_GPTIM_DMA_REQ_UPDATE + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_CC_SetDMAReqTrigger(GPTIM_Type *TIMx, uint32_t trigger) +{ + MODIFY_REG(TIMx->CR2, GPTIM_CR2_CCDS_Msk, trigger); +} + +/** + * @brief + * @rmtoll CR2 CCDS FL_GPTIM_CC_GetDMAReqTrigger + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_DMA_REQ_CC + * @arg @ref FL_GPTIM_DMA_REQ_UPDATE + */ +__STATIC_INLINE uint32_t FL_GPTIM_CC_GetDMAReqTrigger(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CR2, GPTIM_CR2_CCDS_Msk)); +} + +/** + * @brief + * @rmtoll SMCR ETP FL_GPTIM_SetETRPolarity + * @param TIMx TIM instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_GPTIM_ETR_POLARITY_NORMAL + * @arg @ref FL_GPTIM_ETR_POLARITY_INVERT + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetETRPolarity(GPTIM_Type *TIMx, uint32_t polarity) +{ + MODIFY_REG(TIMx->SMCR, GPTIM_SMCR_ETP_Msk, polarity); +} + +/** + * @brief + * @rmtoll SMCR ETP FL_GPTIM_GetETRPolarity + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_ETR_POLARITY_NORMAL + * @arg @ref FL_GPTIM_ETR_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetETRPolarity(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, GPTIM_SMCR_ETP_Msk)); +} + +/** + * @brief + * @rmtoll SMCR ECE FL_GPTIM_EnableExternalClock + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableExternalClock(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->SMCR, GPTIM_SMCR_ECE_Msk); +} + +/** + * @brief + * @rmtoll SMCR ECE FL_GPTIM_IsEnabledExternalClock + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledExternalClock(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, GPTIM_SMCR_ECE_Msk) == GPTIM_SMCR_ECE_Msk); +} + +/** + * @brief + * @rmtoll SMCR ECE FL_GPTIM_DisableExternalClock + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableExternalClock(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->SMCR, GPTIM_SMCR_ECE_Msk); +} + +/** + * @brief + * @rmtoll SMCR ETPS FL_GPTIM_SetETRPrescaler + * @param TIMx TIM instance + * @param psc This parameter can be one of the following values: + * @arg @ref FL_GPTIM_ETR_PSC_DIV1 + * @arg @ref FL_GPTIM_ETR_PSC_DIV2 + * @arg @ref FL_GPTIM_ETR_PSC_DIV4 + * @arg @ref FL_GPTIM_ETR_PSC_DIV8 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetETRPrescaler(GPTIM_Type *TIMx, uint32_t psc) +{ + MODIFY_REG(TIMx->SMCR, GPTIM_SMCR_ETPS_Msk, psc); +} + +/** + * @brief + * @rmtoll SMCR ETPS FL_GPTIM_GetETRPrescaler + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_ETR_PSC_DIV1 + * @arg @ref FL_GPTIM_ETR_PSC_DIV2 + * @arg @ref FL_GPTIM_ETR_PSC_DIV4 + * @arg @ref FL_GPTIM_ETR_PSC_DIV8 + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetETRPrescaler(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, GPTIM_SMCR_ETPS_Msk)); +} + +/** + * @brief + * @rmtoll SMCR ETF FL_GPTIM_SetETRFilter + * @param TIMx TIM instance + * @param filter This parameter can be one of the following values: + * @arg @ref FL_GPTIM_ETR_FILTER_DIV1 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV1_N2 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV1_N4 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV1_N8 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV2_N6 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV2_N8 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV4_N6 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV4_N8 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV8_N6 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV8_N8 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV16_N5 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV16_N6 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV16_N8 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV32_N5 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV32_N6 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV32_N8 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetETRFilter(GPTIM_Type *TIMx, uint32_t filter) +{ + MODIFY_REG(TIMx->SMCR, GPTIM_SMCR_ETF_Msk, filter); +} + +/** + * @brief + * @rmtoll SMCR ETF FL_GPTIM_GetETRFilter + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_ETR_FILTER_DIV1 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV1_N2 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV1_N4 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV1_N8 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV2_N6 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV2_N8 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV4_N6 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV4_N8 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV8_N6 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV8_N8 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV16_N5 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV16_N6 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV16_N8 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV32_N5 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV32_N6 + * @arg @ref FL_GPTIM_ETR_FILTER_DIV32_N8 + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetETRFilter(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, GPTIM_SMCR_ETF_Msk)); +} + +/** + * @brief + * @rmtoll SMCR MSM FL_GPTIM_EnableMasterSlaveMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableMasterSlaveMode(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->SMCR, GPTIM_SMCR_MSM_Msk); +} + +/** + * @brief + * @rmtoll SMCR MSM FL_GPTIM_IsEnabledMasterSlaveMode + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledMasterSlaveMode(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, GPTIM_SMCR_MSM_Msk) == GPTIM_SMCR_MSM_Msk); +} + +/** + * @brief + * @rmtoll SMCR MSM FL_GPTIM_DisableMasterSlaveMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableMasterSlaveMode(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->SMCR, GPTIM_SMCR_MSM_Msk); +} + +/** + * @brief + * @rmtoll SMCR TS FL_GPTIM_SetTriggerInput + * @param TIMx TIM instance + * @param triggerInput This parameter can be one of the following values: + * @arg @ref FL_GPTIM_TIM_TS_ITR0 + * @arg @ref FL_GPTIM_TIM_TS_ITR1 + * @arg @ref FL_GPTIM_TIM_TS_ITR2 + * @arg @ref FL_GPTIM_TIM_TS_ITR3 + * @arg @ref FL_GPTIM_TIM_TS_TI1F_ED + * @arg @ref FL_GPTIM_TIM_TS_TI1FP1 + * @arg @ref FL_GPTIM_TIM_TS_TI2FP2 + * @arg @ref FL_GPTIM_TIM_TS_ETRF + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetTriggerInput(GPTIM_Type *TIMx, uint32_t triggerInput) +{ + MODIFY_REG(TIMx->SMCR, GPTIM_SMCR_TS_Msk, triggerInput); +} + +/** + * @brief + * @rmtoll SMCR TS FL_GPTIM_GetTriggerInput + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_TIM_TS_ITR0 + * @arg @ref FL_GPTIM_TIM_TS_ITR1 + * @arg @ref FL_GPTIM_TIM_TS_ITR2 + * @arg @ref FL_GPTIM_TIM_TS_ITR3 + * @arg @ref FL_GPTIM_TIM_TS_TI1F_ED + * @arg @ref FL_GPTIM_TIM_TS_TI1FP1 + * @arg @ref FL_GPTIM_TIM_TS_TI2FP2 + * @arg @ref FL_GPTIM_TIM_TS_ETRF + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetTriggerInput(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, GPTIM_SMCR_TS_Msk)); +} + +/** + * @brief + * @rmtoll SMCR SMS FL_GPTIM_SetSlaveMode + * @param TIMx TIM instance + * @param encoderMode This parameter can be one of the following values: + * @arg @ref FL_GPTIM_SLAVE_MODE_PROHIBITED + * @arg @ref FL_GPTIM_SLAVE_MODE_ENCODER_X2_TI1 + * @arg @ref FL_GPTIM_SLAVE_MODE_ENCODER_X2_TI2 + * @arg @ref FL_GPTIM_SLAVE_MODE_ENCODER_X4_TI1TI2 + * @arg @ref FL_GPTIM_SLAVE_MODE_TRGI_RISE_RST + * @arg @ref FL_GPTIM_SLAVE_MODE_TRGI_HIGH_RUN + * @arg @ref FL_GPTIM_SLAVE_MODE_TRGI_RISE_RUN + * @arg @ref FL_GPTIM_SLAVE_MODE_TRGI_CLK + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetSlaveMode(GPTIM_Type *TIMx, uint32_t encoderMode) +{ + MODIFY_REG(TIMx->SMCR, GPTIM_SMCR_SMS_Msk, encoderMode); +} + +/** + * @brief + * @rmtoll SMCR SMS FL_GPTIM_GetSlaveMode + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_SLAVE_MODE_PROHIBITED + * @arg @ref FL_GPTIM_SLAVE_MODE_ENCODER_X2_TI1 + * @arg @ref FL_GPTIM_SLAVE_MODE_ENCODER_X2_TI2 + * @arg @ref FL_GPTIM_SLAVE_MODE_ENCODER_X4_TI1TI2 + * @arg @ref FL_GPTIM_SLAVE_MODE_TRGI_RISE_RST + * @arg @ref FL_GPTIM_SLAVE_MODE_TRGI_HIGH_RUN + * @arg @ref FL_GPTIM_SLAVE_MODE_TRGI_RISE_RUN + * @arg @ref FL_GPTIM_SLAVE_MODE_TRGI_CLK + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetSlaveMode(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->SMCR, GPTIM_SMCR_SMS_Msk)); +} + +/** + * @brief + * @rmtoll DIER CC1BURSTEN FL_GPTIM_EnableCC1DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableCC1DMABurstMode(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, GPTIM_DIER_CC1BURSTEN_Msk); +} + +/** + * @brief + * @rmtoll DIER CC1BURSTEN FL_GPTIM_IsEnabledCC1DMABurstMode + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledCC1DMABurstMode(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, GPTIM_DIER_CC1BURSTEN_Msk) == GPTIM_DIER_CC1BURSTEN_Msk); +} + +/** + * @brief + * @rmtoll DIER CC1BURSTEN FL_GPTIM_DisableCC1DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableCC1DMABurstMode(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, GPTIM_DIER_CC1BURSTEN_Msk); +} + +/** + * @brief + * @rmtoll DIER CC2BURSTEN FL_GPTIM_EnableCC2DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableCC2DMABurstMode(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, GPTIM_DIER_CC2BURSTEN_Msk); +} + +/** + * @brief + * @rmtoll DIER CC2BURSTEN FL_GPTIM_IsEnabledCC2DMABurstMode + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledCC2DMABurstMode(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, GPTIM_DIER_CC2BURSTEN_Msk) == GPTIM_DIER_CC2BURSTEN_Msk); +} + +/** + * @brief + * @rmtoll DIER CC2BURSTEN FL_GPTIM_DisableCC2DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableCC2DMABurstMode(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, GPTIM_DIER_CC2BURSTEN_Msk); +} + +/** + * @brief + * @rmtoll DIER CC3BURSTEN FL_GPTIM_EnableCC3DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableCC3DMABurstMode(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, GPTIM_DIER_CC3BURSTEN_Msk); +} + +/** + * @brief + * @rmtoll DIER CC3BURSTEN FL_GPTIM_IsEnabledCC3DMABurstMode + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledCC3DMABurstMode(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, GPTIM_DIER_CC3BURSTEN_Msk) == GPTIM_DIER_CC3BURSTEN_Msk); +} + +/** + * @brief + * @rmtoll DIER CC3BURSTEN FL_GPTIM_DisableCC3DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableCC3DMABurstMode(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, GPTIM_DIER_CC3BURSTEN_Msk); +} + +/** + * @brief + * @rmtoll DIER CC4BURSTEN FL_GPTIM_EnableCC4DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableCC4DMABurstMode(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, GPTIM_DIER_CC4BURSTEN_Msk); +} + +/** + * @brief + * @rmtoll DIER CC4BURSTEN FL_GPTIM_IsEnabledCC4DMABurstMode + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledCC4DMABurstMode(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, GPTIM_DIER_CC4BURSTEN_Msk) == GPTIM_DIER_CC4BURSTEN_Msk); +} + +/** + * @brief + * @rmtoll DIER CC4BURSTEN FL_GPTIM_DisableCC4DMABurstMode + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableCC4DMABurstMode(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, GPTIM_DIER_CC4BURSTEN_Msk); +} + +/** + * @brief + * @rmtoll DIER TDE FL_GPTIM_EnableDMAReq_Trigger + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableDMAReq_Trigger(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, GPTIM_DIER_TDE_Msk); +} + +/** + * @brief + * @rmtoll DIER TDE FL_GPTIM_IsEnabledDMAReq_Trigger + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledDMAReq_Trigger(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, GPTIM_DIER_TDE_Msk) == GPTIM_DIER_TDE_Msk); +} + +/** + * @brief + * @rmtoll DIER TDE FL_GPTIM_DisableDMAReq_Trigger + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableDMAReq_Trigger(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, GPTIM_DIER_TDE_Msk); +} + +/** + * @brief + * @rmtoll DIER CCDE FL_GPTIM_EnableDMAReq_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableDMAReq_CC(GPTIM_Type *TIMx, uint32_t channel) +{ + SET_BIT(TIMx->DIER, ((channel & 0xf) << 0x9U)); +} + +/** + * @brief + * @rmtoll DIER CCDE FL_GPTIM_IsEnabledDMAReq_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledDMAReq_CC(GPTIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ((channel & 0xf) << 0x9U)) == ((channel & 0xf) << 0x9U)); +} + +/** + * @brief + * @rmtoll DIER CCDE FL_GPTIM_DisableDMAReq_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableDMAReq_CC(GPTIM_Type *TIMx, uint32_t channel) +{ + CLEAR_BIT(TIMx->DIER, ((channel & 0xf) << 0x9U)); +} + +/** + * @brief + * @rmtoll DIER UDE FL_GPTIM_EnableDMAReq_Update + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableDMAReq_Update(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, GPTIM_DIER_UDE_Msk); +} + +/** + * @brief + * @rmtoll DIER UDE FL_GPTIM_IsEnabledDMAReq_Update + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledDMAReq_Update(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, GPTIM_DIER_UDE_Msk) == GPTIM_DIER_UDE_Msk); +} + +/** + * @brief + * @rmtoll DIER UDE FL_GPTIM_DisableDMAReq_Update + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableDMAReq_Update(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, GPTIM_DIER_UDE_Msk); +} + +/** + * @brief + * @rmtoll DIER TIE FL_GPTIM_EnableIT_Trigger + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableIT_Trigger(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, GPTIM_DIER_TIE_Msk); +} + +/** + * @brief + * @rmtoll DIER TIE FL_GPTIM_IsEnabledIT_Trigger + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledIT_Trigger(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, GPTIM_DIER_TIE_Msk) == GPTIM_DIER_TIE_Msk); +} + +/** + * @brief + * @rmtoll DIER TIE FL_GPTIM_DisableIT_Trigger + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableIT_Trigger(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, GPTIM_DIER_TIE_Msk); +} + +/** + * @brief + * @rmtoll DIER CCIE FL_GPTIM_EnableIT_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableIT_CC(GPTIM_Type *TIMx, uint32_t channel) +{ + SET_BIT(TIMx->DIER, ((channel & 0xf) << 0x1U)); +} + +/** + * @brief + * @rmtoll DIER CCIE FL_GPTIM_IsEnabledIT_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledIT_CC(GPTIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, ((channel & 0xf) << 0x1U)) == ((channel & 0xf) << 0x1U)); +} + +/** + * @brief + * @rmtoll DIER CCIE FL_GPTIM_DisableIT_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableIT_CC(GPTIM_Type *TIMx, uint32_t channel) +{ + CLEAR_BIT(TIMx->DIER, ((channel & 0xf) << 0x1U)); +} + +/** + * @brief + * @rmtoll DIER UIE FL_GPTIM_EnableIT_Update + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_EnableIT_Update(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->DIER, GPTIM_DIER_UIE_Msk); +} + +/** + * @brief + * @rmtoll DIER UIE FL_GPTIM_IsEnabledIT_Update + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsEnabledIT_Update(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DIER, GPTIM_DIER_UIE_Msk) == GPTIM_DIER_UIE_Msk); +} + +/** + * @brief + * @rmtoll DIER UIE FL_GPTIM_DisableIT_Update + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_DisableIT_Update(GPTIM_Type *TIMx) +{ + CLEAR_BIT(TIMx->DIER, GPTIM_DIER_UIE_Msk); +} + +/** + * @brief + * @rmtoll ISR CCOF FL_GPTIM_IsActiveFlag_CCOverflow + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsActiveFlag_CCOverflow(GPTIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->ISR, ((channel & 0xf) << 0x9U)) == ((channel & 0xf) << 0x9U)); +} + +/** + * @brief + * @rmtoll ISR CCOF FL_GPTIM_ClearFlag_CCOverflow + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_ClearFlag_CCOverflow(GPTIM_Type *TIMx, uint32_t channel) +{ + WRITE_REG(TIMx->ISR, ((channel & 0xf) << 0x9U)); +} + +/** + * @brief + * @rmtoll ISR TIF FL_GPTIM_IsActiveFlag_Trigger + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsActiveFlag_Trigger(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->ISR, GPTIM_ISR_TIF_Msk) == (GPTIM_ISR_TIF_Msk)); +} + +/** + * @brief + * @rmtoll ISR TIF FL_GPTIM_ClearFlag_Trigger + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_ClearFlag_Trigger(GPTIM_Type *TIMx) +{ + WRITE_REG(TIMx->ISR, GPTIM_ISR_TIF_Msk); +} + +/** + * @brief + * @rmtoll ISR CCIF FL_GPTIM_IsActiveFlag_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsActiveFlag_CC(GPTIM_Type *TIMx, uint32_t channel) +{ + return (uint32_t)(READ_BIT(TIMx->ISR, ((channel & 0xf) << 0x1U)) == ((channel & 0xf) << 0x1U)); +} + +/** + * @brief + * @rmtoll ISR CCIF FL_GPTIM_ClearFlag_CC + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_ClearFlag_CC(GPTIM_Type *TIMx, uint32_t channel) +{ + WRITE_REG(TIMx->ISR, ((channel & 0xf) << 0x1U)); +} + +/** + * @brief + * @rmtoll ISR UIF FL_GPTIM_IsActiveFlag_Update + * @param TIMx TIM instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IsActiveFlag_Update(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->ISR, GPTIM_ISR_UIF_Msk) == (GPTIM_ISR_UIF_Msk)); +} + +/** + * @brief + * @rmtoll ISR UIF FL_GPTIM_ClearFlag_Update + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_ClearFlag_Update(GPTIM_Type *TIMx) +{ + WRITE_REG(TIMx->ISR, GPTIM_ISR_UIF_Msk); +} + +/** + * @brief + * @rmtoll EGR TG FL_GPTIM_GenerateTriggerEvent + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_GenerateTriggerEvent(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->EGR, GPTIM_EGR_TG_Msk); +} + +/** + * @brief + * @rmtoll EGR CCG FL_GPTIM_GenerateCCEvent + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_GenerateCCEvent(GPTIM_Type *TIMx, uint32_t channel) +{ + SET_BIT(TIMx->EGR, ((channel & 0x3) << 0x1U)); +} + +/** + * @brief + * @rmtoll EGR UG FL_GPTIM_GenerateUpdateEvent + * @param TIMx TIM instance + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_GenerateUpdateEvent(GPTIM_Type *TIMx) +{ + SET_BIT(TIMx->EGR, GPTIM_EGR_UG_Msk); +} + +/** + * @brief + * @rmtoll CNT FL_GPTIM_WriteCounter + * @param TIMx TIM instance + * @param counter + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_WriteCounter(GPTIM_Type *TIMx, uint32_t counter) +{ + MODIFY_REG(TIMx->CNT, (0xffffU << 0U), (counter << 0U)); +} + +/** + * @brief + * @rmtoll CNT FL_GPTIM_ReadCounter + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_GPTIM_ReadCounter(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CNT, 0xffffU) >> 0U); +} + +/** + * @brief + * @rmtoll PSC FL_GPTIM_WritePrescaler + * @param TIMx TIM instance + * @param psc + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_WritePrescaler(GPTIM_Type *TIMx, uint32_t psc) +{ + MODIFY_REG(TIMx->PSC, (0xffffU << 0U), (psc << 0U)); +} + +/** + * @brief + * @rmtoll PSC FL_GPTIM_ReadPrescaler + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_GPTIM_ReadPrescaler(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->PSC, 0xffffU) >> 0U); +} + +/** + * @brief + * @rmtoll ARR FL_GPTIM_WriteAutoReload + * @param TIMx TIM instance + * @param autoReload + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_WriteAutoReload(GPTIM_Type *TIMx, uint32_t autoReload) +{ + MODIFY_REG(TIMx->ARR, (0xffffU << 0U), (autoReload << 0U)); +} + +/** + * @brief + * @rmtoll ARR FL_GPTIM_ReadAutoReload + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_GPTIM_ReadAutoReload(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->ARR, 0xffffU) >> 0U); +} + +/** + * @brief + * @rmtoll CCR1 FL_GPTIM_WriteCompareCH1 + * @param TIMx TIM instance + * @param compareValue + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_WriteCompareCH1(GPTIM_Type *TIMx, uint32_t compareValue) +{ + MODIFY_REG(TIMx->CCR1, (0xffffU << 0U), (compareValue << 0U)); +} + +/** + * @brief + * @rmtoll CCR1 FL_GPTIM_ReadCompareCH1 + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_GPTIM_ReadCompareCH1(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CCR1, 0xffffU) >> 0U); +} + +/** + * @brief + * @rmtoll CCR2 FL_GPTIM_WriteCompareCH2 + * @param TIMx TIM instance + * @param compareValue + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_WriteCompareCH2(GPTIM_Type *TIMx, uint32_t compareValue) +{ + MODIFY_REG(TIMx->CCR2, (0xffffU << 0U), (compareValue << 0U)); +} + +/** + * @brief + * @rmtoll CCR2 FL_GPTIM_ReadCompareCH2 + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_GPTIM_ReadCompareCH2(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CCR2, 0xffffU) >> 0U); +} + +/** + * @brief + * @rmtoll CCR3 FL_GPTIM_WriteCompareCH3 + * @param TIMx TIM instance + * @param compareValue + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_WriteCompareCH3(GPTIM_Type *TIMx, uint32_t compareValue) +{ + MODIFY_REG(TIMx->CCR3, (0xffffU << 0U), (compareValue << 0U)); +} + +/** + * @brief + * @rmtoll CCR3 FL_GPTIM_ReadCompareCH3 + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_GPTIM_ReadCompareCH3(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CCR3, 0xffffU) >> 0U); +} + +/** + * @brief + * @rmtoll CCR4 FL_GPTIM_WriteCompareCH4 + * @param TIMx TIM instance + * @param compareValue + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_WriteCompareCH4(GPTIM_Type *TIMx, uint32_t compareValue) +{ + MODIFY_REG(TIMx->CCR4, (0xffffU << 0U), (compareValue << 0U)); +} + +/** + * @brief + * @rmtoll CCR4 FL_GPTIM_ReadCompareCH4 + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_GPTIM_ReadCompareCH4(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->CCR4, 0xffffU) >> 0U); +} + +/** + * @brief + * @rmtoll DCR DBL FL_GPTIM_SetDMABurstLength + * @param TIMx TIM instance + * @param length This parameter can be one of the following values: + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_1 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_2 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_3 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_4 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_5 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_6 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_7 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_8 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_9 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_10 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_11 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_12 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_13 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_14 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_15 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_16 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_17 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_18 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetDMABurstLength(GPTIM_Type *TIMx, uint32_t length) +{ + MODIFY_REG(TIMx->DCR, GPTIM_DCR_DBL_Msk, length); +} + +/** + * @brief + * @rmtoll DCR DBL FL_GPTIM_GetDMABurstLength + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_1 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_2 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_3 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_4 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_5 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_6 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_7 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_8 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_9 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_10 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_11 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_12 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_13 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_14 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_15 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_16 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_17 + * @arg @ref FL_GPTIM_DMA_BURST_LENGTH_18 + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetDMABurstLength(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DCR, GPTIM_DCR_DBL_Msk)); +} + +/** + * @brief + * @rmtoll DCR DBA FL_GPTIM_SetDMABurstAddress + * @param TIMx TIM instance + * @param address This parameter can be one of the following values: + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CR1 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CR2 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_SMCR + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_DIER + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_SR + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_EGR + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCMR1 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCMR2 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCER + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CNT + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_PSC + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_ARR + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_RCR + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCR1 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCR2 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCR3 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCR4 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_BDTR + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetDMABurstAddress(GPTIM_Type *TIMx, uint32_t address) +{ + MODIFY_REG(TIMx->DCR, GPTIM_DCR_DBA_Msk, address); +} + +/** + * @brief + * @rmtoll DCR DBA FL_GPTIM_GetDMABurstAddress + * @param TIMx TIM instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CR1 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CR2 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_SMCR + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_DIER + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_SR + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_EGR + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCMR1 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCMR2 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCER + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CNT + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_PSC + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_ARR + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_RCR + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCR1 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCR2 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCR3 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_CCR4 + * @arg @ref FL_GPTIM_DMA_BURST_ADDR_BDTR + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetDMABurstAddress(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DCR, GPTIM_DCR_DBA_Msk)); +} + +/** + * @brief + * @rmtoll DMAR FL_GPTIM_WriteDMAAddress + * @param TIMx TIM instance + * @param address + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_WriteDMAAddress(GPTIM_Type *TIMx, uint32_t address) +{ + MODIFY_REG(TIMx->DMAR, (0xffffU << 0U), (address << 0U)); +} + +/** + * @brief + * @rmtoll DMAR FL_GPTIM_ReadDMAAddress + * @param TIMx TIM instance + * @retval + */ +__STATIC_INLINE uint32_t FL_GPTIM_ReadDMAAddress(GPTIM_Type *TIMx) +{ + return (uint32_t)(READ_BIT(TIMx->DMAR, 0xffffU) >> 0U); +} + +/** + * @brief + * @rmtoll ITRSEL FL_GPTIM_SetITRInput + * @param TIMx TIM instance + * @param ITRx This parameter can be one of the following values: + * @arg @ref FL_GPTIM_ITR0 + * @arg @ref FL_GPTIM_ITR1 + * @arg @ref FL_GPTIM_ITR2 + * @arg @ref FL_GPTIM_ITR3 + * @param input This parameter can be one of the following values: + * @arg @ref FL_GPTIM_ITRSEL_GROUP0 + * @arg @ref FL_GPTIM_ITRSEL_GROUP1 + * @arg @ref FL_GPTIM_ITRSEL_GROUP2 + * @arg @ref FL_GPTIM_ITRSEL_GROUP3 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_SetITRInput(GPTIM_Type *TIMx, uint32_t ITRx, uint32_t input) +{ + MODIFY_REG(TIMx->ITRSEL, ((ITRx * ITRx) * GPTIM_ITRSEL), ((ITRx * ITRx) * input)); +} + +/** + * @brief + * @rmtoll ITRSEL FL_GPTIM_GetITRInput + * @param TIMx TIM instance + * @param ITRx This parameter can be one of the following values: + * @arg @ref FL_GPTIM_ITR0 + * @arg @ref FL_GPTIM_ITR1 + * @arg @ref FL_GPTIM_ITR2 + * @arg @ref FL_GPTIM_ITR3 + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_ITRSEL_GROUP0 + * @arg @ref FL_GPTIM_ITRSEL_GROUP1 + * @arg @ref FL_GPTIM_ITRSEL_GROUP2 + * @arg @ref FL_GPTIM_ITRSEL_GROUP3 + */ +__STATIC_INLINE uint32_t FL_GPTIM_GetITRInput(GPTIM_Type *TIMx, uint32_t ITRx) +{ + return (uint32_t)(READ_BIT(TIMx->ITRSEL, ((ITRx * ITRx) * GPTIM_ITRSEL)) / (ITRx * ITRx)); +} + +/** + * @brief OCx clear enable + * @rmtoll CCMR OCCE FL_GPTIM_OC_EnableClear + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_OC_EnableClear(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + MODIFY_REG(TIMx->CCMR1, (0x1U << 7U), (0x1U << 7U)); + break; + case FL_GPTIM_CHANNEL_2: + MODIFY_REG(TIMx->CCMR1, (0x1U << 15U), (0x1U << 15U)); + break; + case FL_GPTIM_CHANNEL_3: + MODIFY_REG(TIMx->CCMR2, (0x1U << 7U), (0x1U << 7U)); + break; + case FL_GPTIM_CHANNEL_4: + MODIFY_REG(TIMx->CCMR2, (0x1U << 15U), (0x1U << 15U)); + break; + } +} + +/** + * @brief Get OCx Clear enable status + * @rmtoll CCMR OCCE FL_GPTIM_OC_IsEnabledClear + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_OC_IsEnabledClear(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0x1U << 7U)) >> 7U); + case FL_GPTIM_CHANNEL_2: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0x1U << 15U)) >> 15U); + case FL_GPTIM_CHANNEL_3: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0x1U << 7U)) >> 7U); + case FL_GPTIM_CHANNEL_4: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0x1U << 15U)) >> 15U); + default: + return 0; + } +} + +/** + * @brief OCx clear disable + * @rmtoll CCMR OCCE FL_GPTIM_OC_DisableClear + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_OC_DisableClear(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + CLEAR_BIT(TIMx->CCMR1, (0x1U << 7U)); + break; + case FL_GPTIM_CHANNEL_2: + CLEAR_BIT(TIMx->CCMR1, (0x1U << 15U)); + break; + case FL_GPTIM_CHANNEL_3: + CLEAR_BIT(TIMx->CCMR2, (0x1U << 7U)); + break; + case FL_GPTIM_CHANNEL_4: + CLEAR_BIT(TIMx->CCMR2, (0x1U << 15U)); + break; + } +} + +/** + * @brief Set OCx mode + * @rmtoll CCMR OCM FL_GPTIM_OC_SetMode + * @param TIMx TIM instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_GPTIM_OC_MODE_FROZEN + * @arg @ref FL_GPTIM_OC_MODE_ACTIVE + * @arg @ref FL_GPTIM_OC_MODE_INACTIVE + * @arg @ref FL_GPTIM_OC_MODE_TOGGLE + * @arg @ref FL_GPTIM_OC_MODE_FORCED_INACTIVE + * @arg @ref FL_GPTIM_OC_MODE_FORCED_ACTIVE + * @arg @ref FL_GPTIM_OC_MODE_PWM1 + * @arg @ref FL_GPTIM_OC_MODE_PWM2 + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_OC_SetMode(GPTIM_Type *TIMx, uint32_t mode, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + MODIFY_REG(TIMx->CCMR1, (0x7U << 4U), (mode)); + break; + case FL_GPTIM_CHANNEL_2: + MODIFY_REG(TIMx->CCMR1, (0x7U << 12U), (mode << 8U)); + break; + case FL_GPTIM_CHANNEL_3: + MODIFY_REG(TIMx->CCMR2, (0x7U << 4U), (mode)); + break; + case FL_GPTIM_CHANNEL_4: + MODIFY_REG(TIMx->CCMR2, (0x7U << 12U), (mode << 8U)); + break; + } +} + +/** + * @brief Get OCx mode value + * @rmtoll CCMR OCM FL_GPTIM_OC_GetMode + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_OC_MODE_FROZEN + * @arg @ref FL_GPTIM_OC_MODE_ACTIVE + * @arg @ref FL_GPTIM_OC_MODE_INACTIVE + * @arg @ref FL_GPTIM_OC_MODE_TOGGLE + * @arg @ref FL_GPTIM_OC_MODE_FORCED_INACTIVE + * @arg @ref FL_GPTIM_OC_MODE_FORCED_ACTIVE + * @arg @ref FL_GPTIM_OC_MODE_PWM1 + * @arg @ref FL_GPTIM_OC_MODE_PWM2 + */ +__STATIC_INLINE uint32_t FL_GPTIM_OC_GetMode(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0x7U << 4U)) >> 0U); + case FL_GPTIM_CHANNEL_2: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0x7U << 12U)) >> 8U); + case FL_GPTIM_CHANNEL_3: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0x7U << 4U)) >> 0U); + case FL_GPTIM_CHANNEL_4: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0x7U << 12U)) >> 8U); + default: + return 0; + } +} + +/** + * @brief + * @rmtoll CCMR OCPE FL_GPTIM_OC_EnablePreload + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_OC_EnablePreload(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + SET_BIT(TIMx->CCMR1, (0x1U << 3U)); + break; + case FL_GPTIM_CHANNEL_2: + SET_BIT(TIMx->CCMR1, (0x1U << 11U)); + break; + case FL_GPTIM_CHANNEL_3: + SET_BIT(TIMx->CCMR2, (0x1U << 3U)); + break; + case FL_GPTIM_CHANNEL_4: + SET_BIT(TIMx->CCMR2, (0x1U << 11U)); + break; + } +} + +/** + * @brief + * @rmtoll CCMR OCPE FL_GPTIM_OC_IsEnabledPreload + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_OC_IsEnabledPreload(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0x1U << 3U)) >> 3U); + case FL_GPTIM_CHANNEL_2: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0x1U << 11U)) >> 11U); + case FL_GPTIM_CHANNEL_3: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0x1U << 3U)) >> 3U); + case FL_GPTIM_CHANNEL_4: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0x1U << 11U)) >> 11U); + default: + return 0; + } +} + +/** + * @brief + * @rmtoll CCMR OCPE FL_GPTIM_OC_DisablePreload + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_OC_DisablePreload(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + CLEAR_BIT(TIMx->CCMR1, (0x1U << 3U)); + break; + case FL_GPTIM_CHANNEL_2: + CLEAR_BIT(TIMx->CCMR1, (0x1U << 11U)); + break; + case FL_GPTIM_CHANNEL_3: + CLEAR_BIT(TIMx->CCMR2, (0x1U << 3U)); + break; + case FL_GPTIM_CHANNEL_4: + CLEAR_BIT(TIMx->CCMR2, (0x1U << 11U)); + break; + } +} + +/** + * @brief + * @rmtoll CCMR OCFE FL_GPTIM_OC_EnableFastMode + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_OC_EnableFastMode(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + SET_BIT(TIMx->CCMR1, (0x1U << 2U)); + break; + case FL_GPTIM_CHANNEL_2: + SET_BIT(TIMx->CCMR1, (0x1U << 10U)); + break; + case FL_GPTIM_CHANNEL_3: + SET_BIT(TIMx->CCMR2, (0x1U << 2U)); + break; + case FL_GPTIM_CHANNEL_4: + SET_BIT(TIMx->CCMR2, (0x1U << 10U)); + break; + } +} + +/** + * @brief + * @rmtoll CCMR OCFE FL_GPTIM_OC_IsEnabledFastMode + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_OC_IsEnabledFastMode(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0x1U << 2U)) >> 2U); + case FL_GPTIM_CHANNEL_2: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0x1U << 10U)) >> 10U); + case FL_GPTIM_CHANNEL_3: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0x1U << 2U)) >> 2U); + case FL_GPTIM_CHANNEL_4: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0x1U << 10U)) >> 10U); + default: + return 0; + } +} + +/** + * @brief + * @rmtoll CCMR OCFE FL_GPTIM_OC_DisableFastMode + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_OC_DisableFastMode(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + CLEAR_BIT(TIMx->CCMR1, (0x1U << 2U)); + break; + case FL_GPTIM_CHANNEL_2: + CLEAR_BIT(TIMx->CCMR1, (0x1U << 10U)); + break; + case FL_GPTIM_CHANNEL_3: + CLEAR_BIT(TIMx->CCMR2, (0x1U << 2U)); + break; + case FL_GPTIM_CHANNEL_4: + CLEAR_BIT(TIMx->CCMR2, (0x1U << 10U)); + break; + } +} + +/** + * @brief + * @rmtoll CCMR ICF FL_GPTIM_IC_SetFilter + * @param TIMx TIM instance + * @param filter This parameter can be one of the following values: + * @arg @ref FL_GPTIM_IC_FILTER_DIV1 + * @arg @ref FL_GPTIM_IC_FILTER_DIV1_N2 + * @arg @ref FL_GPTIM_IC_FILTER_DIV1_N4 + * @arg @ref FL_GPTIM_IC_FILTER_DIV1_N8 + * @arg @ref FL_GPTIM_IC_FILTER_DIV2_N6 + * @arg @ref FL_GPTIM_IC_FILTER_DIV2_N8 + * @arg @ref FL_GPTIM_IC_FILTER_DIV4_N6 + * @arg @ref FL_GPTIM_IC_FILTER_DIV4_N8 + * @arg @ref FL_GPTIM_IC_FILTER_DIV8_N6 + * @arg @ref FL_GPTIM_IC_FILTER_DIV8_N8 + * @arg @ref FL_GPTIM_IC_FILTER_DIV16_N5 + * @arg @ref FL_GPTIM_IC_FILTER_DIV16_N6 + * @arg @ref FL_GPTIM_IC_FILTER_DIV16_N8 + * @arg @ref FL_GPTIM_IC_FILTER_DIV32_N5 + * @arg @ref FL_GPTIM_IC_FILTER_DIV32_N6 + * @arg @ref FL_GPTIM_IC_FILTER_DIV32_N8 + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_IC_SetFilter(GPTIM_Type *TIMx, uint32_t filter, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + MODIFY_REG(TIMx->CCMR1, (0xFU << 4U), (filter)); + break; + case FL_GPTIM_CHANNEL_2: + MODIFY_REG(TIMx->CCMR1, (0xFU << 12U), (filter << 8U)); + break; + case FL_GPTIM_CHANNEL_3: + MODIFY_REG(TIMx->CCMR2, (0xFU << 4U), (filter)); + break; + case FL_GPTIM_CHANNEL_4: + MODIFY_REG(TIMx->CCMR2, (0xFU << 12U), (filter << 8U)); + break; + } +} + +/** + * @brief + * @rmtoll CCMR ICF FL_GPTIM_IC_GetFilter + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_IC_FILTER_DIV1 + * @arg @ref FL_GPTIM_IC_FILTER_DIV1_N2 + * @arg @ref FL_GPTIM_IC_FILTER_DIV1_N4 + * @arg @ref FL_GPTIM_IC_FILTER_DIV1_N8 + * @arg @ref FL_GPTIM_IC_FILTER_DIV2_N6 + * @arg @ref FL_GPTIM_IC_FILTER_DIV2_N8 + * @arg @ref FL_GPTIM_IC_FILTER_DIV4_N6 + * @arg @ref FL_GPTIM_IC_FILTER_DIV4_N8 + * @arg @ref FL_GPTIM_IC_FILTER_DIV8_N6 + * @arg @ref FL_GPTIM_IC_FILTER_DIV8_N8 + * @arg @ref FL_GPTIM_IC_FILTER_DIV16_N5 + * @arg @ref FL_GPTIM_IC_FILTER_DIV16_N6 + * @arg @ref FL_GPTIM_IC_FILTER_DIV16_N8 + * @arg @ref FL_GPTIM_IC_FILTER_DIV32_N5 + * @arg @ref FL_GPTIM_IC_FILTER_DIV32_N6 + * @arg @ref FL_GPTIM_IC_FILTER_DIV32_N8 + */ +__STATIC_INLINE uint32_t FL_GPTIM_IC_GetFilter(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0xFU << 4U)) >> 0U); + case FL_GPTIM_CHANNEL_2: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0xFU << 12U)) >> 8U); + case FL_GPTIM_CHANNEL_3: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0xFU << 4U)) >> 0U); + case FL_GPTIM_CHANNEL_4: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0xFU << 12U)) >> 8U); + default: + return 0; + } +} + +/** + * @brief + * @rmtoll CCMR ICPSC FL_GPTIM_IC_SetPrescaler + * @param TIMx TIM instance + * @param psc This parameter can be one of the following values: + * @arg @ref FL_GPTIM_IC_PSC_DIV1 + * @arg @ref FL_GPTIM_IC_PSC_DIV2 + * @arg @ref FL_GPTIM_IC_PSC_DIV4 + * @arg @ref FL_GPTIM_IC_PSC_DIV8 + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_IC_SetPrescaler(GPTIM_Type *TIMx, uint32_t psc, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + MODIFY_REG(TIMx->CCMR1, (0x3U << 2U), (psc)); + break; + case FL_GPTIM_CHANNEL_2: + MODIFY_REG(TIMx->CCMR1, (0x3U << 10U), (psc << 8U)); + break; + case FL_GPTIM_CHANNEL_3: + MODIFY_REG(TIMx->CCMR2, (0x3U << 2U), (psc)); + break; + case FL_GPTIM_CHANNEL_4: + MODIFY_REG(TIMx->CCMR2, (0x3U << 10U), (psc << 8U)); + break; + } +} + +/** + * @brief + * @rmtoll CCMR ICPSC FL_GPTIM_IC_GetPrescaler + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_IC_PSC_DIV1 + * @arg @ref FL_GPTIM_IC_PSC_DIV2 + * @arg @ref FL_GPTIM_IC_PSC_DIV4 + * @arg @ref FL_GPTIM_IC_PSC_DIV8 + */ +__STATIC_INLINE uint32_t FL_GPTIM_IC_GetPrescaler(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0x3U << 2U)) >> 0U); + case FL_GPTIM_CHANNEL_2: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0x3U << 10U)) >> 8U); + case FL_GPTIM_CHANNEL_3: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0x3U << 2U)) >> 0U); + case FL_GPTIM_CHANNEL_4: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0x3U << 10U)) >> 8U); + default: + return 0; + } +} + +/** + * @brief + * @rmtoll CCMR CCS FL_GPTIM_CC_SetChannelMode + * @param TIMx TIM instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_MODE_OUTPUT + * @arg @ref FL_GPTIM_CHANNEL_MODE_INPUT_NORMAL + * @arg @ref FL_GPTIM_CHANNEL_MODE_INPUT_CROSSOVER + * @arg @ref FL_GPTIM_CHANNEL_MODE_INPUT_TRC + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_CC_SetChannelMode(GPTIM_Type *TIMx, uint32_t mode, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + MODIFY_REG(TIMx->CCMR1, (0x3U << 0U), (mode)); + break; + case FL_GPTIM_CHANNEL_2: + MODIFY_REG(TIMx->CCMR1, (0x3U << 8U), (mode << 8U)); + break; + case FL_GPTIM_CHANNEL_3: + MODIFY_REG(TIMx->CCMR2, (0x3U << 0U), (mode)); + break; + case FL_GPTIM_CHANNEL_4: + MODIFY_REG(TIMx->CCMR2, (0x3U << 8U), (mode << 8U)); + break; + } +} + +/** + * @brief + * @rmtoll CCMR CCS FL_GPTIM_CC_GetChannelMode + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_MODE_OUTPUT + * @arg @ref FL_GPTIM_CHANNEL_MODE_INPUT_NORMAL + * @arg @ref FL_GPTIM_CHANNEL_MODE_INPUT_CROSSOVER + * @arg @ref FL_GPTIM_CHANNEL_MODE_INPUT_TRC + */ +__STATIC_INLINE uint32_t FL_GPTIM_CC_GetChannelMode(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0x3U << 0U)) >> 0U); + case FL_GPTIM_CHANNEL_2: + return (uint32_t)(READ_BIT(TIMx->CCMR1, (0x3U << 8U)) >> 8U); + case FL_GPTIM_CHANNEL_3: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0x3U << 0U)) >> 0U); + case FL_GPTIM_CHANNEL_4: + return (uint32_t)(READ_BIT(TIMx->CCMR2, (0x3U << 8U)) >> 8U); + default: + return 0; + } +} + +/** + * @brief + * @rmtoll CCER CCOP FL_GPTIM_OC_SetChannelPolarity + * @param TIMx TIM instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_GPTIM_OC_POLARITY_NORMAL + * @arg @ref FL_GPTIM_OC_POLARITY_INVERT + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_OC_SetChannelPolarity(GPTIM_Type *TIMx, uint32_t polarity, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + MODIFY_REG(TIMx->CCER, (0x1U << 1U), (polarity)); + break; + case FL_GPTIM_CHANNEL_2: + MODIFY_REG(TIMx->CCER, (0x1U << 5U), (polarity << 4U)); + break; + case FL_GPTIM_CHANNEL_3: + MODIFY_REG(TIMx->CCER, (0x1U << 9U), (polarity << 8U)); + break; + case FL_GPTIM_CHANNEL_4: + MODIFY_REG(TIMx->CCER, (0x1U << 13U), (polarity << 12U)); + break; + } +} + +/** + * @brief + * @rmtoll CCER CCOP FL_GPTIM_OC_GetChannelPolarity + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_OC_POLARITY_NORMAL + * @arg @ref FL_GPTIM_OC_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_GPTIM_OC_GetChannelPolarity(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 1U)) >> 0U); + case FL_GPTIM_CHANNEL_2: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 5U)) >> 4U); + case FL_GPTIM_CHANNEL_3: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 9U)) >> 8U); + case FL_GPTIM_CHANNEL_4: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 13U)) >> 12U); + default: + return 0; + } +} + +/** + * @brief + * @rmtoll CCER CCIP FL_GPTIM_IC_SetChannelPolarity + * @param TIMx TIM instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_GPTIM_IC_POLARITY_NORMAL + * @arg @ref FL_GPTIM_IC_POLARITY_INVERT + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_IC_SetChannelPolarity(GPTIM_Type *TIMx, uint32_t polarity, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + MODIFY_REG(TIMx->CCER, (0x1U << 1U), (polarity)); + break; + case FL_GPTIM_CHANNEL_2: + MODIFY_REG(TIMx->CCER, (0x1U << 5U), (polarity << 4U)); + break; + case FL_GPTIM_CHANNEL_3: + MODIFY_REG(TIMx->CCER, (0x1U << 9U), (polarity << 8U)); + break; + case FL_GPTIM_CHANNEL_4: + MODIFY_REG(TIMx->CCER, (0x1U << 13U), (polarity << 12U)); + break; + } +} + +/** + * @brief + * @rmtoll CCER CCIP FL_GPTIM_IC_GetChannelPolarity + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_GPTIM_IC_POLARITY_NORMAL + * @arg @ref FL_GPTIM_IC_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_GPTIM_IC_GetChannelPolarity(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 1U)) >> 0U); + case FL_GPTIM_CHANNEL_2: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 5U)) >> 4U); + case FL_GPTIM_CHANNEL_3: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 9U)) >> 8U); + case FL_GPTIM_CHANNEL_4: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 13U)) >> 12U); + default: + return 0; + } +} + +/** + * @brief + * @rmtoll CCER CCE FL_GPTIM_OC_EnableChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_OC_EnableChannel(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + SET_BIT(TIMx->CCER, (0x1U << 0U)); + break; + case FL_GPTIM_CHANNEL_2: + SET_BIT(TIMx->CCER, (0x1U << 4U)); + break; + case FL_GPTIM_CHANNEL_3: + SET_BIT(TIMx->CCER, (0x1U << 8U)); + break; + case FL_GPTIM_CHANNEL_4: + SET_BIT(TIMx->CCER, (0x1U << 12U)); + break; + } +} + +/** + * @brief + * @rmtoll CCER CCE FL_GPTIM_OC_IsEnabledChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_OC_IsEnabledChannel(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 0U)) >> 0U); + case FL_GPTIM_CHANNEL_2: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 4U)) >> 4U); + case FL_GPTIM_CHANNEL_3: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 8U)) >> 8U); + case FL_GPTIM_CHANNEL_4: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 12U)) >> 12U); + default: + return 0; + } +} + +/** + * @brief + * @rmtoll CCER CCE FL_GPTIM_OC_DisableChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_OC_DisableChannel(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + CLEAR_BIT(TIMx->CCER, (0x1U << 0U)); + break; + case FL_GPTIM_CHANNEL_2: + CLEAR_BIT(TIMx->CCER, (0x1U << 4U)); + break; + case FL_GPTIM_CHANNEL_3: + CLEAR_BIT(TIMx->CCER, (0x1U << 8U)); + break; + case FL_GPTIM_CHANNEL_4: + CLEAR_BIT(TIMx->CCER, (0x1U << 12U)); + break; + } +} + +/** + * @brief + * @rmtoll CCER CCE FL_GPTIM_IC_EnableChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_IC_EnableChannel(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + SET_BIT(TIMx->CCER, (0x1U << 0U)); + break; + case FL_GPTIM_CHANNEL_2: + SET_BIT(TIMx->CCER, (0x1U << 4U)); + break; + case FL_GPTIM_CHANNEL_3: + SET_BIT(TIMx->CCER, (0x1U << 8U)); + break; + case FL_GPTIM_CHANNEL_4: + SET_BIT(TIMx->CCER, (0x1U << 12U)); + break; + } +} + +/** + * @brief + * @rmtoll CCER CCE FL_GPTIM_IC_IsEnabledChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_GPTIM_IC_IsEnabledChannel(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 0U)) >> 0U); + case FL_GPTIM_CHANNEL_2: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 4U)) >> 4U); + case FL_GPTIM_CHANNEL_3: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 8U)) >> 8U); + case FL_GPTIM_CHANNEL_4: + return (uint32_t)(READ_BIT(TIMx->CCER, (0x1U << 12U)) >> 12U); + default: + return 0; + } +} + +/** + * @brief + * @rmtoll CCER CCE FL_GPTIM_IC_DisableChannel + * @param TIMx TIM instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @arg @ref FL_GPTIM_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_GPTIM_IC_DisableChannel(GPTIM_Type *TIMx, uint32_t channel) +{ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + CLEAR_BIT(TIMx->CCER, (0x1U << 0U)); + break; + case FL_GPTIM_CHANNEL_2: + CLEAR_BIT(TIMx->CCER, (0x1U << 4U)); + break; + case FL_GPTIM_CHANNEL_3: + CLEAR_BIT(TIMx->CCER, (0x1U << 8U)); + break; + case FL_GPTIM_CHANNEL_4: + CLEAR_BIT(TIMx->CCER, (0x1U << 12U)); + break; + } +} + +/** + * @} + */ + +/** @defgroup GPTIM_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_GPTIM_DeInit(GPTIM_Type *TIMx); + +void FL_GPTIM_StructInit(FL_GPTIM_InitTypeDef *init); +void FL_GPTIM_SlaveMode_StructInit(FL_GPTIM_SlaveInitTypeDef *slave_init); +void FL_GPTIM_OC_StructInit(FL_GPTIM_OC_InitTypeDef *oc_init); +void FL_GPTIM_IC_StructInit(FL_GPTIM_IC_InitTypeDef *ic_init); +void FL_GPTIM_ETR_StructInit(FL_GPTIM_ETR_InitTypeDef *etr_init); + +FL_ErrorStatus FL_GPTIM_Init(GPTIM_Type *TIMx, FL_GPTIM_InitTypeDef *init); +FL_ErrorStatus FL_GPTIM_SlaveMode_Init(GPTIM_Type *TIMx, FL_GPTIM_SlaveInitTypeDef *slave_init); +FL_ErrorStatus FL_GPTIM_OC_Init(GPTIM_Type *TIMx, uint32_t channel, FL_GPTIM_OC_InitTypeDef *oc_init); +FL_ErrorStatus FL_GPTIM_IC_Init(GPTIM_Type *TIMx, uint32_t channel, FL_GPTIM_IC_InitTypeDef *ic_init); +FL_ErrorStatus FL_GPTIM_ETR_Init(GPTIM_Type *TIMx, FL_GPTIM_ETR_InitTypeDef *etr_init); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_GPTIM_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-23*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_i2c.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_i2c.h new file mode 100644 index 0000000..67c9003 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_i2c.h @@ -0,0 +1,1861 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_i2c.h + * @author FMSH Application Team + * @brief Head file of I2C FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_I2C_H +#define __FM33LG0XX_FL_I2C_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup I2C I2C + * @brief I2C FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup I2C_FL_ES_INIT I2C Exported Init structures + * @{ + */ + +/** + * @brief FL I2C Init Sturcture definition + */ +typedef struct +{ + /** 主机时使用的时钟源*/ + uint32_t clockSource; + /** I2C通讯速率*/ + uint32_t baudRate; + +} FL_I2C_MasterMode_InitTypeDef; +/** + * @brief FL I2C Slavemode Init Sturcture definition + */ +typedef struct +{ + /** 从机模式从机地址 */ + uint32_t ownAddr; + /** 从机模式自动回应ACK */ + uint32_t ACK; + /** 从机模式地址位宽 */ + uint32_t ownAddrSize10bit; + /** 从机时钟延展*/ + uint32_t SCLSEN; + +} FL_I2C_SlaveMode_InitTypeDef; +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup I2C_FL_Exported_Constants I2C Exported Constants + * @{ + */ + +#define I2C_MSPCFGR_MSPEN_Pos (0U) +#define I2C_MSPCFGR_MSPEN_Msk (0x1U << I2C_MSPCFGR_MSPEN_Pos) +#define I2C_MSPCFGR_MSPEN I2C_MSPCFGR_MSPEN_Msk + +#define I2C_MSPCFGR_TOEN_Pos (1U) +#define I2C_MSPCFGR_TOEN_Msk (0x1U << I2C_MSPCFGR_TOEN_Pos) +#define I2C_MSPCFGR_TOEN I2C_MSPCFGR_TOEN_Msk + +#define I2C_MSPCFGR_DMAEN_Pos (16U) +#define I2C_MSPCFGR_DMAEN_Msk (0x1U << I2C_MSPCFGR_DMAEN_Pos) +#define I2C_MSPCFGR_DMAEN I2C_MSPCFGR_DMAEN_Msk + +#define I2C_MSPCFGR_AUTOEND_Pos (17U) +#define I2C_MSPCFGR_AUTOEND_Msk (0x1U << I2C_MSPCFGR_AUTOEND_Pos) +#define I2C_MSPCFGR_AUTOEND I2C_MSPCFGR_AUTOEND_Msk + +#define I2C_MSPCR_RCEN_Pos (3U) +#define I2C_MSPCR_RCEN_Msk (0x1U << I2C_MSPCR_RCEN_Pos) +#define I2C_MSPCR_RCEN I2C_MSPCR_RCEN_Msk + +#define I2C_MSPCR_PEN_Pos (2U) +#define I2C_MSPCR_PEN_Msk (0x1U << I2C_MSPCR_PEN_Pos) +#define I2C_MSPCR_PEN I2C_MSPCR_PEN_Msk + +#define I2C_MSPCR_RSEN_Pos (1U) +#define I2C_MSPCR_RSEN_Msk (0x1U << I2C_MSPCR_RSEN_Pos) +#define I2C_MSPCR_RSEN I2C_MSPCR_RSEN_Msk + +#define I2C_MSPCR_SEN_Pos (0U) +#define I2C_MSPCR_SEN_Msk (0x1U << I2C_MSPCR_SEN_Pos) +#define I2C_MSPCR_SEN I2C_MSPCR_SEN_Msk + +#define I2C_MSPIER_WCOLIE_Pos (6U) +#define I2C_MSPIER_WCOLIE_Msk (0x1U << I2C_MSPIER_WCOLIE_Pos) +#define I2C_MSPIER_WCOLIE I2C_MSPIER_WCOLIE_Msk + +#define I2C_MSPIER_TOIE_Pos (5U) +#define I2C_MSPIER_TOIE_Msk (0x1U << I2C_MSPIER_TOIE_Pos) +#define I2C_MSPIER_TOIE I2C_MSPIER_TOIE_Msk + +#define I2C_MSPIER_SIE_Pos (4U) +#define I2C_MSPIER_SIE_Msk (0x1U << I2C_MSPIER_SIE_Pos) +#define I2C_MSPIER_SIE I2C_MSPIER_SIE_Msk + +#define I2C_MSPIER_PIE_Pos (3U) +#define I2C_MSPIER_PIE_Msk (0x1U << I2C_MSPIER_PIE_Pos) +#define I2C_MSPIER_PIE I2C_MSPIER_PIE_Msk + +#define I2C_MSPIER_NACKIE_Pos (2U) +#define I2C_MSPIER_NACKIE_Msk (0x1U << I2C_MSPIER_NACKIE_Pos) +#define I2C_MSPIER_NACKIE I2C_MSPIER_NACKIE_Msk + +#define I2C_MSPIER_TXIE_Pos (1U) +#define I2C_MSPIER_TXIE_Msk (0x1U << I2C_MSPIER_TXIE_Pos) +#define I2C_MSPIER_TXIE I2C_MSPIER_TXIE_Msk + +#define I2C_MSPIER_RXIE_Pos (0U) +#define I2C_MSPIER_RXIE_Msk (0x1U << I2C_MSPIER_RXIE_Pos) +#define I2C_MSPIER_RXIE I2C_MSPIER_RXIE_Msk + +#define I2C_MSPISR_WCOL_Pos (6U) +#define I2C_MSPISR_WCOL_Msk (0x1U << I2C_MSPISR_WCOL_Pos) +#define I2C_MSPISR_WCOL I2C_MSPISR_WCOL_Msk + +#define I2C_MSPISR_TO_Pos (5U) +#define I2C_MSPISR_TO_Msk (0x1U << I2C_MSPISR_TO_Pos) +#define I2C_MSPISR_TO I2C_MSPISR_TO_Msk + +#define I2C_MSPISR_S_Pos (4U) +#define I2C_MSPISR_S_Msk (0x1U << I2C_MSPISR_S_Pos) +#define I2C_MSPISR_S I2C_MSPISR_S_Msk + +#define I2C_MSPISR_P_Pos (3U) +#define I2C_MSPISR_P_Msk (0x1U << I2C_MSPISR_P_Pos) +#define I2C_MSPISR_P I2C_MSPISR_P_Msk + +#define I2C_MSPISR_ACKSTA_Pos (2U) +#define I2C_MSPISR_ACKSTA_Msk (0x1U << I2C_MSPISR_ACKSTA_Pos) +#define I2C_MSPISR_ACKSTA I2C_MSPISR_ACKSTA_Msk + +#define I2C_MSPISR_TXIF_Pos (1U) +#define I2C_MSPISR_TXIF_Msk (0x1U << I2C_MSPISR_TXIF_Pos) +#define I2C_MSPISR_TXIF I2C_MSPISR_TXIF_Msk + +#define I2C_MSPISR_RXIF_Pos (0U) +#define I2C_MSPISR_RXIF_Msk (0x1U << I2C_MSPISR_RXIF_Pos) +#define I2C_MSPISR_RXIF I2C_MSPISR_RXIF_Msk + +#define I2C_MSPSR_BUSY_Pos (5U) +#define I2C_MSPSR_BUSY_Msk (0x1U << I2C_MSPSR_BUSY_Pos) +#define I2C_MSPSR_BUSY I2C_MSPSR_BUSY_Msk + +#define I2C_MSPSR_RW_Pos (4U) +#define I2C_MSPSR_RW_Msk (0x1U << I2C_MSPSR_RW_Pos) +#define I2C_MSPSR_RW I2C_MSPSR_RW_Msk + +#define I2C_MSPSR_BF_Pos (2U) +#define I2C_MSPSR_BF_Msk (0x1U << I2C_MSPSR_BF_Pos) +#define I2C_MSPSR_BF I2C_MSPSR_BF_Msk + +#define I2C_MSPSR_ACKMO_Pos (0U) +#define I2C_MSPSR_ACKMO_Msk (0x1U << I2C_MSPSR_ACKMO_Pos) +#define I2C_MSPSR_ACKMO I2C_MSPSR_ACKMO_Msk + +#define I2C_MSPBGR_MSPBGRH_Pos (16U) +#define I2C_MSPBGR_MSPBGRH_Msk (0x1ffU << I2C_MSPBGR_MSPBGRH_Pos) +#define I2C_MSPBGR_MSPBGRH I2C_MSPBGR_MSPBGRH_Msk + +#define I2C_MSPBGR_MSPBGRL_Pos (0U) +#define I2C_MSPBGR_MSPBGRL_Msk (0x1ffU << I2C_MSPBGR_MSPBGRL_Pos) +#define I2C_MSPBGR_MSPBGRL I2C_MSPBGR_MSPBGRL_Msk + +#define I2C_MSPBUF_MSPBUF_Pos (0U) +#define I2C_MSPBUF_MSPBUF_Msk (0xffU << I2C_MSPBUF_MSPBUF_Pos) +#define I2C_MSPBUF_MSPBUF I2C_MSPBUF_MSPBUF_Msk + +#define I2C_MSPTCR_SDAHD_Pos (0U) +#define I2C_MSPTCR_SDAHD_Msk (0x1ffU << I2C_MSPTCR_SDAHD_Pos) +#define I2C_MSPTCR_SDAHD I2C_MSPTCR_SDAHD_Msk + +#define I2C_MSPTOR_TIMEOUT_Pos (0U) +#define I2C_MSPTOR_TIMEOUT_Msk (0xfffU << I2C_MSPTOR_TIMEOUT_Pos) +#define I2C_MSPTOR_TIMEOUT I2C_MSPTOR_TIMEOUT_Msk + +#define I2C_SSPCR_SCLSEN_Pos (9U) +#define I2C_SSPCR_SCLSEN_Msk (0x1U << I2C_SSPCR_SCLSEN_Pos) +#define I2C_SSPCR_SCLSEN I2C_SSPCR_SCLSEN_Msk + +#define I2C_SSPCR_DMAEN_Pos (8U) +#define I2C_SSPCR_DMAEN_Msk (0x1U << I2C_SSPCR_DMAEN_Pos) +#define I2C_SSPCR_DMAEN I2C_SSPCR_DMAEN_Msk + +#define I2C_SSPCR_ACKEN_Pos (4U) +#define I2C_SSPCR_ACKEN_Msk (0x1U << I2C_SSPCR_ACKEN_Pos) +#define I2C_SSPCR_ACKEN I2C_SSPCR_ACKEN_Msk + +#define I2C_SSPCR_SDAO_DLYEN_Pos (3U) +#define I2C_SSPCR_SDAO_DLYEN_Msk (0x1U << I2C_SSPCR_SDAO_DLYEN_Pos) +#define I2C_SSPCR_SDAO_DLYEN I2C_SSPCR_SDAO_DLYEN_Msk + +#define I2C_SSPCR_SCLI_ANFEN_Pos (2U) +#define I2C_SSPCR_SCLI_ANFEN_Msk (0x1U << I2C_SSPCR_SCLI_ANFEN_Pos) +#define I2C_SSPCR_SCLI_ANFEN I2C_SSPCR_SCLI_ANFEN_Msk + +#define I2C_SSPCR_A10EN_Pos (1U) +#define I2C_SSPCR_A10EN_Msk (0x1U << I2C_SSPCR_A10EN_Pos) +#define I2C_SSPCR_A10EN I2C_SSPCR_A10EN_Msk + +#define I2C_SSPCR_SSPEN_Pos (0U) +#define I2C_SSPCR_SSPEN_Msk (0x1U << I2C_SSPCR_SSPEN_Pos) +#define I2C_SSPCR_SSPEN I2C_SSPCR_SSPEN_Msk + +#define I2C_SSPIER_ADEIE_Pos (7U) +#define I2C_SSPIER_ADEIE_Msk (0x1U << I2C_SSPIER_ADEIE_Pos) +#define I2C_SSPIER_ADEIE I2C_SSPIER_ADEIE_Msk + +#define I2C_SSPIER_SIE_Pos (6U) +#define I2C_SSPIER_SIE_Msk (0x1U << I2C_SSPIER_SIE_Pos) +#define I2C_SSPIER_SIE I2C_SSPIER_SIE_Msk + +#define I2C_SSPIER_PIE_Pos (5U) +#define I2C_SSPIER_PIE_Msk (0x1U << I2C_SSPIER_PIE_Pos) +#define I2C_SSPIER_PIE I2C_SSPIER_PIE_Msk + +#define I2C_SSPIER_WCOLIE_Pos (4U) +#define I2C_SSPIER_WCOLIE_Msk (0x1U << I2C_SSPIER_WCOLIE_Pos) +#define I2C_SSPIER_WCOLIE I2C_SSPIER_WCOLIE_Msk + +#define I2C_SSPIER_SSPOVIE_Pos (3U) +#define I2C_SSPIER_SSPOVIE_Msk (0x1U << I2C_SSPIER_SSPOVIE_Pos) +#define I2C_SSPIER_SSPOVIE I2C_SSPIER_SSPOVIE_Msk + +#define I2C_SSPIER_ADMIE_Pos (2U) +#define I2C_SSPIER_ADMIE_Msk (0x1U << I2C_SSPIER_ADMIE_Pos) +#define I2C_SSPIER_ADMIE I2C_SSPIER_ADMIE_Msk + +#define I2C_SSPIER_TXIE_Pos (1U) +#define I2C_SSPIER_TXIE_Msk (0x1U << I2C_SSPIER_TXIE_Pos) +#define I2C_SSPIER_TXIE I2C_SSPIER_TXIE_Msk + +#define I2C_SSPIER_RXIE_Pos (0U) +#define I2C_SSPIER_RXIE_Msk (0x1U << I2C_SSPIER_RXIE_Pos) +#define I2C_SSPIER_RXIE I2C_SSPIER_RXIE_Msk + +#define I2C_SSPISR_ADE_Pos (7U) +#define I2C_SSPISR_ADE_Msk (0x1U << I2C_SSPISR_ADE_Pos) +#define I2C_SSPISR_ADE I2C_SSPISR_ADE_Msk + +#define I2C_SSPISR_S_Pos (6U) +#define I2C_SSPISR_S_Msk (0x1U << I2C_SSPISR_S_Pos) +#define I2C_SSPISR_S I2C_SSPISR_S_Msk + +#define I2C_SSPISR_P_Pos (5U) +#define I2C_SSPISR_P_Msk (0x1U << I2C_SSPISR_P_Pos) +#define I2C_SSPISR_P I2C_SSPISR_P_Msk + +#define I2C_SSPISR_WCOL_Pos (4U) +#define I2C_SSPISR_WCOL_Msk (0x1U << I2C_SSPISR_WCOL_Pos) +#define I2C_SSPISR_WCOL I2C_SSPISR_WCOL_Msk + +#define I2C_SSPISR_SSPOV_Pos (3U) +#define I2C_SSPISR_SSPOV_Msk (0x1U << I2C_SSPISR_SSPOV_Pos) +#define I2C_SSPISR_SSPOV I2C_SSPISR_SSPOV_Msk + +#define I2C_SSPISR_ADM_Pos (2U) +#define I2C_SSPISR_ADM_Msk (0x1U << I2C_SSPISR_ADM_Pos) +#define I2C_SSPISR_ADM I2C_SSPISR_ADM_Msk + +#define I2C_SSPISR_TXIF_Pos (1U) +#define I2C_SSPISR_TXIF_Msk (0x1U << I2C_SSPISR_TXIF_Pos) +#define I2C_SSPISR_TXIF I2C_SSPISR_TXIF_Msk + +#define I2C_SSPISR_RXIF_Pos (0U) +#define I2C_SSPISR_RXIF_Msk (0x1U << I2C_SSPISR_RXIF_Pos) +#define I2C_SSPISR_RXIF I2C_SSPISR_RXIF_Msk + +#define I2C_SSPSR_BUSY_Pos (3U) +#define I2C_SSPSR_BUSY_Msk (0x1U << I2C_SSPSR_BUSY_Pos) +#define I2C_SSPSR_BUSY I2C_SSPSR_BUSY_Msk + +#define I2C_SSPSR_RW_Pos (2U) +#define I2C_SSPSR_RW_Msk (0x1U << I2C_SSPSR_RW_Pos) +#define I2C_SSPSR_RW I2C_SSPSR_RW_Msk + +#define I2C_SSPSR_DA_Pos (1U) +#define I2C_SSPSR_DA_Msk (0x1U << I2C_SSPSR_DA_Pos) +#define I2C_SSPSR_DA I2C_SSPSR_DA_Msk + +#define I2C_SSPSR_BF_Pos (0U) +#define I2C_SSPSR_BF_Msk (0x1U << I2C_SSPSR_BF_Pos) +#define I2C_SSPSR_BF I2C_SSPSR_BF_Msk + + + + + + +#define FL_I2C_MSP_DATA_DIRECTION_SLAVE_TO_MASTER (0x0U << I2C_MSPSR_RW_Pos) +#define FL_I2C_MSP_DATA_DIRECTION_MASTER_TO_SLAVE (0x1U << I2C_MSPSR_RW_Pos) + +#define FL_I2C_MSP_DATA_BUFF_STATUS_FULL (0x0U << I2C_MSPSR_BF_Pos) +#define FL_I2C_MSP_DATA_BUFF_STATUS_EMPTY (0x1U << I2C_MSPSR_BF_Pos) + +#define FL_I2C_MASTER_RESPOND_ACK (0x0U << I2C_MSPSR_ACKMO_Pos) +#define FL_I2C_MASTER_RESPOND_NACK (0x1U << I2C_MSPSR_ACKMO_Pos) + + +#define FL_I2C_SSP_DATA_DIRECTION_SLAVE_TO_MASTER (0x1U << I2C_SSPSR_RW_Pos) +#define FL_I2C_SSP_DATA_DIRECTION_MASTER_TO_SLAVE (0x0U << I2C_SSPSR_RW_Pos) + +#define FL_I2C_SSP_DATA_TYPE_DATA (0x1U << I2C_SSPSR_DA_Pos) +#define FL_I2C_SSP_DATA_TYPE_ADDR (0x0U << I2C_SSPSR_DA_Pos) + +#define FL_I2C_SSP_DATA_BUFF_STATUS_FULL (0x1U << I2C_SSPSR_BF_Pos) +#define FL_I2C_SSP_DATA_BUFF_STATUS_EMPTY (0x0U << I2C_SSPSR_BF_Pos) + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup I2C_FL_Exported_Functions I2C Exported Functions + * @{ + */ + +/** + * @brief + * @rmtoll MSPCFGR MSPEN FL_I2C_Master_Enable + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_Enable(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPCFGR, I2C_MSPCFGR_MSPEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCFGR MSPEN FL_I2C_Master_IsEnabled + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsEnabled(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPCFGR, I2C_MSPCFGR_MSPEN_Msk) == I2C_MSPCFGR_MSPEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCFGR MSPEN FL_I2C_Master_Disable + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_Disable(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->MSPCFGR, I2C_MSPCFGR_MSPEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCFGR TOEN FL_I2C_Master_EnableTimeout + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableTimeout(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPCFGR, I2C_MSPCFGR_TOEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCFGR TOEN FL_I2C_Master_IsEnabledTimeout + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsEnabledTimeout(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPCFGR, I2C_MSPCFGR_TOEN_Msk) == I2C_MSPCFGR_TOEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCFGR TOEN FL_I2C_Master_DisableTimeout + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_DisableTimeout(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->MSPCFGR, I2C_MSPCFGR_TOEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCFGR DMAEN FL_I2C_Master_EnableDMAReq + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableDMAReq(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPCFGR, I2C_MSPCFGR_DMAEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCFGR DMAEN FL_I2C_Master_IsEnabledDMAReq + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsEnabledDMAReq(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPCFGR, I2C_MSPCFGR_DMAEN_Msk) == I2C_MSPCFGR_DMAEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCFGR DMAEN FL_I2C_Master_DisableDMAReq + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_DisableDMAReq(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->MSPCFGR, I2C_MSPCFGR_DMAEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCFGR AUTOEND FL_I2C_Master_EnableAutoStop + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableAutoStop(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPCFGR, I2C_MSPCFGR_AUTOEND_Msk); +} + +/** + * @brief + * @rmtoll MSPCFGR AUTOEND FL_I2C_Master_IsEnabledAutoStop + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsEnabledAutoStop(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPCFGR, I2C_MSPCFGR_AUTOEND_Msk) == I2C_MSPCFGR_AUTOEND_Msk); +} + +/** + * @brief + * @rmtoll MSPCFGR AUTOEND FL_I2C_Master_DisableAutoStop + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_DisableAutoStop(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->MSPCFGR, I2C_MSPCFGR_AUTOEND_Msk); +} + +/** + * @brief + * @rmtoll MSPCR RCEN FL_I2C_Master_EnableRX + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableRX(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPCR, I2C_MSPCR_RCEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCR RCEN FL_I2C_Master_IsEnabledRX + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsEnabledRX(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPCR, I2C_MSPCR_RCEN_Msk) == I2C_MSPCR_RCEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCR RCEN FL_I2C_Master_DisableRX + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_DisableRX(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->MSPCR, I2C_MSPCR_RCEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCR PEN FL_I2C_Master_EnableI2CStop + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableI2CStop(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPCR, I2C_MSPCR_PEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCR RSEN FL_I2C_Master_EnableI2CRestart + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableI2CRestart(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPCR, I2C_MSPCR_RSEN_Msk); +} + +/** + * @brief + * @rmtoll MSPCR SEN FL_I2C_Master_EnableI2CStart + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableI2CStart(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPCR, I2C_MSPCR_SEN_Msk); +} + +/** + * @brief + * @rmtoll MSPIER WCOLIE FL_I2C_Master_EnableIT_WriteConflict + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableIT_WriteConflict(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPIER, I2C_MSPIER_WCOLIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER WCOLIE FL_I2C_Master_IsEnabledIT_WriteConflict + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsEnabledIT_WriteConflict(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPIER, I2C_MSPIER_WCOLIE_Msk) == I2C_MSPIER_WCOLIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER WCOLIE FL_I2C_Master_DisableIT_WriteConflict + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_DisableIT_WriteConflict(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->MSPIER, I2C_MSPIER_WCOLIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER TOIE FL_I2C_Master_EnableIT_Timeout + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableIT_Timeout(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPIER, I2C_MSPIER_TOIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER TOIE FL_I2C_Master_IsEnabledIT_Timeout + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsEnabledIT_Timeout(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPIER, I2C_MSPIER_TOIE_Msk) == I2C_MSPIER_TOIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER TOIE FL_I2C_Master_DisableIT_Timeout + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_DisableIT_Timeout(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->MSPIER, I2C_MSPIER_TOIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER SIE FL_I2C_Master_EnableIT_Start + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableIT_Start(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPIER, I2C_MSPIER_SIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER SIE FL_I2C_Master_IsEnabledIT_Start + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsEnabledIT_Start(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPIER, I2C_MSPIER_SIE_Msk) == I2C_MSPIER_SIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER SIE FL_I2C_Master_DisableIT_Start + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_DisableIT_Start(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->MSPIER, I2C_MSPIER_SIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER PIE FL_I2C_Master_EnableIT_Stop + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableIT_Stop(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPIER, I2C_MSPIER_PIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER PIE FL_I2C_Master_IsEnabledIT_Stop + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsEnabledIT_Stop(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPIER, I2C_MSPIER_PIE_Msk) == I2C_MSPIER_PIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER PIE FL_I2C_Master_DisableIT_Stop + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_DisableIT_Stop(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->MSPIER, I2C_MSPIER_PIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER NACKIE FL_I2C_Master_EnableIT_NACK + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableIT_NACK(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPIER, I2C_MSPIER_NACKIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER NACKIE FL_I2C_Master_IsEnabledIT_NACK + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsEnabledIT_NACK(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPIER, I2C_MSPIER_NACKIE_Msk) == I2C_MSPIER_NACKIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER NACKIE FL_I2C_Master_DisableIT_NACK + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_DisableIT_NACK(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->MSPIER, I2C_MSPIER_NACKIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER TXIE FL_I2C_Master_EnableIT_TXComplete + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableIT_TXComplete(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPIER, I2C_MSPIER_TXIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER TXIE FL_I2C_Master_IsEnabledIT_TXComplete + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsEnabledIT_TXComplete(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPIER, I2C_MSPIER_TXIE_Msk) == I2C_MSPIER_TXIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER TXIE FL_I2C_Master_DisableIT_TXComplete + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_DisableIT_TXComplete(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->MSPIER, I2C_MSPIER_TXIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER RXIE FL_I2C_Master_EnableIT_RXComplete + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_EnableIT_RXComplete(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->MSPIER, I2C_MSPIER_RXIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER RXIE FL_I2C_Master_IsEnabledIT_RXComplete + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsEnabledIT_RXComplete(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPIER, I2C_MSPIER_RXIE_Msk) == I2C_MSPIER_RXIE_Msk); +} + +/** + * @brief + * @rmtoll MSPIER RXIE FL_I2C_Master_DisableIT_RXComplete + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_DisableIT_RXComplete(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->MSPIER, I2C_MSPIER_RXIE_Msk); +} + +/** + * @brief + * @rmtoll MSPISR WCOL FL_I2C_Master_IsActiveFlag_WriteConflict + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsActiveFlag_WriteConflict(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPISR, I2C_MSPISR_WCOL_Msk) == (I2C_MSPISR_WCOL_Msk)); +} + +/** + * @brief + * @rmtoll MSPISR WCOL FL_I2C_Master_ClearFlag_WriteConflict + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_ClearFlag_WriteConflict(I2C_Type *I2Cx) +{ + WRITE_REG(I2Cx->MSPISR, I2C_MSPISR_WCOL_Msk); +} + +/** + * @brief + * @rmtoll MSPISR TO FL_I2C_Master_IsActiveFlag_Timeout + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsActiveFlag_Timeout(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPISR, I2C_MSPISR_TO_Msk) == (I2C_MSPISR_TO_Msk)); +} + +/** + * @brief + * @rmtoll MSPISR TO FL_I2C_Master_ClearFlag_Timeout + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_ClearFlag_Timeout(I2C_Type *I2Cx) +{ + WRITE_REG(I2Cx->MSPISR, I2C_MSPISR_TO_Msk); +} + +/** + * @brief + * @rmtoll MSPISR S FL_I2C_Master_IsActiveFlag_Start + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsActiveFlag_Start(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPISR, I2C_MSPISR_S_Msk) == (I2C_MSPISR_S_Msk)); +} + +/** + * @brief + * @rmtoll MSPISR P FL_I2C_Master_IsActiveFlag_Stop + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsActiveFlag_Stop(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPISR, I2C_MSPISR_P_Msk) == (I2C_MSPISR_P_Msk)); +} + +/** + * @brief + * @rmtoll MSPISR ACKSTA FL_I2C_Master_IsActiveFlag_NACK + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsActiveFlag_NACK(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPISR, I2C_MSPISR_ACKSTA_Msk) == (I2C_MSPISR_ACKSTA_Msk)); +} + +/** + * @brief + * @rmtoll MSPISR ACKSTA FL_I2C_Master_ClearFlag_NACK + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_ClearFlag_NACK(I2C_Type *I2Cx) +{ + WRITE_REG(I2Cx->MSPISR, I2C_MSPISR_ACKSTA_Msk); +} + +/** + * @brief + * @rmtoll MSPISR TXIF FL_I2C_Master_IsActiveFlag_TXComplete + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsActiveFlag_TXComplete(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPISR, I2C_MSPISR_TXIF_Msk) == (I2C_MSPISR_TXIF_Msk)); +} + +/** + * @brief + * @rmtoll MSPISR TXIF FL_I2C_Master_ClearFlag_TXComplete + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_ClearFlag_TXComplete(I2C_Type *I2Cx) +{ + WRITE_REG(I2Cx->MSPISR, I2C_MSPISR_TXIF_Msk); +} + +/** + * @brief + * @rmtoll MSPISR RXIF FL_I2C_Master_IsActiveFlag_RXComplete + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsActiveFlag_RXComplete(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPISR, I2C_MSPISR_RXIF_Msk) == (I2C_MSPISR_RXIF_Msk)); +} + +/** + * @brief + * @rmtoll MSPISR RXIF FL_I2C_Master_ClearFlag_RXComplete + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_ClearFlag_RXComplete(I2C_Type *I2Cx) +{ + WRITE_REG(I2Cx->MSPISR, I2C_MSPISR_RXIF_Msk); +} + +/** + * @brief + * @rmtoll MSPSR BUSY FL_I2C_Master_IsActiveFlag_Busy + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Master_IsActiveFlag_Busy(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPSR, I2C_MSPSR_BUSY_Msk) == (I2C_MSPSR_BUSY_Msk)); +} + +/** + * @brief + * @rmtoll MSPSR RW FL_I2C_Master_GetDirection + * @param I2Cx I2C instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_I2C_MSP_DATA_DIRECTION_SLAVE_TO_MASTER + * @arg @ref FL_I2C_MSP_DATA_DIRECTION_MASTER_TO_SLAVE + */ +__STATIC_INLINE uint32_t FL_I2C_Master_GetDirection(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPSR, I2C_MSPSR_RW_Msk)); +} + +/** + * @brief + * @rmtoll MSPSR BF FL_I2C_Master_GetBuffStatus + * @param I2Cx I2C instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_I2C_MSP_DATA_BUFF_STATUS_FULL + * @arg @ref FL_I2C_MSP_DATA_BUFF_STATUS_EMPTY + */ +__STATIC_INLINE uint32_t FL_I2C_Master_GetBuffStatus(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPSR, I2C_MSPSR_BF_Msk)); +} + +/** + * @brief + * @rmtoll MSPSR ACKMO FL_I2C_Master_SetRespond + * @param I2Cx I2C instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_I2C_MASTER_RESPOND_ACK + * @arg @ref FL_I2C_MASTER_RESPOND_NACK + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_SetRespond(I2C_Type *I2Cx, uint32_t mode) +{ + MODIFY_REG(I2Cx->MSPSR, I2C_MSPSR_ACKMO_Msk, mode); +} + +/** + * @brief + * @rmtoll MSPSR ACKMO FL_I2C_Master_GetRespond + * @param I2Cx I2C instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_I2C_MASTER_RESPOND_ACK + * @arg @ref FL_I2C_MASTER_RESPOND_NACK + */ +__STATIC_INLINE uint32_t FL_I2C_Master_GetRespond(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPSR, I2C_MSPSR_ACKMO_Msk)); +} + +/** + * @brief + * @rmtoll MSPBGR MSPBGRH FL_I2C_Master_WriteSCLHighWidth + * @param I2Cx I2C instance + * @param width + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_WriteSCLHighWidth(I2C_Type *I2Cx, uint32_t width) +{ + MODIFY_REG(I2Cx->MSPBGR, (0x1ffU << 16U), (width << 16U)); +} + +/** + * @brief + * @rmtoll MSPBGR MSPBGRH FL_I2C_Master_ReadSCLHighWidth + * @param I2Cx I2C instance + * @retval + */ +__STATIC_INLINE uint32_t FL_I2C_Master_ReadSCLHighWidth(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPBGR, (0x1ffU << 16U)) >> 16U); +} + +/** + * @brief + * @rmtoll MSPBGR MSPBGRL FL_I2C_Master_WriteSCLLowWidth + * @param I2Cx I2C instance + * @param width + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_WriteSCLLowWidth(I2C_Type *I2Cx, uint32_t width) +{ + MODIFY_REG(I2Cx->MSPBGR, (0x1ffU << 0U), (width << 0U)); +} + +/** + * @brief + * @rmtoll MSPBGR MSPBGRL FL_I2C_Master_ReadSCLLowWidth + * @param I2Cx I2C instance + * @retval + */ +__STATIC_INLINE uint32_t FL_I2C_Master_ReadSCLLowWidth(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPBGR, (0x1ffU << 0U)) >> 0U); +} + +/** + * @brief + * @rmtoll MSPBUF MSPBUF FL_I2C_Master_WriteTXBuff + * @param I2Cx I2C instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_WriteTXBuff(I2C_Type *I2Cx, uint32_t data) +{ + MODIFY_REG(I2Cx->MSPBUF, (0xffU << 0U), (data << 0U)); +} + +/** + * @brief + * @rmtoll MSPBUF MSPBUF FL_I2C_Master_ReadRXBuff + * @param I2Cx I2C instance + * @retval + */ +__STATIC_INLINE uint32_t FL_I2C_Master_ReadRXBuff(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPBUF, 0xffU) >> 0U); +} + +/** + * @brief + * @rmtoll MSPTCR SDAHD FL_I2C_Master_WriteSDAHoldTime + * @param I2Cx I2C instance + * @param time + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_WriteSDAHoldTime(I2C_Type *I2Cx, uint32_t time) +{ + MODIFY_REG(I2Cx->MSPTCR, (0x1ffU << 0U), (time << 0U)); +} + +/** + * @brief + * @rmtoll MSPTCR SDAHD FL_I2C_Master_ReadSDAHoldTime + * @param I2Cx I2C instance + * @retval + */ +__STATIC_INLINE uint32_t FL_I2C_Master_ReadSDAHoldTime(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPTCR, 0x1ffU) >> 0U); +} + +/** + * @brief + * @rmtoll MSPTOR TIMEOUT FL_I2C_Master_WriteSlaveSCLTimeout + * @param I2Cx I2C instance + * @param time + * @retval None + */ +__STATIC_INLINE void FL_I2C_Master_WriteSlaveSCLTimeout(I2C_Type *I2Cx, uint32_t time) +{ + MODIFY_REG(I2Cx->MSPTOR, (0xfffU << 0U), (time << 0U)); +} + +/** + * @brief + * @rmtoll MSPTOR TIMEOUT FL_I2C_Master_ReadSlaveSCLTimeout + * @param I2Cx I2C instance + * @retval + */ +__STATIC_INLINE uint32_t FL_I2C_Master_ReadSlaveSCLTimeout(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->MSPTOR, 0xfffU) >> 0U); +} + +/** + * @brief + * @rmtoll SSPCR SCLSEN FL_I2C_Slave_EnableSCLStretching + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableSCLStretching(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPCR, I2C_SSPCR_SCLSEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR SCLSEN FL_I2C_Slave_IsEnabledSCLStretching + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledSCLStretching(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPCR, I2C_SSPCR_SCLSEN_Msk) == I2C_SSPCR_SCLSEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR SCLSEN FL_I2C_Slave_DisableSCLStretching + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableSCLStretching(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPCR, I2C_SSPCR_SCLSEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR DMAEN FL_I2C_Slave_EnableDMAReq + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableDMAReq(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPCR, I2C_SSPCR_DMAEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR DMAEN FL_I2C_Slave_IsEnabledDMAReq + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledDMAReq(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPCR, I2C_SSPCR_DMAEN_Msk) == I2C_SSPCR_DMAEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR DMAEN FL_I2C_Slave_DisableDMAReq + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableDMAReq(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPCR, I2C_SSPCR_DMAEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR ACKEN FL_I2C_Slave_EnableACK + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableACK(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPCR, I2C_SSPCR_ACKEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR ACKEN FL_I2C_Slave_IsEnabledACK + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledACK(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPCR, I2C_SSPCR_ACKEN_Msk) == I2C_SSPCR_ACKEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR ACKEN FL_I2C_Slave_DisableACK + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableACK(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPCR, I2C_SSPCR_ACKEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR SDAO_DLYEN FL_I2C_Slave_EnableSDAStretching + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableSDAStretching(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPCR, I2C_SSPCR_SDAO_DLYEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR SDAO_DLYEN FL_I2C_Slave_IsEnabledSDAStretching + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledSDAStretching(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPCR, I2C_SSPCR_SDAO_DLYEN_Msk) == I2C_SSPCR_SDAO_DLYEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR SDAO_DLYEN FL_I2C_Slave_DisableSDAStretching + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableSDAStretching(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPCR, I2C_SSPCR_SDAO_DLYEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR SCLI_ANFEN FL_I2C_Slave_EnableSCLAnalogFilter + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableSCLAnalogFilter(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPCR, I2C_SSPCR_SCLI_ANFEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR SCLI_ANFEN FL_I2C_Slave_IsEnabledSCLAnalogFilter + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledSCLAnalogFilter(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPCR, I2C_SSPCR_SCLI_ANFEN_Msk) == I2C_SSPCR_SCLI_ANFEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR SCLI_ANFEN FL_I2C_Slave_DisableSCLAnalogFilter + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableSCLAnalogFilter(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPCR, I2C_SSPCR_SCLI_ANFEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR A10EN FL_I2C_Slave_Enable10BitAddress + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_Enable10BitAddress(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPCR, I2C_SSPCR_A10EN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR A10EN FL_I2C_Slave_IsEnabled10BitAddress + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabled10BitAddress(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPCR, I2C_SSPCR_A10EN_Msk) == I2C_SSPCR_A10EN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR A10EN FL_I2C_Slave_Disable10BitAddress + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_Disable10BitAddress(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPCR, I2C_SSPCR_A10EN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR SSPEN FL_I2C_Slave_Enable + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_Enable(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPCR, I2C_SSPCR_SSPEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR SSPEN FL_I2C_Slave_IsEnabled + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabled(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPCR, I2C_SSPCR_SSPEN_Msk) == I2C_SSPCR_SSPEN_Msk); +} + +/** + * @brief + * @rmtoll SSPCR SSPEN FL_I2C_Slave_Disable + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_Disable(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPCR, I2C_SSPCR_SSPEN_Msk); +} + +/** + * @brief + * @rmtoll SSPIER ADEIE FL_I2C_Slave_EnableIT_AddressError + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableIT_AddressError(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPIER, I2C_SSPIER_ADEIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER ADEIE FL_I2C_Slave_IsEnabledIT_AddressError + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledIT_AddressError(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPIER, I2C_SSPIER_ADEIE_Msk) == I2C_SSPIER_ADEIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER ADEIE FL_I2C_Slave_DisableIT_AddressError + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableIT_AddressError(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPIER, I2C_SSPIER_ADEIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER SIE FL_I2C_Slave_EnableIT_Start + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableIT_Start(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPIER, I2C_SSPIER_SIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER SIE FL_I2C_Slave_IsEnabledIT_Start + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledIT_Start(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPIER, I2C_SSPIER_SIE_Msk) == I2C_SSPIER_SIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER SIE FL_I2C_Slave_DisableIT_Start + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableIT_Start(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPIER, I2C_SSPIER_SIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER PIE FL_I2C_Slave_EnableIT_Stop + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableIT_Stop(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPIER, I2C_SSPIER_PIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER PIE FL_I2C_Slave_IsEnabledIT_Stop + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledIT_Stop(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPIER, I2C_SSPIER_PIE_Msk) == I2C_SSPIER_PIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER PIE FL_I2C_Slave_DisableIT_Stop + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableIT_Stop(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPIER, I2C_SSPIER_PIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER WCOLIE FL_I2C_Slave_EnableIT_WriteConflict + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableIT_WriteConflict(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPIER, I2C_SSPIER_WCOLIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER WCOLIE FL_I2C_Slave_IsEnabledIT_WriteConflict + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledIT_WriteConflict(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPIER, I2C_SSPIER_WCOLIE_Msk) == I2C_SSPIER_WCOLIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER WCOLIE FL_I2C_Slave_DisableIT_WriteConflict + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableIT_WriteConflict(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPIER, I2C_SSPIER_WCOLIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER SSPOVIE FL_I2C_Slave_EnableIT_BuffOverflow + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableIT_BuffOverflow(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPIER, I2C_SSPIER_SSPOVIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER SSPOVIE FL_I2C_Slave_IsEnabledIT_BuffOverflow + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledIT_BuffOverflow(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPIER, I2C_SSPIER_SSPOVIE_Msk) == I2C_SSPIER_SSPOVIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER SSPOVIE FL_I2C_Slave_DisableIT_BuffOverflow + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableIT_BuffOverflow(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPIER, I2C_SSPIER_SSPOVIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER ADMIE FL_I2C_Slave_EnableIT_AddressMatch + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableIT_AddressMatch(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPIER, I2C_SSPIER_ADMIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER ADMIE FL_I2C_Slave_IsEnabledIT_AddressMatch + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledIT_AddressMatch(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPIER, I2C_SSPIER_ADMIE_Msk) == I2C_SSPIER_ADMIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER ADMIE FL_I2C_Slave_DisableIT_AddressMatch + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableIT_AddressMatch(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPIER, I2C_SSPIER_ADMIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER TXIE FL_I2C_Slave_EnableIT_TXComplete + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableIT_TXComplete(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPIER, I2C_SSPIER_TXIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER TXIE FL_I2C_Slave_IsEnabledIT_TXComplete + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledIT_TXComplete(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPIER, I2C_SSPIER_TXIE_Msk) == I2C_SSPIER_TXIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER TXIE FL_I2C_Slave_DisableIT_TXComplete + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableIT_TXComplete(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPIER, I2C_SSPIER_TXIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER RXIE FL_I2C_Slave_EnableIT_RXComplete + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_EnableIT_RXComplete(I2C_Type *I2Cx) +{ + SET_BIT(I2Cx->SSPIER, I2C_SSPIER_RXIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER RXIE FL_I2C_Slave_IsEnabledIT_RXComplete + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsEnabledIT_RXComplete(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPIER, I2C_SSPIER_RXIE_Msk) == I2C_SSPIER_RXIE_Msk); +} + +/** + * @brief + * @rmtoll SSPIER RXIE FL_I2C_Slave_DisableIT_RXComplete + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_DisableIT_RXComplete(I2C_Type *I2Cx) +{ + CLEAR_BIT(I2Cx->SSPIER, I2C_SSPIER_RXIE_Msk); +} + +/** + * @brief + * @rmtoll SSPISR ADE FL_I2C_Slave_IsActiveFlag_AddressError + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsActiveFlag_AddressError(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPISR, I2C_SSPISR_ADE_Msk) == (I2C_SSPISR_ADE_Msk)); +} + +/** + * @brief + * @rmtoll SSPISR ADE FL_I2C_Slave_ClearFlag_AddressError + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_ClearFlag_AddressError(I2C_Type *I2Cx) +{ + WRITE_REG(I2Cx->SSPISR, I2C_SSPISR_ADE_Msk); +} + +/** + * @brief + * @rmtoll SSPISR S FL_I2C_Slave_IsActiveFlag_Start + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsActiveFlag_Start(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPISR, I2C_SSPISR_S_Msk) == (I2C_SSPISR_S_Msk)); +} + +/** + * @brief + * @rmtoll SSPISR P FL_I2C_Slave_IsActiveFlag_Stop + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsActiveFlag_Stop(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPISR, I2C_SSPISR_P_Msk) == (I2C_SSPISR_P_Msk)); +} + +/** + * @brief + * @rmtoll SSPISR WCOL FL_I2C_Slave_IsActiveFlag_WriteConflict + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsActiveFlag_WriteConflict(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPISR, I2C_SSPISR_WCOL_Msk) == (I2C_SSPISR_WCOL_Msk)); +} + +/** + * @brief + * @rmtoll SSPISR WCOL FL_I2C_Slave_ClearFlag_WriteConflict + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_ClearFlag_WriteConflict(I2C_Type *I2Cx) +{ + WRITE_REG(I2Cx->SSPISR, I2C_SSPISR_WCOL_Msk); +} + +/** + * @brief + * @rmtoll SSPISR SSPOV FL_I2C_Slave_IsActiveFlag_BuffOverflow + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsActiveFlag_BuffOverflow(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPISR, I2C_SSPISR_SSPOV_Msk) == (I2C_SSPISR_SSPOV_Msk)); +} + +/** + * @brief + * @rmtoll SSPISR SSPOV FL_I2C_Slave_ClearFlag_BuffOverflow + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_ClearFlag_BuffOverflow(I2C_Type *I2Cx) +{ + WRITE_REG(I2Cx->SSPISR, I2C_SSPISR_SSPOV_Msk); +} + +/** + * @brief + * @rmtoll SSPISR ADM FL_I2C_Slave_IsActiveFlag_AddressMatch + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsActiveFlag_AddressMatch(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPISR, I2C_SSPISR_ADM_Msk) == (I2C_SSPISR_ADM_Msk)); +} + +/** + * @brief + * @rmtoll SSPISR ADM FL_I2C_Slave_ClearFlag_AddressMatch + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_ClearFlag_AddressMatch(I2C_Type *I2Cx) +{ + WRITE_REG(I2Cx->SSPISR, I2C_SSPISR_ADM_Msk); +} + +/** + * @brief + * @rmtoll SSPISR TXIF FL_I2C_Slave_IsActiveFlag_TXComplete + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsActiveFlag_TXComplete(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPISR, I2C_SSPISR_TXIF_Msk) == (I2C_SSPISR_TXIF_Msk)); +} + +/** + * @brief + * @rmtoll SSPISR TXIF FL_I2C_Slave_ClearFlag_TXComplete + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_ClearFlag_TXComplete(I2C_Type *I2Cx) +{ + WRITE_REG(I2Cx->SSPISR, I2C_SSPISR_TXIF_Msk); +} + +/** + * @brief + * @rmtoll SSPISR RXIF FL_I2C_Slave_IsActiveFlag_RXComplete + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsActiveFlag_RXComplete(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPISR, I2C_SSPISR_RXIF_Msk) == (I2C_SSPISR_RXIF_Msk)); +} + +/** + * @brief + * @rmtoll SSPISR RXIF FL_I2C_Slave_ClearFlag_RXComplete + * @param I2Cx I2C instance + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_ClearFlag_RXComplete(I2C_Type *I2Cx) +{ + WRITE_REG(I2Cx->SSPISR, I2C_SSPISR_RXIF_Msk); +} + +/** + * @brief + * @rmtoll SSPSR BUSY FL_I2C_Slave_IsActiveFlag_Busy + * @param I2Cx I2C instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_IsActiveFlag_Busy(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPSR, I2C_SSPSR_BUSY_Msk) == (I2C_SSPSR_BUSY_Msk)); +} + +/** + * @brief + * @rmtoll SSPSR RW FL_I2C_Slave_GetDataDirection + * @param I2Cx I2C instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_I2C_SSP_DATA_DIRECTION_SLAVE_TO_MASTER + * @arg @ref FL_I2C_SSP_DATA_DIRECTION_MASTER_TO_SLAVE + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_GetDataDirection(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPSR, I2C_SSPSR_RW_Msk)); +} + +/** + * @brief + * @rmtoll SSPSR DA FL_I2C_Slave_GetDataType + * @param I2Cx I2C instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_I2C_SSP_DATA_TYPE_DATA + * @arg @ref FL_I2C_SSP_DATA_TYPE_ADDR + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_GetDataType(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPSR, I2C_SSPSR_DA_Msk)); +} + +/** + * @brief + * @rmtoll SSPSR BF FL_I2C_Slave_GetBuffStatus + * @param I2Cx I2C instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_I2C_SSP_DATA_BUFF_STATUS_FULL + * @arg @ref FL_I2C_SSP_DATA_BUFF_STATUS_EMPTY + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_GetBuffStatus(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPSR, I2C_SSPSR_BF_Msk)); +} + +/** + * @brief + * @rmtoll SSPBUF FL_I2C_Slave_WriteTXBuff + * @param I2Cx I2C instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_WriteTXBuff(I2C_Type *I2Cx, uint32_t data) +{ + MODIFY_REG(I2Cx->SSPBUF, (0xffU << 0U), (data << 0U)); +} + +/** + * @brief + * @rmtoll SSPBUF FL_I2C_Slave_ReadRXBuff + * @param I2Cx I2C instance + * @retval + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_ReadRXBuff(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPBUF, 0xffU) >> 0U); +} + +/** + * @brief + * @rmtoll SSPADR FL_I2C_Slave_WriteSlaveAddress + * @param I2Cx I2C instance + * @param address + * @retval None + */ +__STATIC_INLINE void FL_I2C_Slave_WriteSlaveAddress(I2C_Type *I2Cx, uint32_t address) +{ + MODIFY_REG(I2Cx->SSPADR, (0x3ffU << 0U), (address << 0U)); +} + +/** + * @brief + * @rmtoll SSPADR FL_I2C_Slave_ReadSlaveAddress + * @param I2Cx I2C instance + * @retval + */ +__STATIC_INLINE uint32_t FL_I2C_Slave_ReadSlaveAddress(I2C_Type *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->SSPADR, 0x3ffU) >> 0U); +} + +/** + * @} + */ + +/** @defgroup I2C_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_I2C_DeInit(I2C_Type *I2Cx); +void FL_I2C_SlaveMode_StructInit(FL_I2C_SlaveMode_InitTypeDef *I2C_InitStruct); +void FL_I2C_MasterMode_StructInit(FL_I2C_MasterMode_InitTypeDef *I2C_InitStruct); +FL_ErrorStatus FL_I2C_SlaveMode_Init(I2C_Type *I2cx, FL_I2C_SlaveMode_InitTypeDef *I2C_InitStruct); +FL_ErrorStatus FL_I2C_MasterMode_Init(I2C_Type *I2Cx, FL_I2C_MasterMode_InitTypeDef *I2C_InitStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_I2C_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-27*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_iwdt.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_iwdt.h new file mode 100644 index 0000000..d41c7fb --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_iwdt.h @@ -0,0 +1,348 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_iwdt.h + * @author FMSH Application Team + * @brief Head file of IWDT FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_IWDT_H +#define __FM33LG0XX_FL_IWDT_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup IWDT IWDT + * @brief IWDT FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup IWDT_FL_ES_INIT IWDT Exported Init structures + * @{ + */ + +/** + * @brief FL IWDT Init Sturcture definition + */ +typedef struct +{ + /* 看门狗溢出时间 */ + uint32_t overflowPeriod; + /* 清狗窗口 */ + uint32_t iwdtWindows; + +} FL_IWDT_InitTypeDef; +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup IWDT_FL_Exported_Constants IWDT Exported Constants + * @{ + */ + +#define IWDT_RELOAD_KEY (0x12345A5AUL) + +#define IWDT_CR_FREEZE_Pos (11U) +#define IWDT_CR_FREEZE_Msk (0x1U << IWDT_CR_FREEZE_Pos) +#define IWDT_CR_FREEZE IWDT_CR_FREEZE_Msk + +#define IWDT_CR_CFG_Pos (0U) +#define IWDT_CR_CFG_Msk (0x7U << IWDT_CR_CFG_Pos) +#define IWDT_CR_CFG IWDT_CR_CFG_Msk + +#define IWDT_IER_IE_Pos (0U) +#define IWDT_IER_IE_Msk (0x1U << IWDT_IER_IE_Pos) +#define IWDT_IER_IE IWDT_IER_IE_Msk + +#define IWDT_ISR_WINF_Pos (0U) +#define IWDT_ISR_WINF_Msk (0x1U << IWDT_ISR_WINF_Pos) +#define IWDT_ISR_WINF IWDT_ISR_WINF_Msk + + + + + + +#define FL_IWDT_PERIOD_125MS (0x0U << IWDT_CR_CFG_Pos) +#define FL_IWDT_PERIOD_250MS (0x1U << IWDT_CR_CFG_Pos) +#define FL_IWDT_PERIOD_500MS (0x2U << IWDT_CR_CFG_Pos) +#define FL_IWDT_PERIOD_1000MS (0x3U << IWDT_CR_CFG_Pos) +#define FL_IWDT_PERIOD_2000MS (0x4U << IWDT_CR_CFG_Pos) +#define FL_IWDT_PERIOD_4000MS (0x5U << IWDT_CR_CFG_Pos) +#define FL_IWDT_PERIOD_8000MS (0x6U << IWDT_CR_CFG_Pos) +#define FL_IWDT_PERIOD_16000MS (0x7U << IWDT_CR_CFG_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup IWDT_FL_Exported_Functions IWDT Exported Functions + * @{ + */ + +/** + * @brief Set IWDT service register + * @rmtoll SERV FL_IWDT_ReloadCounter + * @param IWDTx IWDT instance + * @retval None + */ +__STATIC_INLINE void FL_IWDT_ReloadCounter(IWDT_Type *IWDTx) +{ + volatile uint32_t val = 0; + IWDTx->SERV = IWDT_RELOAD_KEY; + val = READ_REG(IWDTx->SERV); +} + +/** + * @brief Set freeze in sleep enable + * @rmtoll CR FREEZE FL_IWDT_EnableFreezeWhileSleep + * @param IWDTx IWDT instance + * @retval None + */ +__STATIC_INLINE void FL_IWDT_EnableFreezeWhileSleep(IWDT_Type *IWDTx) +{ + volatile uint32_t val = 0; + SET_BIT(IWDTx->CR, IWDT_CR_FREEZE_Msk); + val = READ_REG(IWDTx->SERV); +} + +/** + * @brief Set freeze in sleep disable + * @rmtoll CR FREEZE FL_IWDT_DisableFreezeWhileSleep + * @param IWDTx IWDT instance + * @retval None + */ +__STATIC_INLINE void FL_IWDT_DisableFreezeWhileSleep(IWDT_Type *IWDTx) +{ + volatile uint32_t val = 0; + CLEAR_BIT(IWDTx->CR, IWDT_CR_FREEZE_Msk); + val = READ_REG(IWDTx->SERV); +} + +/** + * @brief Get freeze in sleep enable status + * @rmtoll CR FREEZE FL_IWDT_IsEnabledFreezeWhileSleep + * @param IWDTx IWDT instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_IWDT_IsEnabledFreezeWhileSleep(IWDT_Type *IWDTx) +{ + volatile uint32_t val = 0; + uint32_t temp; + temp = (uint32_t)(READ_BIT(IWDTx->CR, IWDT_CR_FREEZE_Msk) == IWDT_CR_FREEZE_Msk); + val = READ_REG(IWDTx->SERV); + return temp; +} + +/** + * @brief Set IWDT overflow period + * @rmtoll CR CFG FL_IWDT_SetPeriod + * @param IWDTx IWDT instance + * @param period This parameter can be one of the following values: + * @arg @ref FL_IWDT_PERIOD_125MS + * @arg @ref FL_IWDT_PERIOD_250MS + * @arg @ref FL_IWDT_PERIOD_500MS + * @arg @ref FL_IWDT_PERIOD_1000MS + * @arg @ref FL_IWDT_PERIOD_2000MS + * @arg @ref FL_IWDT_PERIOD_4000MS + * @arg @ref FL_IWDT_PERIOD_8000MS + * @arg @ref FL_IWDT_PERIOD_16000MS + * @retval None + */ +__STATIC_INLINE void FL_IWDT_SetPeriod(IWDT_Type *IWDTx, uint32_t period) +{ + volatile uint32_t val = 0; + MODIFY_REG(IWDTx->CR, IWDT_CR_CFG_Msk, period); + val = READ_REG(IWDTx->SERV); +} + +/** + * @brief Get IWDT overflow period + * @rmtoll CR CFG FL_IWDT_GetPeriod + * @param IWDTx IWDT instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_IWDT_PERIOD_125MS + * @arg @ref FL_IWDT_PERIOD_250MS + * @arg @ref FL_IWDT_PERIOD_500MS + * @arg @ref FL_IWDT_PERIOD_1000MS + * @arg @ref FL_IWDT_PERIOD_2000MS + * @arg @ref FL_IWDT_PERIOD_4000MS + * @arg @ref FL_IWDT_PERIOD_8000MS + * @arg @ref FL_IWDT_PERIOD_16000MS + */ +__STATIC_INLINE uint32_t FL_IWDT_GetPeriod(IWDT_Type *IWDTx) +{ + volatile uint32_t val = 0; + uint32_t temp; + temp = (uint32_t)(READ_BIT(IWDTx->CR, IWDT_CR_CFG_Msk)); + val = READ_REG(IWDTx->SERV); + return temp; +} + +/** + * @brief Get IWDT current counter value + * @rmtoll CNT FL_IWDT_ReadCounter + * @param IWDTx IWDT instance + * @retval + */ +__STATIC_INLINE uint32_t FL_IWDT_ReadCounter(IWDT_Type *IWDTx) +{ + volatile uint32_t val = 0; + uint32_t temp; + temp = (uint32_t)(READ_BIT(IWDTx->CNT, (0xfffU << 0U)) >> 0U); + val = READ_REG(IWDTx->SERV); + return temp; +} + +/** + * @brief Set IWDT window register + * @rmtoll WIN FL_IWDT_WriteWindow + * @param IWDTx IWDT instance + * @param value + * @retval None + */ +__STATIC_INLINE void FL_IWDT_WriteWindow(IWDT_Type *IWDTx, uint32_t value) +{ + volatile uint32_t val = 0; + IWDTx->WIN = (value & 0xFFF); + val = READ_REG(IWDTx->SERV); +} + +/** + * @brief Get IWDT window register + * @rmtoll WIN FL_IWDT_ReadWindow + * @param IWDTx IWDT instance + * @retval + */ +__STATIC_INLINE uint32_t FL_IWDT_ReadWindow(IWDT_Type *IWDTx) +{ + volatile uint32_t val = 0; + uint32_t temp; + temp = (uint32_t)(READ_BIT(IWDTx->WIN, (0xfffU << 0U)) >> 0U); + val = READ_REG(IWDTx->SERV); + return temp; +} + +/** + * @brief IWDT interrupt enable + * @rmtoll IER IE FL_IWDT_EnableIT_EnterWindow + * @param IWDTx IWDT instance + * @retval None + */ +__STATIC_INLINE void FL_IWDT_EnableIT_EnterWindow(IWDT_Type *IWDTx) +{ + volatile uint32_t val = 0; + IWDTx->IER = FL_ENABLE; + val = READ_REG(IWDTx->SERV); +} + +/** + * @brief IWDT interrupt disable + * @rmtoll IER IE FL_IWDT_DisableIT_EnterWindow + * @param IWDTx IWDT instance + * @retval None + */ +__STATIC_INLINE void FL_IWDT_DisableIT_EnterWindow(IWDT_Type *IWDTx) +{ + volatile uint32_t val = 0; + IWDTx->IER = FL_DISABLE; + val = READ_REG(IWDTx->SERV); +} + +/** + * @brief Get IWDT interrupt enable status + * @rmtoll IER IE FL_IWDT_IsEnabledIT_EnterWindow + * @param IWDTx IWDT instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_IWDT_IsEnabledIT_EnterWindow(IWDT_Type *IWDTx) +{ + volatile uint32_t val = 0; + uint32_t temp; + temp = (uint32_t)(READ_BIT(IWDTx->IER, IWDT_IER_IE_Msk) == IWDT_IER_IE_Msk); + val = READ_REG(IWDTx->SERV); + return temp; +} + +/** + * @brief Get IWDT window interrupt flag + * @rmtoll ISR WINF FL_IWDT_IsActiveFlag_EnterWindow + * @param IWDTx IWDT instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_IWDT_IsActiveFlag_EnterWindow(IWDT_Type *IWDTx) +{ + volatile uint32_t val = 0; + uint32_t temp; + temp = (uint32_t)(READ_BIT(IWDTx->ISR, IWDT_ISR_WINF_Msk)); + val = READ_REG(IWDTx->SERV); + return temp; +} + +/** + * @brief Clear IWDT window interrupt flag + * @rmtoll ISR WINF FL_IWDT_ClearFlag_EnterWindow + * @param IWDTx IWDT instance + * @retval None + */ +__STATIC_INLINE void FL_IWDT_ClearFlag_EnterWindow(IWDT_Type *IWDTx) +{ + volatile uint32_t val = 0; + IWDTx->ISR = IWDT_ISR_WINF_Msk; + val = READ_REG(IWDTx->SERV); +} + +/** + * @} + */ + +/** @defgroup IWDT_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_IWDT_DeInit(IWDT_Type *IWDTx); +void FL_IWDT_StructInit(FL_IWDT_InitTypeDef *IWDT_InitStruct); +FL_ErrorStatus FL_IWDT_Init(IWDT_Type *IWDTx, FL_IWDT_InitTypeDef *IWDT_InitStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_IWDT_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-14*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lcd.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lcd.h new file mode 100644 index 0000000..4797082 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lcd.h @@ -0,0 +1,1192 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_lcd.h + * @author FMSH Application Team + * @brief Head file of LCD FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_LCD_H +#define __FM33LG0XX_FL_LCD_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup LCD LCD + * @brief LCD FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup LCD_FL_ES_INIT LCD Exported Init structures + * @{ + */ + +/** + * @brief FL LCD Init Sturcture definition + */ +typedef struct +{ + /*! 电流源大小控制 */ + uint32_t biasCurrent; + /*! 驱动模式 */ + uint32_t mode; + /*! 偏执电平 */ + uint32_t biasVoltage; + /*! 偏执类型 */ + uint32_t biasMode; + /*! 驱动波形 */ + uint32_t waveform; + /*! COM数目 */ + uint32_t COMxNum; + /*! 显示频率 */ + uint32_t displayFreq; + /*! 显示闪烁点亮时间(ms) */ + uint32_t flickOnTime; + /*! 显示闪烁熄灭时间(ms) */ + uint32_t flickOffTime; +} FL_LCD_InitTypeDef; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup LCD_FL_Exported_Constants LCD Exported Constants + * @{ + */ + +#define LCD_CR_SCFSEL_Pos (20U) +#define LCD_CR_SCFSEL_Msk (0x7U << LCD_CR_SCFSEL_Pos) +#define LCD_CR_SCFSEL LCD_CR_SCFSEL_Msk + +#define LCD_CR_SC_CTRL_Pos (18U) +#define LCD_CR_SC_CTRL_Msk (0x3U << LCD_CR_SC_CTRL_Pos) +#define LCD_CR_SC_CTRL LCD_CR_SC_CTRL_Msk + +#define LCD_CR_IC_CTRL_Pos (16U) +#define LCD_CR_IC_CTRL_Msk (0x3U << LCD_CR_IC_CTRL_Pos) +#define LCD_CR_IC_CTRL LCD_CR_IC_CTRL_Msk + +#define LCD_CR_ENMODE_Pos (15U) +#define LCD_CR_ENMODE_Msk (0x1U << LCD_CR_ENMODE_Pos) +#define LCD_CR_ENMODE LCD_CR_ENMODE_Msk + +#define LCD_CR_FLICK_Pos (14U) +#define LCD_CR_FLICK_Msk (0x1U << LCD_CR_FLICK_Pos) +#define LCD_CR_FLICK LCD_CR_FLICK_Msk + +#define LCD_CR_BIAS_Pos (8U) +#define LCD_CR_BIAS_Msk (0xfU << LCD_CR_BIAS_Pos) +#define LCD_CR_BIAS LCD_CR_BIAS_Msk + +#define LCD_CR_BIASMD_Pos (5U) +#define LCD_CR_BIASMD_Msk (0x1U << LCD_CR_BIASMD_Pos) +#define LCD_CR_BIASMD LCD_CR_BIASMD_Msk + +#define LCD_CR_ANTIPOLAR_Pos (4U) +#define LCD_CR_ANTIPOLAR_Msk (0x1U << LCD_CR_ANTIPOLAR_Pos) +#define LCD_CR_ANTIPOLAR LCD_CR_ANTIPOLAR_Msk + +#define LCD_CR_WFT_Pos (3U) +#define LCD_CR_WFT_Msk (0x1U << LCD_CR_WFT_Pos) +#define LCD_CR_WFT LCD_CR_WFT_Msk + +#define LCD_CR_LMUX_Pos (1U) +#define LCD_CR_LMUX_Msk (0x3U << LCD_CR_LMUX_Pos) +#define LCD_CR_LMUX LCD_CR_LMUX_Msk + +#define LCD_CR_EN_Pos (0U) +#define LCD_CR_EN_Msk (0x1U << LCD_CR_EN_Pos) +#define LCD_CR_EN LCD_CR_EN_Msk + +#define LCD_FCR_DF_Pos (0U) +#define LCD_FCR_DF_Msk (0xffU << LCD_FCR_DF_Pos) +#define LCD_FCR_DF LCD_FCR_DF_Msk + +#define LCD_FLKT_TOFF_Pos (8U) +#define LCD_FLKT_TOFF_Msk (0xffU << LCD_FLKT_TOFF_Pos) +#define LCD_FLKT_TOFF LCD_FLKT_TOFF_Msk + +#define LCD_FLKT_TON_Pos (0U) +#define LCD_FLKT_TON_Msk (0xffU << LCD_FLKT_TON_Pos) +#define LCD_FLKT_TON LCD_FLKT_TON_Msk + +#define LCD_IER_DONIE_Pos (1U) +#define LCD_IER_DONIE_Msk (0x1U << LCD_IER_DONIE_Pos) +#define LCD_IER_DONIE LCD_IER_DONIE_Msk + +#define LCD_IER_DOFFIE_Pos (0U) +#define LCD_IER_DOFFIE_Msk (0x1U << LCD_IER_DOFFIE_Pos) +#define LCD_IER_DOFFIE LCD_IER_DOFFIE_Msk + +#define LCD_ISR_DONIF_Pos (1U) +#define LCD_ISR_DONIF_Msk (0x1U << LCD_ISR_DONIF_Pos) +#define LCD_ISR_DONIF LCD_ISR_DONIF_Msk + +#define LCD_ISR_DOFFIF_Pos (0U) +#define LCD_ISR_DOFFIF_Msk (0x1U << LCD_ISR_DOFFIF_Pos) +#define LCD_ISR_DOFFIF LCD_ISR_DOFFIF_Msk + +#define LCD_DATA0_DSDA_Pos (0U) +#define LCD_DATA0_DSDA_Msk (0xffffffffU << LCD_DATA0_DSDA_Pos) +#define LCD_DATA0_DSDA LCD_DATA0_DSDA_Msk + + + +#define FL_LCD_DATA_REG0 (0x0U << 0U) +#define FL_LCD_DATA_REG1 (0x1U << 0U) +#define FL_LCD_DATA_REG2 (0x2U << 0U) +#define FL_LCD_DATA_REG3 (0x3U << 0U) +#define FL_LCD_DATA_REG4 (0x4U << 0U) +#define FL_LCD_DATA_REG5 (0x5U << 0U) +#define FL_LCD_DATA_REG6 (0x6U << 0U) +#define FL_LCD_DATA_REG7 (0x7U << 0U) +#define FL_LCD_DATA_REG8 (0x8U << 0U) +#define FL_LCD_DATA_REG9 (0x9U << 0U) +#define FL_LCD_COMEN_COM0 (0x1U << 0U) +#define FL_LCD_COMEN_COM1 (0x1U << 1U) +#define FL_LCD_COMEN_COM2 (0x1U << 2U) +#define FL_LCD_COMEN_COM3 (0x1U << 3U) +#define FL_LCD_COMEN_COM4 (0x1U << 28U) +#define FL_LCD_COMEN_COM5 (0x1U << 29U) +#define FL_LCD_COMEN_COM6 (0x1U << 30U) +#define FL_LCD_COMEN_COM7 (0x1U << 31U) +#define FL_LCD_SEGEN0_SEG0 (0x1U << 0U) +#define FL_LCD_SEGEN0_SEG1 (0x1U << 1U) +#define FL_LCD_SEGEN0_SEG2 (0x1U << 2U) +#define FL_LCD_SEGEN0_SEG3 (0x1U << 3U) +#define FL_LCD_SEGEN0_SEG4 (0x1U << 4U) +#define FL_LCD_SEGEN0_SEG5 (0x1U << 5U) +#define FL_LCD_SEGEN0_SEG6 (0x1U << 6U) +#define FL_LCD_SEGEN0_SEG7 (0x1U << 7U) +#define FL_LCD_SEGEN0_SEG8 (0x1U << 8U) +#define FL_LCD_SEGEN0_SEG9 (0x1U << 9U) +#define FL_LCD_SEGEN0_SEG10 (0x1U << 10U) +#define FL_LCD_SEGEN0_SEG11 (0x1U << 11U) +#define FL_LCD_SEGEN0_SEG12 (0x1U << 12U) +#define FL_LCD_SEGEN0_SEG13 (0x1U << 13U) +#define FL_LCD_SEGEN0_SEG14 (0x1U << 14U) +#define FL_LCD_SEGEN0_SEG15 (0x1U << 15U) +#define FL_LCD_SEGEN0_SEG16 (0x1U << 16U) +#define FL_LCD_SEGEN0_SEG17 (0x1U << 17U) +#define FL_LCD_SEGEN0_SEG18 (0x1U << 18U) +#define FL_LCD_SEGEN0_SEG19 (0x1U << 19U) +#define FL_LCD_SEGEN0_SEG20 (0x1U << 20U) +#define FL_LCD_SEGEN0_SEG21 (0x1U << 21U) +#define FL_LCD_SEGEN0_SEG22 (0x1U << 22U) +#define FL_LCD_SEGEN0_SEG23 (0x1U << 23U) +#define FL_LCD_SEGEN0_SEG24 (0x1U << 24U) +#define FL_LCD_SEGEN0_SEG25 (0x1U << 25U) +#define FL_LCD_SEGEN0_SEG26 (0x1U << 26U) +#define FL_LCD_SEGEN0_SEG27 (0x1U << 27U) +#define FL_LCD_SEGEN0_SEG28 (0x1U << 28U) +#define FL_LCD_SEGEN0_SEG29 (0x1U << 29U) +#define FL_LCD_SEGEN0_SEG30 (0x1U << 30U) +#define FL_LCD_SEGEN0_SEG31 (0x1U << 31U) +#define FL_LCD_SEGEN1_SEG0 (0x1U << 0U) +#define FL_LCD_SEGEN1_SEG1 (0x1U << 1U) +#define FL_LCD_SEGEN1_SEG2 (0x1U << 2U) +#define FL_LCD_SEGEN1_SEG3 (0x1U << 3U) +#define FL_LCD_SEGEN1_SEG4 (0x1U << 4U) +#define FL_LCD_SEGEN1_SEG5 (0x1U << 5U) +#define FL_LCD_SEGEN1_SEG6 (0x1U << 6U) +#define FL_LCD_SEGEN1_SEG7 (0x1U << 7U) +#define FL_LCD_SEGEN1_SEG8 (0x1U << 8U) +#define FL_LCD_SEGEN1_SEG9 (0x1U << 9U) +#define FL_LCD_SEGEN1_SEG10 (0x1U << 10U) +#define FL_LCD_SEGEN1_SEG11 (0x1U << 11U) + + + +#define FL_LCD_CAP_DRIVER_FREQ_FRAME_COM (0x0U << LCD_CR_SCFSEL_Pos) +#define FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV8 (0x1U << LCD_CR_SCFSEL_Pos) +#define FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV16 (0x2U << LCD_CR_SCFSEL_Pos) +#define FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV32 (0x3U << LCD_CR_SCFSEL_Pos) +#define FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV64 (0x4U << LCD_CR_SCFSEL_Pos) +#define FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV128 (0x5U << LCD_CR_SCFSEL_Pos) +#define FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV256 (0x6U << LCD_CR_SCFSEL_Pos) +#define FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV512 (0x7U << LCD_CR_SCFSEL_Pos) + + +#define FL_LCD_CAP_DRIVER_MODE_ONE (0x0U << LCD_CR_SC_CTRL_Pos) +#define FL_LCD_CAP_DRIVER_MODE_TWO (0x1U << LCD_CR_SC_CTRL_Pos) +#define FL_LCD_CAP_DRIVER_MODE_FOUR (0x2U << LCD_CR_SC_CTRL_Pos) +#define FL_LCD_CAP_DRIVER_MODE_MANY (0x3U << LCD_CR_SC_CTRL_Pos) + + +#define FL_LCD_BIAS_CURRENT_VERYHIGH (0x0U << LCD_CR_IC_CTRL_Pos) +#define FL_LCD_BIAS_CURRENT_HIGH (0x1U << LCD_CR_IC_CTRL_Pos) +#define FL_LCD_BIAS_CURRENT_MEDIUM (0x2U << LCD_CR_IC_CTRL_Pos) +#define FL_LCD_BIAS_CURRENT_LOW (0x3U << LCD_CR_IC_CTRL_Pos) + + +#define FL_LCD_DRIVER_MODE_INNER_RESISTER (0x1U << LCD_CR_ENMODE_Pos) +#define FL_LCD_DRIVER_MODE_OUTER_CAPACITY (0x0U << LCD_CR_ENMODE_Pos) + + +#define FL_LCD_BIAS_VOLTAGE_LEVEL0 (0x0U << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL1 (0x1U << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL2 (0x2U << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL3 (0x3U << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL4 (0x4U << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL5 (0x5U << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL6 (0x6U << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL7 (0x7U << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL8 (0x8U << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL9 (0x9U << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL10 (0xaU << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL11 (0xbU << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL12 (0xcU << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL13 (0xdU << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL14 (0xeU << LCD_CR_BIAS_Pos) +#define FL_LCD_BIAS_VOLTAGE_LEVEL15 (0xfU << LCD_CR_BIAS_Pos) + + +#define FL_LCD_BIAS_MODE_4BIAS (0x0U << LCD_CR_BIASMD_Pos) +#define FL_LCD_BIAS_MODE_3BIAS (0x1U << LCD_CR_BIASMD_Pos) + + +#define FL_LCD_ANTIPOLAR_FLOATING (0x0U << LCD_CR_ANTIPOLAR_Pos) +#define FL_LCD_ANTIPOLAR_GND (0x1U << LCD_CR_ANTIPOLAR_Pos) + +#define FL_LCD_WAVEFORM_TYPEA (0x0U << LCD_CR_WFT_Pos) +#define FL_LCD_WAVEFORM_TYPEB (0x1U << LCD_CR_WFT_Pos) + + +#define FL_LCD_COM_NUM_4COM (0x0U << LCD_CR_LMUX_Pos) +#define FL_LCD_COM_NUM_6COM (0x1U << LCD_CR_LMUX_Pos) +#define FL_LCD_COM_NUM_8COM (0x2U << LCD_CR_LMUX_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup LCD_FL_Exported_Functions LCD Exported Functions + * @{ + */ + +/** + * @brief Set Capacity Driver Freq + * @rmtoll CR SCFSEL FL_LCD_SetCapDriverFreq + * @param LCDx LCD instance + * @param freq This parameter can be one of the following values: + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_FRAME_COM + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV8 + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV16 + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV32 + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV64 + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV128 + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV256 + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV512 + * @retval None + */ +__STATIC_INLINE void FL_LCD_SetCapDriverFreq(LCD_Type *LCDx, uint32_t freq) +{ + MODIFY_REG(LCDx->CR, LCD_CR_SCFSEL_Msk, freq); +} + +/** + * @brief Get Capacity Driver Freq + * @rmtoll CR SCFSEL FL_LCD_GetCapDriverFreq + * @param LCDx LCD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_FRAME_COM + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV8 + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV16 + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV32 + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV64 + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV128 + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV256 + * @arg @ref FL_LCD_CAP_DRIVER_FREQ_LSCLK_DIV512 + */ +__STATIC_INLINE uint32_t FL_LCD_GetCapDriverFreq(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->CR, LCD_CR_SCFSEL_Msk)); +} + +/** + * @brief Set Capacity Driver Mode + * @rmtoll CR SC_CTRL FL_LCD_SetCapDriverMode + * @param LCDx LCD instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_LCD_CAP_DRIVER_MODE_ONE + * @arg @ref FL_LCD_CAP_DRIVER_MODE_TWO + * @arg @ref FL_LCD_CAP_DRIVER_MODE_FOUR + * @arg @ref FL_LCD_CAP_DRIVER_MODE_MANY + * @retval None + */ +__STATIC_INLINE void FL_LCD_SetCapDriverMode(LCD_Type *LCDx, uint32_t mode) +{ + MODIFY_REG(LCDx->CR, LCD_CR_SC_CTRL_Msk, mode); +} + +/** + * @brief Get Capacity Driver Mode + * @rmtoll CR SC_CTRL FL_LCD_GetCapDriverMode + * @param LCDx LCD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LCD_CAP_DRIVER_MODE_ONE + * @arg @ref FL_LCD_CAP_DRIVER_MODE_TWO + * @arg @ref FL_LCD_CAP_DRIVER_MODE_FOUR + * @arg @ref FL_LCD_CAP_DRIVER_MODE_MANY + */ +__STATIC_INLINE uint32_t FL_LCD_GetCapDriverMode(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->CR, LCD_CR_SC_CTRL_Msk)); +} + +/** + * @brief Set Input Bias Current + * @rmtoll CR IC_CTRL FL_LCD_SetBiasCurrent + * @param LCDx LCD instance + * @param current This parameter can be one of the following values: + * @arg @ref FL_LCD_BIAS_CURRENT_VERYHIGH + * @arg @ref FL_LCD_BIAS_CURRENT_HIGH + * @arg @ref FL_LCD_BIAS_CURRENT_MEDIUM + * @arg @ref FL_LCD_BIAS_CURRENT_LOW + * @retval None + */ +__STATIC_INLINE void FL_LCD_SetBiasCurrent(LCD_Type *LCDx, uint32_t current) +{ + MODIFY_REG(LCDx->CR, LCD_CR_IC_CTRL_Msk, current); +} + +/** + * @brief Set Input Bias Current + * @rmtoll CR IC_CTRL FL_LCD_GetBiasCurrent + * @param LCDx LCD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LCD_BIAS_CURRENT_VERYHIGH + * @arg @ref FL_LCD_BIAS_CURRENT_HIGH + * @arg @ref FL_LCD_BIAS_CURRENT_MEDIUM + * @arg @ref FL_LCD_BIAS_CURRENT_LOW + */ +__STATIC_INLINE uint32_t FL_LCD_GetBiasCurrent(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->CR, LCD_CR_IC_CTRL_Msk)); +} + +/** + * @brief Set LCD Enabling Mode + * @rmtoll CR ENMODE FL_LCD_SetDriverMode + * @param LCDx LCD instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_LCD_DRIVER_MODE_INNER_RESISTER + * @arg @ref FL_LCD_DRIVER_MODE_OUTER_CAPACITY + * @retval None + */ +__STATIC_INLINE void FL_LCD_SetDriverMode(LCD_Type *LCDx, uint32_t mode) +{ + MODIFY_REG(LCDx->CR, LCD_CR_ENMODE_Msk, mode); +} + +/** + * @brief Get LCD Enabling Mode + * @rmtoll CR ENMODE FL_LCD_GetDriverMode + * @param LCDx LCD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LCD_DRIVER_MODE_INNER_RESISTER + * @arg @ref FL_LCD_DRIVER_MODE_OUTER_CAPACITY + */ +__STATIC_INLINE uint32_t FL_LCD_GetDriverMode(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->CR, LCD_CR_ENMODE_Msk)); +} + +/** + * @brief Enable LCD Blink + * @rmtoll CR FLICK FL_LCD_EnableDisplayBlink + * @param LCDx LCD instance + * @retval None + */ +__STATIC_INLINE void FL_LCD_EnableDisplayBlink(LCD_Type *LCDx) +{ + SET_BIT(LCDx->CR, LCD_CR_FLICK_Msk); +} + +/** + * @brief Disable LCD Blink + * @rmtoll CR FLICK FL_LCD_DisableDisplayBlink + * @param LCDx LCD instance + * @retval None + */ +__STATIC_INLINE void FL_LCD_DisableDisplayBlink(LCD_Type *LCDx) +{ + CLEAR_BIT(LCDx->CR, LCD_CR_FLICK_Msk); +} + +/** + * @brief Get LCD Blink State + * @rmtoll CR FLICK FL_LCD_IsEnabledDisplayBlink + * @param LCDx LCD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LCD_IsEnabledDisplayBlink(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->CR, LCD_CR_FLICK_Msk) == LCD_CR_FLICK_Msk); +} + +/** + * @brief Set LCD Bias Voltage Select + * @rmtoll CR BIAS FL_LCD_SetBiasVoltage + * @param LCDx LCD instance + * @param voltage This parameter can be one of the following values: + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL0 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL1 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL2 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL3 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL4 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL5 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL6 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL7 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL8 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL9 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL10 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL11 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL12 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL13 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL14 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL15 + * @retval None + */ +__STATIC_INLINE void FL_LCD_SetBiasVoltage(LCD_Type *LCDx, uint32_t voltage) +{ + MODIFY_REG(LCDx->CR, LCD_CR_BIAS_Msk, voltage); +} + +/** + * @brief Get LCD Bias Voltage Select + * @rmtoll CR BIAS FL_LCD_GetBiasVoltage + * @param LCDx LCD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL0 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL1 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL2 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL3 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL4 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL5 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL6 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL7 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL8 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL9 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL10 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL11 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL12 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL13 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL14 + * @arg @ref FL_LCD_BIAS_VOLTAGE_LEVEL15 + */ +__STATIC_INLINE uint32_t FL_LCD_GetBiasVoltage(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->CR, LCD_CR_BIAS_Msk)); +} + +/** + * @brief Set LCD Bias Mode + * @rmtoll CR BIASMD FL_LCD_SetBiasMode + * @param LCDx LCD instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_LCD_BIAS_MODE_4BIAS + * @arg @ref FL_LCD_BIAS_MODE_3BIAS + * @retval None + */ +__STATIC_INLINE void FL_LCD_SetBiasMode(LCD_Type *LCDx, uint32_t mode) +{ + MODIFY_REG(LCDx->CR, LCD_CR_BIASMD_Msk, mode); +} + +/** + * @brief Get LCD Bias Mode + * @rmtoll CR BIASMD FL_LCD_GetBiasMode + * @param LCDx LCD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LCD_BIAS_MODE_4BIAS + * @arg @ref FL_LCD_BIAS_MODE_3BIAS + */ +__STATIC_INLINE uint32_t FL_LCD_GetBiasMode(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->CR, LCD_CR_BIASMD_Msk)); +} + +/** + * @brief Set LCD Anti-Polarization + * @rmtoll CR ANTIPOLAR FL_LCD_SetAntiPolar + * @param LCDx LCD instance + * @param state This parameter can be one of the following values: + * @arg @ref FL_LCD_ANTIPOLAR_FLOATING + * @arg @ref FL_LCD_ANTIPOLAR_GND + * @retval None + */ +__STATIC_INLINE void FL_LCD_SetAntiPolar(LCD_Type *LCDx, uint32_t state) +{ + MODIFY_REG(LCDx->CR, LCD_CR_ANTIPOLAR_Msk, state); +} + +/** + * @brief Get LCD Anti-Polarization + * @rmtoll CR ANTIPOLAR FL_LCD_GetAntiPolar + * @param LCDx LCD instance + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_LCD_GetAntiPolar(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->CR, LCD_CR_ANTIPOLAR_Msk)); +} + +/** + * @brief Set LCD Waveform Format + * @rmtoll CR WFT FL_LCD_SetWaveform + * @param LCDx LCD instance + * @param state This parameter can be one of the following values: + * @arg @ref FL_LCD_WAVEFORM_TYPEA + * @arg @ref FL_LCD_WAVEFORM_TYPEB + * @retval None + */ +__STATIC_INLINE void FL_LCD_SetWaveform(LCD_Type *LCDx, uint32_t state) +{ + MODIFY_REG(LCDx->CR, LCD_CR_WFT_Msk, state); +} + +/** + * @brief Get LCD Waveform Format + * @rmtoll CR WFT FL_LCD_GetWaveform + * @param LCDx LCD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LCD_WAVEFORM_TYPEA + * @arg @ref FL_LCD_WAVEFORM_TYPEB + */ +__STATIC_INLINE uint32_t FL_LCD_GetWaveform(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->CR, LCD_CR_WFT_Msk)); +} + +/** + * @brief Set LCD Segment Line Mux + * @rmtoll CR LMUX FL_LCD_SetCOMNumber + * @param LCDx LCD instance + * @param number This parameter can be one of the following values: + * @arg @ref FL_LCD_COM_NUM_4COM + * @arg @ref FL_LCD_COM_NUM_6COM + * @arg @ref FL_LCD_COM_NUM_8COM + * @retval None + */ +__STATIC_INLINE void FL_LCD_SetCOMNumber(LCD_Type *LCDx, uint32_t number) +{ + MODIFY_REG(LCDx->CR, LCD_CR_LMUX_Msk, number); +} + +/** + * @brief Get LCD Segment Line Mux + * @rmtoll CR LMUX FL_LCD_GetCOMNumber + * @param LCDx LCD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LCD_COM_NUM_4COM + * @arg @ref FL_LCD_COM_NUM_6COM + * @arg @ref FL_LCD_COM_NUM_8COM + */ +__STATIC_INLINE uint32_t FL_LCD_GetCOMNumber(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->CR, LCD_CR_LMUX_Msk)); +} + +/** + * @brief Enable LCD + * @rmtoll CR EN FL_LCD_Enable + * @param LCDx LCD instance + * @retval None + */ +__STATIC_INLINE void FL_LCD_Enable(LCD_Type *LCDx) +{ + SET_BIT(LCDx->CR, LCD_CR_EN_Msk); +} + +/** + * @brief Get LCD State + * @rmtoll CR EN FL_LCD_IsEnabled + * @param LCDx LCD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LCD_IsEnabled(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->CR, LCD_CR_EN_Msk) == LCD_CR_EN_Msk); +} + +/** + * @brief Disable LCD + * @rmtoll CR EN FL_LCD_Disable + * @param LCDx LCD instance + * @retval None + */ +__STATIC_INLINE void FL_LCD_Disable(LCD_Type *LCDx) +{ + CLEAR_BIT(LCDx->CR, LCD_CR_EN_Msk); +} + +/** + * @brief Set LCD Display Frequency + * @rmtoll FCR DF FL_LCD_WriteDisplayFrequency + * @param LCDx LCD instance + * @param frequency + * @retval None + */ +__STATIC_INLINE void FL_LCD_WriteDisplayFrequency(LCD_Type *LCDx, uint32_t frequency) +{ + MODIFY_REG(LCDx->FCR, (0xffU << 0U), (frequency << 0U)); +} + +/** + * @brief Get LCD Display Frequency + * @rmtoll FCR DF FL_LCD_ReadDisplayFrequency + * @param LCDx LCD instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LCD_ReadDisplayFrequency(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->FCR, (0xffU << 0U)) >> 0U); +} + +/** + * @brief Set LCD Display Off Time + * @rmtoll FLKT TOFF FL_LCD_WriteDisplayOffTime + * @param LCDx LCD instance + * @param time + * @retval None + */ +__STATIC_INLINE void FL_LCD_WriteDisplayOffTime(LCD_Type *LCDx, uint32_t time) +{ + MODIFY_REG(LCDx->FLKT, (0xffU << 8U), (time << 8U)); +} + +/** + * @brief Get LCD Display Off Time + * @rmtoll FLKT TOFF FL_LCD_ReadDisplayOffTime + * @param LCDx LCD instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LCD_ReadDisplayOffTime(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->FLKT, (0xffU << 8U)) >> 8U); +} + +/** + * @brief Set LCD Display On Time + * @rmtoll FLKT TON FL_LCD_WriteDisplayOnTime + * @param LCDx LCD instance + * @param time + * @retval None + */ +__STATIC_INLINE void FL_LCD_WriteDisplayOnTime(LCD_Type *LCDx, uint32_t time) +{ + MODIFY_REG(LCDx->FLKT, (0xffU << 0U), (time << 0U)); +} + +/** + * @brief Get LCD Display On Time + * @rmtoll FLKT TON FL_LCD_ReadDisplayOnTime + * @param LCDx LCD instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LCD_ReadDisplayOnTime(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->FLKT, (0xffU << 0U)) >> 0U); +} + +/** + * @brief Enable LCD Display OFF IRQ + * @rmtoll IER DONIE FL_LCD_EnableIT_DisplayOff + * @param LCDx LCD instance + * @retval None + */ +__STATIC_INLINE void FL_LCD_EnableIT_DisplayOff(LCD_Type *LCDx) +{ + SET_BIT(LCDx->IER, LCD_IER_DONIE_Msk); +} + +/** + * @brief Disable LCD Display OFF IRQ + * @rmtoll IER DONIE FL_LCD_DisableIT_DisplayOff + * @param LCDx LCD instance + * @retval None + */ +__STATIC_INLINE void FL_LCD_DisableIT_DisplayOff(LCD_Type *LCDx) +{ + CLEAR_BIT(LCDx->IER, LCD_IER_DONIE_Msk); +} + +/** + * @brief Getable LCD Display OFF IRQ + * @rmtoll IER DONIE FL_LCD_IsEnabledIT_DisplayOff + * @param LCDx LCD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LCD_IsEnabledIT_DisplayOff(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->IER, LCD_IER_DONIE_Msk) == LCD_IER_DONIE_Msk); +} + +/** + * @brief Enable LCD Display ON Interrupt + * @rmtoll IER DOFFIE FL_LCD_EnableIT_DisplayOn + * @param LCDx LCD instance + * @retval None + */ +__STATIC_INLINE void FL_LCD_EnableIT_DisplayOn(LCD_Type *LCDx) +{ + SET_BIT(LCDx->IER, LCD_IER_DOFFIE_Msk); +} + +/** + * @brief Disable LCD Display ON Interrupt + * @rmtoll IER DOFFIE FL_LCD_DisableIT_DisplayOn + * @param LCDx LCD instance + * @retval None + */ +__STATIC_INLINE void FL_LCD_DisableIT_DisplayOn(LCD_Type *LCDx) +{ + CLEAR_BIT(LCDx->IER, LCD_IER_DOFFIE_Msk); +} + +/** + * @brief Getable LCD Display ON Interrupt + * @rmtoll IER DOFFIE FL_LCD_IsEnabledIT_DisplayOn + * @param LCDx LCD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LCD_IsEnabledIT_DisplayOn(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->IER, LCD_IER_DOFFIE_Msk) == LCD_IER_DOFFIE_Msk); +} + +/** + * @brief Get LCD Display OFF Flag + * @rmtoll ISR DONIF FL_LCD_IsActiveFlag_DisplayOff + * @param LCDx LCD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LCD_IsActiveFlag_DisplayOff(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->ISR, LCD_ISR_DONIF_Msk) == (LCD_ISR_DONIF_Msk)); +} + +/** + * @brief Clear LCD Display OFF Flag + * @rmtoll ISR DONIF FL_LCD_ClearFlag_DisplayOff + * @param LCDx LCD instance + * @retval None + */ +__STATIC_INLINE void FL_LCD_ClearFlag_DisplayOff(LCD_Type *LCDx) +{ + WRITE_REG(LCDx->ISR, LCD_ISR_DONIF_Msk); +} + +/** + * @brief Get LCD Display On Flag + * @rmtoll ISR DOFFIF FL_LCD_IsActiveFlag_DisplayOn + * @param LCDx LCD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LCD_IsActiveFlag_DisplayOn(LCD_Type *LCDx) +{ + return (uint32_t)(READ_BIT(LCDx->ISR, LCD_ISR_DOFFIF_Msk) == (LCD_ISR_DOFFIF_Msk)); +} + +/** + * @brief Clear LCD Display On Flag + * @rmtoll ISR DOFFIF FL_LCD_ClearFlag_DisplayOn + * @param LCDx LCD instance + * @retval None + */ +__STATIC_INLINE void FL_LCD_ClearFlag_DisplayOn(LCD_Type *LCDx) +{ + WRITE_REG(LCDx->ISR, LCD_ISR_DOFFIF_Msk); +} + +/** + * @brief Write LCD Display Data + * @rmtoll DATA0 DSDA FL_LCD_WriteData + * @param LCDx LCD instance + * @param reg This parameter can be one of the following values: + * @arg @ref FL_LCD_DATA_REG0 + * @arg @ref FL_LCD_DATA_REG1 + * @arg @ref FL_LCD_DATA_REG2 + * @arg @ref FL_LCD_DATA_REG3 + * @arg @ref FL_LCD_DATA_REG4 + * @arg @ref FL_LCD_DATA_REG5 + * @arg @ref FL_LCD_DATA_REG6 + * @arg @ref FL_LCD_DATA_REG7 + * @arg @ref FL_LCD_DATA_REG8 + * @arg @ref FL_LCD_DATA_REG9 + * @param data + * @retval None + */ +__STATIC_INLINE void FL_LCD_WriteData(LCD_Type *LCDx, uint32_t reg, uint32_t data) +{ + volatile uint32_t *pData = &(LCDx->DATA0); + MODIFY_REG(pData[reg], LCD_DATA0_DSDA_Msk, data); +} + +/** + * @brief Read LCD Display Data + * @rmtoll DATA0 DSDA FL_LCD_ReadData + * @param LCDx LCD instance + * @param reg This parameter can be one of the following values: + * @arg @ref FL_LCD_DATA_REG0 + * @arg @ref FL_LCD_DATA_REG1 + * @arg @ref FL_LCD_DATA_REG2 + * @arg @ref FL_LCD_DATA_REG3 + * @arg @ref FL_LCD_DATA_REG4 + * @arg @ref FL_LCD_DATA_REG5 + * @arg @ref FL_LCD_DATA_REG6 + * @arg @ref FL_LCD_DATA_REG7 + * @arg @ref FL_LCD_DATA_REG8 + * @arg @ref FL_LCD_DATA_REG9 + * @retval + */ +__STATIC_INLINE uint32_t FL_LCD_ReadData(LCD_Type *LCDx, uint32_t reg) +{ + volatile uint32_t *pData = &(LCDx->DATA0); + return (uint32_t)(READ_BIT(pData[reg], LCD_DATA0_DSDA_Msk)); +} + +/** + * @brief Get LCD COMx State + * @rmtoll COMEN FL_LCD_IsEnabledCOMEN + * @param LCDx LCD instance + * @param COM This parameter can be one of the following values: + * @arg @ref FL_LCD_COMEN_COM0 + * @arg @ref FL_LCD_COMEN_COM1 + * @arg @ref FL_LCD_COMEN_COM2 + * @arg @ref FL_LCD_COMEN_COM3 + * @arg @ref FL_LCD_COMEN_COM4 + * @arg @ref FL_LCD_COMEN_COM5 + * @arg @ref FL_LCD_COMEN_COM6 + * @arg @ref FL_LCD_COMEN_COM7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LCD_IsEnabledCOMEN(LCD_Type *LCDx, uint32_t COM) +{ + if(COM < FL_LCD_COMEN_COM4) + { + return (uint32_t)(READ_BIT(LCDx->COMEN, ((COM & 0xffffffff) << 0x0U)) == ((COM & 0xffffffff) << 0x0U)); + } + else + { + return (uint32_t)(READ_BIT(LCDx->SEGEN0, ((COM & 0xffffffff) << 0x0U)) == ((COM & 0xffffffff) << 0x0U)); + } +} + +/** + * @brief Enable LCD COMx + * @rmtoll COMEN FL_LCD_EnableCOMEN + * @param LCDx LCD instance + * @param COM This parameter can be one of the following values: + * @arg @ref FL_LCD_COMEN_COM0 + * @arg @ref FL_LCD_COMEN_COM1 + * @arg @ref FL_LCD_COMEN_COM2 + * @arg @ref FL_LCD_COMEN_COM3 + * @arg @ref FL_LCD_COMEN_COM4 + * @arg @ref FL_LCD_COMEN_COM5 + * @arg @ref FL_LCD_COMEN_COM6 + * @arg @ref FL_LCD_COMEN_COM7 + * @retval None + */ +__STATIC_INLINE void FL_LCD_EnableCOMEN(LCD_Type *LCDx, uint32_t COM) +{ + if(COM < FL_LCD_COMEN_COM4) + { + SET_BIT(LCDx->COMEN, ((COM & 0xffffffff) << 0x0U)); + } + else + { + SET_BIT(LCDx->SEGEN0, ((COM & 0xffffffff) << 0x0U)); + } +} + +/** + * @brief Disable LCD COMx + * @rmtoll COMEN FL_LCD_DisableCOMEN + * @param LCDx LCD instance + * @param COM This parameter can be one of the following values: + * @arg @ref FL_LCD_COMEN_COM0 + * @arg @ref FL_LCD_COMEN_COM1 + * @arg @ref FL_LCD_COMEN_COM2 + * @arg @ref FL_LCD_COMEN_COM3 + * @arg @ref FL_LCD_COMEN_COM4 + * @arg @ref FL_LCD_COMEN_COM5 + * @arg @ref FL_LCD_COMEN_COM6 + * @arg @ref FL_LCD_COMEN_COM7 + * @retval None + */ +__STATIC_INLINE void FL_LCD_DisableCOMEN(LCD_Type *LCDx, uint32_t COM) +{ + if(COM < FL_LCD_COMEN_COM4) + { + CLEAR_BIT(LCDx->COMEN, ((COM & 0xffffffff) << 0x0U)); + } + else + { + CLEAR_BIT(LCDx->SEGEN0, ((COM & 0xffffffff) << 0x0U)); + } +} + +/** + * @brief Get LCD SEGx State + * @rmtoll SEGEN0 FL_LCD_IsEnabledSEGEN0 + * @param LCDx LCD instance + * @param SEG This parameter can be one of the following values: + * @arg @ref FL_LCD_SEGEN0_SEG0 + * @arg @ref FL_LCD_SEGEN0_SEG1 + * @arg @ref FL_LCD_SEGEN0_SEG2 + * @arg @ref FL_LCD_SEGEN0_SEG3 + * @arg @ref FL_LCD_SEGEN0_SEG4 + * @arg @ref FL_LCD_SEGEN0_SEG5 + * @arg @ref FL_LCD_SEGEN0_SEG6 + * @arg @ref FL_LCD_SEGEN0_SEG7 + * @arg @ref FL_LCD_SEGEN0_SEG8 + * @arg @ref FL_LCD_SEGEN0_SEG9 + * @arg @ref FL_LCD_SEGEN0_SEG10 + * @arg @ref FL_LCD_SEGEN0_SEG11 + * @arg @ref FL_LCD_SEGEN0_SEG12 + * @arg @ref FL_LCD_SEGEN0_SEG13 + * @arg @ref FL_LCD_SEGEN0_SEG14 + * @arg @ref FL_LCD_SEGEN0_SEG15 + * @arg @ref FL_LCD_SEGEN0_SEG16 + * @arg @ref FL_LCD_SEGEN0_SEG17 + * @arg @ref FL_LCD_SEGEN0_SEG18 + * @arg @ref FL_LCD_SEGEN0_SEG19 + * @arg @ref FL_LCD_SEGEN0_SEG20 + * @arg @ref FL_LCD_SEGEN0_SEG21 + * @arg @ref FL_LCD_SEGEN0_SEG22 + * @arg @ref FL_LCD_SEGEN0_SEG23 + * @arg @ref FL_LCD_SEGEN0_SEG24 + * @arg @ref FL_LCD_SEGEN0_SEG25 + * @arg @ref FL_LCD_SEGEN0_SEG26 + * @arg @ref FL_LCD_SEGEN0_SEG27 + * @arg @ref FL_LCD_SEGEN0_SEG28 + * @arg @ref FL_LCD_SEGEN0_SEG29 + * @arg @ref FL_LCD_SEGEN0_SEG30 + * @arg @ref FL_LCD_SEGEN0_SEG31 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LCD_IsEnabledSEGEN0(LCD_Type *LCDx, uint32_t SEG) +{ + return (uint32_t)(READ_BIT(LCDx->SEGEN0, ((SEG & 0xffffffff) << 0x0U)) == ((SEG & 0xffffffff) << 0x0U)); +} + +/** + * @brief Enable LCD SEGx + * @rmtoll SEGEN0 FL_LCD_EnableSEGEN0 + * @param LCDx LCD instance + * @param SEG This parameter can be one of the following values: + * @arg @ref FL_LCD_SEGEN0_SEG0 + * @arg @ref FL_LCD_SEGEN0_SEG1 + * @arg @ref FL_LCD_SEGEN0_SEG2 + * @arg @ref FL_LCD_SEGEN0_SEG3 + * @arg @ref FL_LCD_SEGEN0_SEG4 + * @arg @ref FL_LCD_SEGEN0_SEG5 + * @arg @ref FL_LCD_SEGEN0_SEG6 + * @arg @ref FL_LCD_SEGEN0_SEG7 + * @arg @ref FL_LCD_SEGEN0_SEG8 + * @arg @ref FL_LCD_SEGEN0_SEG9 + * @arg @ref FL_LCD_SEGEN0_SEG10 + * @arg @ref FL_LCD_SEGEN0_SEG11 + * @arg @ref FL_LCD_SEGEN0_SEG12 + * @arg @ref FL_LCD_SEGEN0_SEG13 + * @arg @ref FL_LCD_SEGEN0_SEG14 + * @arg @ref FL_LCD_SEGEN0_SEG15 + * @arg @ref FL_LCD_SEGEN0_SEG16 + * @arg @ref FL_LCD_SEGEN0_SEG17 + * @arg @ref FL_LCD_SEGEN0_SEG18 + * @arg @ref FL_LCD_SEGEN0_SEG19 + * @arg @ref FL_LCD_SEGEN0_SEG20 + * @arg @ref FL_LCD_SEGEN0_SEG21 + * @arg @ref FL_LCD_SEGEN0_SEG22 + * @arg @ref FL_LCD_SEGEN0_SEG23 + * @arg @ref FL_LCD_SEGEN0_SEG24 + * @arg @ref FL_LCD_SEGEN0_SEG25 + * @arg @ref FL_LCD_SEGEN0_SEG26 + * @arg @ref FL_LCD_SEGEN0_SEG27 + * @arg @ref FL_LCD_SEGEN0_SEG28 + * @arg @ref FL_LCD_SEGEN0_SEG29 + * @arg @ref FL_LCD_SEGEN0_SEG30 + * @arg @ref FL_LCD_SEGEN0_SEG31 + * @retval None + */ +__STATIC_INLINE void FL_LCD_EnableSEGEN0(LCD_Type *LCDx, uint32_t SEG) +{ + SET_BIT(LCDx->SEGEN0, ((SEG & 0xffffffff) << 0x0U)); +} + +/** + * @brief Disable LCD SEGx + * @rmtoll SEGEN0 FL_LCD_DisableSEGEN0 + * @param LCDx LCD instance + * @param SEG This parameter can be one of the following values: + * @arg @ref FL_LCD_SEGEN0_SEG0 + * @arg @ref FL_LCD_SEGEN0_SEG1 + * @arg @ref FL_LCD_SEGEN0_SEG2 + * @arg @ref FL_LCD_SEGEN0_SEG3 + * @arg @ref FL_LCD_SEGEN0_SEG4 + * @arg @ref FL_LCD_SEGEN0_SEG5 + * @arg @ref FL_LCD_SEGEN0_SEG6 + * @arg @ref FL_LCD_SEGEN0_SEG7 + * @arg @ref FL_LCD_SEGEN0_SEG8 + * @arg @ref FL_LCD_SEGEN0_SEG9 + * @arg @ref FL_LCD_SEGEN0_SEG10 + * @arg @ref FL_LCD_SEGEN0_SEG11 + * @arg @ref FL_LCD_SEGEN0_SEG12 + * @arg @ref FL_LCD_SEGEN0_SEG13 + * @arg @ref FL_LCD_SEGEN0_SEG14 + * @arg @ref FL_LCD_SEGEN0_SEG15 + * @arg @ref FL_LCD_SEGEN0_SEG16 + * @arg @ref FL_LCD_SEGEN0_SEG17 + * @arg @ref FL_LCD_SEGEN0_SEG18 + * @arg @ref FL_LCD_SEGEN0_SEG19 + * @arg @ref FL_LCD_SEGEN0_SEG20 + * @arg @ref FL_LCD_SEGEN0_SEG21 + * @arg @ref FL_LCD_SEGEN0_SEG22 + * @arg @ref FL_LCD_SEGEN0_SEG23 + * @arg @ref FL_LCD_SEGEN0_SEG24 + * @arg @ref FL_LCD_SEGEN0_SEG25 + * @arg @ref FL_LCD_SEGEN0_SEG26 + * @arg @ref FL_LCD_SEGEN0_SEG27 + * @arg @ref FL_LCD_SEGEN0_SEG28 + * @arg @ref FL_LCD_SEGEN0_SEG29 + * @arg @ref FL_LCD_SEGEN0_SEG30 + * @arg @ref FL_LCD_SEGEN0_SEG31 + * @retval None + */ +__STATIC_INLINE void FL_LCD_DisableSEGEN0(LCD_Type *LCDx, uint32_t SEG) +{ + CLEAR_BIT(LCDx->SEGEN0, ((SEG & 0xffffffff) << 0x0U)); +} + +/** + * @brief Get LCD SEGx State + * @rmtoll SEGEN1 FL_LCD_IsEnabledSEGEN1 + * @param LCDx LCD instance + * @param SEG This parameter can be one of the following values: + * @arg @ref FL_LCD_SEGEN1_SEG0 + * @arg @ref FL_LCD_SEGEN1_SEG1 + * @arg @ref FL_LCD_SEGEN1_SEG2 + * @arg @ref FL_LCD_SEGEN1_SEG3 + * @arg @ref FL_LCD_SEGEN1_SEG4 + * @arg @ref FL_LCD_SEGEN1_SEG5 + * @arg @ref FL_LCD_SEGEN1_SEG6 + * @arg @ref FL_LCD_SEGEN1_SEG7 + * @arg @ref FL_LCD_SEGEN1_SEG8 + * @arg @ref FL_LCD_SEGEN1_SEG9 + * @arg @ref FL_LCD_SEGEN1_SEG10 + * @arg @ref FL_LCD_SEGEN1_SEG11 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LCD_IsEnabledSEGEN1(LCD_Type *LCDx, uint32_t SEG) +{ + return (uint32_t)(READ_BIT(LCDx->SEGEN1, ((SEG & 0xffffffff) << 0x0U)) == ((SEG & 0xffffffff) << 0x0U)); +} + +/** + * @brief Enable LCD SEGx + * @rmtoll SEGEN1 FL_LCD_EnableSEGEN1 + * @param LCDx LCD instance + * @param SEG This parameter can be one of the following values: + * @arg @ref FL_LCD_SEGEN1_SEG0 + * @arg @ref FL_LCD_SEGEN1_SEG1 + * @arg @ref FL_LCD_SEGEN1_SEG2 + * @arg @ref FL_LCD_SEGEN1_SEG3 + * @arg @ref FL_LCD_SEGEN1_SEG4 + * @arg @ref FL_LCD_SEGEN1_SEG5 + * @arg @ref FL_LCD_SEGEN1_SEG6 + * @arg @ref FL_LCD_SEGEN1_SEG7 + * @arg @ref FL_LCD_SEGEN1_SEG8 + * @arg @ref FL_LCD_SEGEN1_SEG9 + * @arg @ref FL_LCD_SEGEN1_SEG10 + * @arg @ref FL_LCD_SEGEN1_SEG11 + * @retval None + */ +__STATIC_INLINE void FL_LCD_EnableSEGEN1(LCD_Type *LCDx, uint32_t SEG) +{ + SET_BIT(LCDx->SEGEN1, ((SEG & 0xffffffff) << 0x0U)); +} + +/** + * @brief Disable LCD SEGx + * @rmtoll SEGEN1 FL_LCD_DisableSEGEN1 + * @param LCDx LCD instance + * @param SEG This parameter can be one of the following values: + * @arg @ref FL_LCD_SEGEN1_SEG0 + * @arg @ref FL_LCD_SEGEN1_SEG1 + * @arg @ref FL_LCD_SEGEN1_SEG2 + * @arg @ref FL_LCD_SEGEN1_SEG3 + * @arg @ref FL_LCD_SEGEN1_SEG4 + * @arg @ref FL_LCD_SEGEN1_SEG5 + * @arg @ref FL_LCD_SEGEN1_SEG6 + * @arg @ref FL_LCD_SEGEN1_SEG7 + * @arg @ref FL_LCD_SEGEN1_SEG8 + * @arg @ref FL_LCD_SEGEN1_SEG9 + * @arg @ref FL_LCD_SEGEN1_SEG10 + * @arg @ref FL_LCD_SEGEN1_SEG11 + * @retval None + */ +__STATIC_INLINE void FL_LCD_DisableSEGEN1(LCD_Type *LCDx, uint32_t SEG) +{ + CLEAR_BIT(LCDx->SEGEN1, ((SEG & 0xffffffff) << 0x0U)); +} + +/** + * @} + */ + +/** @defgroup LCD_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_LCD_DeInit(LCD_Type *LCDx); +void FL_LCD_StructInit(FL_LCD_InitTypeDef *initStruct); +FL_ErrorStatus FL_LCD_Init(LCD_Type *LCDx, FL_LCD_InitTypeDef *initStruct); + +void FL_LCD_4COMDisplay(uint32_t *display, uint8_t com, uint8_t seg, uint8_t state); +void FL_LCD_6COMDisplay(uint32_t *display, uint8_t com, uint8_t seg, uint8_t state); +void FL_LCD_8COMDisplay(uint32_t *display, uint8_t com, uint8_t seg, uint8_t state); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_LCD_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.1 @ 2021-04-25*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lptim16.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lptim16.h new file mode 100644 index 0000000..cfded18 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lptim16.h @@ -0,0 +1,1319 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_lptim16.h + * @author FMSH Application Team + * @brief Head file of LPTIM16 FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_LPTIM16_H +#define __FM33LG0XX_FL_LPTIM16_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup LPTIM16 LPTIM16 + * @brief LPTIM16 FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup LPTIM16_FL_ES_INIT LPTIM16 Exported Init structures + * @{ + */ + +/** + * @brief FL LPTIM16 Init Sturcture definition + */ + +/** + * @brief LPTIM16 Init Sturcture Definition + */ +typedef struct +{ + /* 内部时钟源 */ + uint32_t clockSource; + + /* 预分频器的时钟源 可选择内部时钟, 也可选择外部时钟 */ + uint32_t prescalerClockSource; + + /* 预分频系数 */ + uint32_t prescaler; + + /* 重装值 */ + uint32_t autoReload; + + /* 定时器工作模式选择 */ + uint32_t mode; + + /* 定时器编码器模式 */ + uint32_t encoderMode; + + /* 单次计数使能 */ + uint32_t onePulseMode; + + /* ETR异步计数边沿 */ + uint32_t countEdge; + + /* ETR触发计数边沿 */ + uint32_t triggerEdge; + +} FL_LPTIM16_InitTypeDef; + +/** + * @brief LPTIM16 Output Compare Configuration Structure Definition + */ +typedef struct +{ + uint32_t compareValue; + + uint32_t OCPolarity; + +} FL_LPTIM16_OC_InitTypeDef; + +/** + * @brief LPTIM16 Input Capture Configuration Structure Definition + */ +typedef struct +{ + uint32_t channel1Prescaler; + + uint32_t channel1CaptureSource; + + uint32_t ICInputDigitalFilter; + + uint32_t ICInputPolarity; + + uint32_t ICEdge; + +} FL_LPTIM16_IC_InitTypeDef; +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup LPTIM16_FL_Exported_Constants LPTIM16 Exported Constants + * @{ + */ + +#define LPTIM16_CR_EN_Pos (0U) +#define LPTIM16_CR_EN_Msk (0x1U << LPTIM16_CR_EN_Pos) +#define LPTIM16_CR_EN LPTIM16_CR_EN_Msk + +#define LPTIM16_CFGR_ETR_AFEN_Pos (24U) +#define LPTIM16_CFGR_ETR_AFEN_Msk (0x1U << LPTIM16_CFGR_ETR_AFEN_Pos) +#define LPTIM16_CFGR_ETR_AFEN LPTIM16_CFGR_ETR_AFEN_Msk + +#define LPTIM16_CFGR_PSCSEL_Pos (14U) +#define LPTIM16_CFGR_PSCSEL_Msk (0x1U << LPTIM16_CFGR_PSCSEL_Pos) +#define LPTIM16_CFGR_PSCSEL LPTIM16_CFGR_PSCSEL_Msk + +#define LPTIM16_CFGR_DIVSEL_Pos (10U) +#define LPTIM16_CFGR_DIVSEL_Msk (0x7U << LPTIM16_CFGR_DIVSEL_Pos) +#define LPTIM16_CFGR_DIVSEL LPTIM16_CFGR_DIVSEL_Msk + +#define LPTIM16_CFGR_EDGESEL_Pos (7U) +#define LPTIM16_CFGR_EDGESEL_Msk (0x1U << LPTIM16_CFGR_EDGESEL_Pos) +#define LPTIM16_CFGR_EDGESEL LPTIM16_CFGR_EDGESEL_Msk + +#define LPTIM16_CFGR_TRIGCFG_Pos (5U) +#define LPTIM16_CFGR_TRIGCFG_Msk (0x3U << LPTIM16_CFGR_TRIGCFG_Pos) +#define LPTIM16_CFGR_TRIGCFG LPTIM16_CFGR_TRIGCFG_Msk + +#define LPTIM16_CFGR_QEMD_Pos (3U) +#define LPTIM16_CFGR_QEMD_Msk (0x3U << LPTIM16_CFGR_QEMD_Pos) +#define LPTIM16_CFGR_QEMD LPTIM16_CFGR_QEMD_Msk + +#define LPTIM16_CFGR_MMS_Pos (16U) +#define LPTIM16_CFGR_MMS_Msk (0x7U << LPTIM16_CFGR_MMS_Pos) +#define LPTIM16_CFGR_MMS LPTIM16_CFGR_MMS_Msk + +#define LPTIM16_CFGR_ONST_Pos (2U) +#define LPTIM16_CFGR_ONST_Msk (0x1U << LPTIM16_CFGR_ONST_Pos) +#define LPTIM16_CFGR_ONST LPTIM16_CFGR_ONST_Msk + +#define LPTIM16_CFGR_TMODE_Pos (0U) +#define LPTIM16_CFGR_TMODE_Msk (0x3U << LPTIM16_CFGR_TMODE_Pos) +#define LPTIM16_CFGR_TMODE LPTIM16_CFGR_TMODE_Msk + +#define LPTIM16_IER_CCIE_Pos (0U) +#define LPTIM16_IER_CCIE_Msk (0x3U << LPTIM16_IER_CCIE_Pos) +#define LPTIM16_IER_CCIE LPTIM16_IER_CCIE_Msk + +#define LPTIM16_IER_OVIE_Pos (6U) +#define LPTIM16_IER_OVIE_Msk (0x1U << LPTIM16_IER_OVIE_Pos) +#define LPTIM16_IER_OVIE LPTIM16_IER_OVIE_Msk + +#define LPTIM16_IER_TRIGIE_Pos (7U) +#define LPTIM16_IER_TRIGIE_Msk (0x1U << LPTIM16_IER_TRIGIE_Pos) +#define LPTIM16_IER_TRIGIE LPTIM16_IER_TRIGIE_Msk + +#define LPTIM16_IER_OVRIE_Pos (8U) +#define LPTIM16_IER_OVRIE_Msk (0x3U << LPTIM16_IER_OVRIE_Pos) +#define LPTIM16_IER_OVRIE LPTIM16_IER_OVRIE_Msk + +#define LPTIM16_ISR_CCIF_Pos (0U) +#define LPTIM16_ISR_CCIF_Msk (0x3U << LPTIM16_ISR_CCIF_Pos) +#define LPTIM16_ISR_CCIF LPTIM16_ISR_CCIF_Msk + +#define LPTIM16_ISR_OVIF_Pos (6U) +#define LPTIM16_ISR_OVIF_Msk (0x1U << LPTIM16_ISR_OVIF_Pos) +#define LPTIM16_ISR_OVIF LPTIM16_ISR_OVIF_Msk + +#define LPTIM16_ISR_TRIGIF_Pos (7U) +#define LPTIM16_ISR_TRIGIF_Msk (0x1U << LPTIM16_ISR_TRIGIF_Pos) +#define LPTIM16_ISR_TRIGIF LPTIM16_ISR_TRIGIF_Msk + +#define LPTIM16_ISR_OVRIF_Pos (8U) +#define LPTIM16_ISR_OVRIF_Msk (0x3U << LPTIM16_ISR_OVRIF_Pos) +#define LPTIM16_ISR_OVRIF LPTIM16_ISR_OVRIF_Msk + +#define LPTIM16_CCSR_CAPCFG_Pos (8U) +#define LPTIM16_CCSR_CAPCFG_Msk (0x3U << LPTIM16_CCSR_CAPCFG_Pos) +#define LPTIM16_CCSR_CAPCFG LPTIM16_CCSR_CAPCFG_Msk + +#define LPTIM16_CCSR_CCP_Pos (16U) +#define LPTIM16_CCSR_CCP_Msk (0x1U << LPTIM16_CCSR_CCP_Pos) +#define LPTIM16_CCSR_CCP LPTIM16_CCSR_CCP_Msk + +#define LPTIM16_CCSR_CAP1PSC_Pos (26U) +#define LPTIM16_CCSR_CAP1PSC_Msk (0x3fU << LPTIM16_CCSR_CAP1PSC_Pos) +#define LPTIM16_CCSR_CAP1PSC LPTIM16_CCSR_CAP1PSC_Msk + +#define LPTIM16_CCSR_CCS_Pos (0U) +#define LPTIM16_CCSR_CCS_Msk (0x3U << LPTIM16_CCSR_CCS_Pos) +#define LPTIM16_CCSR_CCS LPTIM16_CCSR_CCS_Msk + +#define LPTIM16_CCSR_CAPEDGE_Pos (20U) +#define LPTIM16_CCSR_CAPEDGE_Msk (0x1U << LPTIM16_CCSR_CAPEDGE_Pos) +#define LPTIM16_CCSR_CAPEDGE LPTIM16_CCSR_CAPEDGE_Msk + +#define LPTIM16_CCSR_CAP1SSEL_Pos (24U) +#define LPTIM16_CCSR_CAP1SSEL_Msk (0x3U << LPTIM16_CCSR_CAP1SSEL_Pos) +#define LPTIM16_CCSR_CAP1SSEL LPTIM16_CCSR_CAP1SSEL_Msk + + + +#define FL_LPTIM16_CHANNEL_1 (0x1U << 0U) +#define FL_LPTIM16_CHANNEL_2 (0x1U << 1U) + + + +#define FL_LPTIM16_CLK_SOURCE_INTERNAL (0x0U << LPTIM16_CFGR_PSCSEL_Pos) +#define FL_LPTIM16_CLK_SOURCE_EXTERNAL (0x1U << LPTIM16_CFGR_PSCSEL_Pos) + + +#define FL_LPTIM16_PSC_DIV1 (0x0U << LPTIM16_CFGR_DIVSEL_Pos) +#define FL_LPTIM16_PSC_DIV2 (0x1U << LPTIM16_CFGR_DIVSEL_Pos) +#define FL_LPTIM16_PSC_DIV4 (0x2U << LPTIM16_CFGR_DIVSEL_Pos) +#define FL_LPTIM16_PSC_DIV8 (0x3U << LPTIM16_CFGR_DIVSEL_Pos) +#define FL_LPTIM16_PSC_DIV16 (0x4U << LPTIM16_CFGR_DIVSEL_Pos) +#define FL_LPTIM16_PSC_DIV32 (0x5U << LPTIM16_CFGR_DIVSEL_Pos) +#define FL_LPTIM16_PSC_DIV64 (0x6U << LPTIM16_CFGR_DIVSEL_Pos) +#define FL_LPTIM16_PSC_DIV128 (0x7U << LPTIM16_CFGR_DIVSEL_Pos) + + +#define FL_LPTIM16_ETR_COUNT_EDGE_RISING (0x0U << LPTIM16_CFGR_EDGESEL_Pos) +#define FL_LPTIM16_ETR_COUNT_EDGE_FALLING (0x1U << LPTIM16_CFGR_EDGESEL_Pos) + + +#define FL_LPTIM16_ETR_TRIGGER_EDGE_RISING (0x0U << LPTIM16_CFGR_TRIGCFG_Pos) +#define FL_LPTIM16_ETR_TRIGGER_EDGE_FALLING (0x1U << LPTIM16_CFGR_TRIGCFG_Pos) +#define FL_LPTIM16_ETR_TRIGGER_EDGE_BOTH (0x2U << LPTIM16_CFGR_TRIGCFG_Pos) + + +#define FL_LPTIM16_ENCODER_MODE_DISABLE (0x0U << LPTIM16_CFGR_QEMD_Pos) +#define FL_LPTIM16_ENCODER_MODE_TI1FP1_TI2FP2_CNT (0x1U << LPTIM16_CFGR_QEMD_Pos) +#define FL_LPTIM16_ENCODER_MODE_TI2FP2_TI1FP1_CNT (0x2U << LPTIM16_CFGR_QEMD_Pos) +#define FL_LPTIM16_ENCODER_MODE_TI2FP2_CNT_TI1FP1_CNT (0x3U << LPTIM16_CFGR_QEMD_Pos) + + +#define FL_LPTIM16_TRGO_ENABLE (0x1U << LPTIM16_CFGR_MMS_Pos) +#define FL_LPTIM16_TRGO_UPDATE (0x2U << LPTIM16_CFGR_MMS_Pos) +#define FL_LPTIM16_TRGO_OC1REF (0x3U << LPTIM16_CFGR_MMS_Pos) +#define FL_LPTIM16_TRGO_IC1 (0x4U << LPTIM16_CFGR_MMS_Pos) +#define FL_LPTIM16_TRGO_IC2 (0x5U << LPTIM16_CFGR_MMS_Pos) + + +#define FL_LPTIM16_ONE_PULSE_MODE_CONTINUOUS (0x0U << LPTIM16_CFGR_ONST_Pos) +#define FL_LPTIM16_ONE_PULSE_MODE_SINGLE (0x1U << LPTIM16_CFGR_ONST_Pos) + + +#define FL_LPTIM16_OPERATION_MODE_NORMAL (0x0U << LPTIM16_CFGR_TMODE_Pos) +#define FL_LPTIM16_OPERATION_MODE_EXTERNAL_TRIGGER_CNT (0x1U << LPTIM16_CFGR_TMODE_Pos) +#define FL_LPTIM16_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT (0x2U << LPTIM16_CFGR_TMODE_Pos) +#define FL_LPTIM16_OPERATION_MODE_TIMEOUT (0x3U << LPTIM16_CFGR_TMODE_Pos) + + +#define FL_LPTIM16_IC_EDGE_RISING (0x0U << LPTIM16_CCSR_CAPCFG_Pos) +#define FL_LPTIM16_IC_EDGE_FALLING (0x1U << LPTIM16_CCSR_CAPCFG_Pos) +#define FL_LPTIM16_IC_EDGE_BOTH (0x2U << LPTIM16_CCSR_CAPCFG_Pos) + + +#define FL_LPTIM16_OC_POLARITY_NORMAL (0x0U << LPTIM16_CCSR_CCP_Pos) +#define FL_LPTIM16_OC_POLARITY_INVERT (0x1U << LPTIM16_CCSR_CCP_Pos) + + +#define FL_LPTIM16_IC_POLARITY_NORMAL (0x0U << LPTIM16_CCSR_CCP_Pos) +#define FL_LPTIM16_IC_POLARITY_INVERT (0x1U << LPTIM16_CCSR_CCP_Pos) + + +#define FL_LPTIM16_CHANNEL_MODE_DISABLE (0x0U << LPTIM16_CCSR_CCS_Pos) +#define FL_LPTIM16_CHANNEL_MODE_INPUT (0x1U << LPTIM16_CCSR_CCS_Pos) +#define FL_LPTIM16_CHANNEL_MODE_OUTPUT (0x2U << LPTIM16_CCSR_CCS_Pos) + + +#define FL_LPTIM16_IC_CAPCTURED_EDGE_RISING (0x0U << LPTIM16_CCSR_CAPEDGE_Pos) +#define FL_LPTIM16_IC_CAPCTURED_EDGE_FALLING (0x1U << LPTIM16_CCSR_CAPEDGE_Pos) + +#define FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP0 (0x0U << LPTIM16_CCSR_CAP1SSEL_Pos) +#define FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP1 (0x1U << LPTIM16_CCSR_CAP1SSEL_Pos) +#define FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP2 (0x2U << LPTIM16_CCSR_CAP1SSEL_Pos) +#define FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP3 (0x3U << LPTIM16_CCSR_CAP1SSEL_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup LPTIM16_FL_Exported_Functions LPTIM16 Exported Functions + * @{ + */ + +/** + * @brief Enable LPTIM16 + * @rmtoll CR EN FL_LPTIM16_Enable + * @param LPTIM16x LPTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_Enable(LPTIM16_Type *LPTIM16x) +{ + SET_BIT(LPTIM16x->CR, LPTIM16_CR_EN_Msk); +} + +/** + * @brief Disable LPTIM16 + * @rmtoll CR EN FL_LPTIM16_Disable + * @param LPTIM16x LPTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_Disable(LPTIM16_Type *LPTIM16x) +{ + CLEAR_BIT(LPTIM16x->CR, LPTIM16_CR_EN_Msk); +} + +/** + * @brief Get LPTIM16 Enable Status + * @rmtoll CR EN FL_LPTIM16_IsEnabled + * @param LPTIM16x LPTIM16 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IsEnabled(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CR, LPTIM16_CR_EN_Msk) == LPTIM16_CR_EN_Msk); +} + +/** + * @brief Enable External Input Analog Filter + * @rmtoll CFGR ETR_AFEN FL_LPTIM16_EnableETRFilter + * @param LPTIM16x LPTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_EnableETRFilter(LPTIM16_Type *LPTIM16x) +{ + SET_BIT(LPTIM16x->CFGR, LPTIM16_CFGR_ETR_AFEN_Msk); +} + +/** + * @brief Disable External Input Analog Filter + * @rmtoll CFGR ETR_AFEN FL_LPTIM16_DisableETRFilter + * @param LPTIM16x LPTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_DisableETRFilter(LPTIM16_Type *LPTIM16x) +{ + CLEAR_BIT(LPTIM16x->CFGR, LPTIM16_CFGR_ETR_AFEN_Msk); +} + +/** + * @brief Get External Input Analog Filter Enable Status + * @rmtoll CFGR ETR_AFEN FL_LPTIM16_IsEnabledETRFilter + * @param LPTIM16x LPTIM16 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IsEnabledETRFilter(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CFGR, LPTIM16_CFGR_ETR_AFEN_Msk) == LPTIM16_CFGR_ETR_AFEN_Msk); +} + +/** + * @brief Set Prescaler Input + * @rmtoll CFGR PSCSEL FL_LPTIM16_SetClockSource + * @param LPTIM16x LPTIM16 instance + * @param source This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CLK_SOURCE_INTERNAL + * @arg @ref FL_LPTIM16_CLK_SOURCE_EXTERNAL + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_SetClockSource(LPTIM16_Type *LPTIM16x, uint32_t source) +{ + MODIFY_REG(LPTIM16x->CFGR, LPTIM16_CFGR_PSCSEL_Msk, source); +} + +/** + * @brief Get Prescaler Input Setting + * @rmtoll CFGR PSCSEL FL_LPTIM16_GetClockSource + * @param LPTIM16x LPTIM16 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_CLK_SOURCE_INTERNAL + * @arg @ref FL_LPTIM16_CLK_SOURCE_EXTERNAL + */ +__STATIC_INLINE uint32_t FL_LPTIM16_GetClockSource(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CFGR, LPTIM16_CFGR_PSCSEL_Msk)); +} + +/** + * @brief Set Counter Clock Division + * @rmtoll CFGR DIVSEL FL_LPTIM16_SetPrescaler + * @param LPTIM16x LPTIM16 instance + * @param psc This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_PSC_DIV1 + * @arg @ref FL_LPTIM16_PSC_DIV2 + * @arg @ref FL_LPTIM16_PSC_DIV4 + * @arg @ref FL_LPTIM16_PSC_DIV8 + * @arg @ref FL_LPTIM16_PSC_DIV16 + * @arg @ref FL_LPTIM16_PSC_DIV32 + * @arg @ref FL_LPTIM16_PSC_DIV64 + * @arg @ref FL_LPTIM16_PSC_DIV128 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_SetPrescaler(LPTIM16_Type *LPTIM16x, uint32_t psc) +{ + MODIFY_REG(LPTIM16x->CFGR, LPTIM16_CFGR_DIVSEL_Msk, psc); +} + +/** + * @brief Get Counter Clock Division Setting + * @rmtoll CFGR DIVSEL FL_LPTIM16_GetPrescaler + * @param LPTIM16x LPTIM16 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_PSC_DIV1 + * @arg @ref FL_LPTIM16_PSC_DIV2 + * @arg @ref FL_LPTIM16_PSC_DIV4 + * @arg @ref FL_LPTIM16_PSC_DIV8 + * @arg @ref FL_LPTIM16_PSC_DIV16 + * @arg @ref FL_LPTIM16_PSC_DIV32 + * @arg @ref FL_LPTIM16_PSC_DIV64 + * @arg @ref FL_LPTIM16_PSC_DIV128 + */ +__STATIC_INLINE uint32_t FL_LPTIM16_GetPrescaler(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CFGR, LPTIM16_CFGR_DIVSEL_Msk)); +} + +/** + * @brief Set ETR Count Edge + * @rmtoll CFGR EDGESEL FL_LPTIM16_SetETRCountEdge + * @param LPTIM16x LPTIM16 instance + * @param edge This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_ETR_COUNT_EDGE_RISING + * @arg @ref FL_LPTIM16_ETR_COUNT_EDGE_FALLING + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_SetETRCountEdge(LPTIM16_Type *LPTIM16x, uint32_t edge) +{ + MODIFY_REG(LPTIM16x->CFGR, LPTIM16_CFGR_EDGESEL_Msk, edge); +} + +/** + * @brief Get ETR Count Edge Setting + * @rmtoll CFGR EDGESEL FL_LPTIM16_GetETRCountEdge + * @param LPTIM16x LPTIM16 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_ETR_COUNT_EDGE_RISING + * @arg @ref FL_LPTIM16_ETR_COUNT_EDGE_FALLING + */ +__STATIC_INLINE uint32_t FL_LPTIM16_GetETRCountEdge(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CFGR, LPTIM16_CFGR_EDGESEL_Msk)); +} + +/** + * @brief Set ETR Trigger Edge + * @rmtoll CFGR TRIGCFG FL_LPTIM16_SetETRTriggerEdge + * @param LPTIM16x LPTIM16 instance + * @param edge This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_ETR_TRIGGER_EDGE_RISING + * @arg @ref FL_LPTIM16_ETR_TRIGGER_EDGE_FALLING + * @arg @ref FL_LPTIM16_ETR_TRIGGER_EDGE_BOTH + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_SetETRTriggerEdge(LPTIM16_Type *LPTIM16x, uint32_t edge) +{ + MODIFY_REG(LPTIM16x->CFGR, LPTIM16_CFGR_TRIGCFG_Msk, edge); +} + +/** + * @brief Get ETR Trigger Edge Setting + * @rmtoll CFGR TRIGCFG FL_LPTIM16_GetETRTriggerEdge + * @param LPTIM16x LPTIM16 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_ETR_TRIGGER_EDGE_RISING + * @arg @ref FL_LPTIM16_ETR_TRIGGER_EDGE_FALLING + * @arg @ref FL_LPTIM16_ETR_TRIGGER_EDGE_BOTH + */ +__STATIC_INLINE uint32_t FL_LPTIM16_GetETRTriggerEdge(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CFGR, LPTIM16_CFGR_TRIGCFG_Msk)); +} + +/** + * @brief Set Quad Encoder Mode + * @rmtoll CFGR QEMD FL_LPTIM16_SetEncoderMode + * @param LPTIM16x LPTIM16 instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_ENCODER_MODE_DISABLE + * @arg @ref FL_LPTIM16_ENCODER_MODE_TI1FP1_TI2FP2_CNT + * @arg @ref FL_LPTIM16_ENCODER_MODE_TI2FP2_TI1FP1_CNT + * @arg @ref FL_LPTIM16_ENCODER_MODE_TI2FP2_CNT_TI1FP1_CNT + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_SetEncoderMode(LPTIM16_Type *LPTIM16x, uint32_t mode) +{ + MODIFY_REG(LPTIM16x->CFGR, LPTIM16_CFGR_QEMD_Msk, mode); +} + +/** + * @brief Get Quad Encoder Mode Setting + * @rmtoll CFGR QEMD FL_LPTIM16_GetEncoderMode + * @param LPTIM16x LPTIM16 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_ENCODER_MODE_DISABLE + * @arg @ref FL_LPTIM16_ENCODER_MODE_TI1FP1_TI2FP2_CNT + * @arg @ref FL_LPTIM16_ENCODER_MODE_TI2FP2_TI1FP1_CNT + * @arg @ref FL_LPTIM16_ENCODER_MODE_TI2FP2_CNT_TI1FP1_CNT + */ +__STATIC_INLINE uint32_t FL_LPTIM16_GetEncoderMode(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CFGR, LPTIM16_CFGR_QEMD_Msk)); +} + +/** + * @brief Set Sync Trigger Signal Output Source + * @rmtoll CFGR MMS FL_LPTIM16_SetTriggerOutput + * @param LPTIM16x LPTIM16 instance + * @param triggerOutput This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_TRGO_ENABLE + * @arg @ref FL_LPTIM16_TRGO_UPDATE + * @arg @ref FL_LPTIM16_TRGO_OC1REF + * @arg @ref FL_LPTIM16_TRGO_IC1 + * @arg @ref FL_LPTIM16_TRGO_IC2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_SetTriggerOutput(LPTIM16_Type *LPTIM16x, uint32_t triggerOutput) +{ + MODIFY_REG(LPTIM16x->CFGR, LPTIM16_CFGR_MMS_Msk, triggerOutput); +} + +/** + * @brief Get Sync Trigger Signal Output Source Setting + * @rmtoll CFGR MMS FL_LPTIM16_GetTriggerOutput + * @param LPTIM16x LPTIM16 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_TRGO_ENABLE + * @arg @ref FL_LPTIM16_TRGO_UPDATE + * @arg @ref FL_LPTIM16_TRGO_OC1REF + * @arg @ref FL_LPTIM16_TRGO_IC1 + * @arg @ref FL_LPTIM16_TRGO_IC2 + */ +__STATIC_INLINE uint32_t FL_LPTIM16_GetTriggerOutput(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CFGR, LPTIM16_CFGR_MMS_Msk)); +} + +/** + * @brief Set One Pulse Mode + * @rmtoll CFGR ONST FL_LPTIM16_SetOnePulseMode + * @param LPTIM16x LPTIM16 instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_ONE_PULSE_MODE_CONTINUOUS + * @arg @ref FL_LPTIM16_ONE_PULSE_MODE_SINGLE + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_SetOnePulseMode(LPTIM16_Type *LPTIM16x, uint32_t mode) +{ + MODIFY_REG(LPTIM16x->CFGR, LPTIM16_CFGR_ONST_Msk, mode); +} + +/** + * @brief Get One Pulse Mode Setting + * @rmtoll CFGR ONST FL_LPTIM16_GetOnePulseMode + * @param LPTIM16x LPTIM16 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_ONE_PULSE_MODE_CONTINUOUS + * @arg @ref FL_LPTIM16_ONE_PULSE_MODE_SINGLE + */ +__STATIC_INLINE uint32_t FL_LPTIM16_GetOnePulseMode(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CFGR, LPTIM16_CFGR_ONST_Msk)); +} + +/** + * @brief Set Operation Mode + * @rmtoll CFGR TMODE FL_LPTIM16_SetOperationMode + * @param LPTIM16x LPTIM16 instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_OPERATION_MODE_NORMAL + * @arg @ref FL_LPTIM16_OPERATION_MODE_EXTERNAL_TRIGGER_CNT + * @arg @ref FL_LPTIM16_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT + * @arg @ref FL_LPTIM16_OPERATION_MODE_TIMEOUT + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_SetOperationMode(LPTIM16_Type *LPTIM16x, uint32_t mode) +{ + MODIFY_REG(LPTIM16x->CFGR, LPTIM16_CFGR_TMODE_Msk, mode); +} + +/** + * @brief Get Operation Mode Setting + * @rmtoll CFGR TMODE FL_LPTIM16_GetOperationMode + * @param LPTIM16x LPTIM16 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_OPERATION_MODE_NORMAL + * @arg @ref FL_LPTIM16_OPERATION_MODE_EXTERNAL_TRIGGER_CNT + * @arg @ref FL_LPTIM16_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT + * @arg @ref FL_LPTIM16_OPERATION_MODE_TIMEOUT + */ +__STATIC_INLINE uint32_t FL_LPTIM16_GetOperationMode(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CFGR, LPTIM16_CFGR_TMODE_Msk)); +} + +/** + * @brief Set Channel 1 Output Compare Value + * @rmtoll CCR1 FL_LPTIM16_WriteCompareCH1 + * @param LPTIM16x LPTIM16 instance + * @param compareValue + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_WriteCompareCH1(LPTIM16_Type *LPTIM16x, uint32_t compareValue) +{ + MODIFY_REG(LPTIM16x->CCR1, (0xffffU << 0U), (compareValue << 0U)); +} + +/** + * @brief Get Channel 1 Output Compare Value + * @rmtoll CCR1 FL_LPTIM16_ReadCompareCH1 + * @param LPTIM16x LPTIM16 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM16_ReadCompareCH1(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CCR1, (0xffffU << 0U)) >> 0U); +} + +/** + * @brief Set Channel 2 Output Compare Value + * @rmtoll CCR2 FL_LPTIM16_WriteCompareCH2 + * @param LPTIM16x LPTIM16 instance + * @param compareValue + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_WriteCompareCH2(LPTIM16_Type *LPTIM16x, uint32_t compareValue) +{ + MODIFY_REG(LPTIM16x->CCR2, (0xffffU << 0U), (compareValue << 0U)); +} + +/** + * @brief Get Channel 2 Output Compare Value + * @rmtoll CCR2 FL_LPTIM16_ReadCompareCH2 + * @param LPTIM16x LPTIM16 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM16_ReadCompareCH2(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CCR2, (0xffffU << 0U)) >> 0U); +} + +/** + * @brief Get Channel 1 Input Capture Value + * @rmtoll CCR1 FL_LPTIM16_ReadCaptureCH1 + * @param LPTIM16x LPTIM16 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM16_ReadCaptureCH1(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CCR1, (0xffffU << 0U)) >> 0U); +} + +/** + * @brief Get Channel 2 Input Capture Value + * @rmtoll CCR2 FL_LPTIM16_ReadCaptureCH2 + * @param LPTIM16x LPTIM16 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM16_ReadCaptureCH2(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CCR2, (0xffffU << 0U)) >> 0U); +} + +/** + * @brief Enable Channel Capture/Compare Interrupt + * @rmtoll IER CCIE FL_LPTIM16_EnableIT_CC + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_EnableIT_CC(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + SET_BIT(LPTIM16x->IER, ((channel & 0x3) << 0x0U)); +} + +/** + * @brief Enable Update Event Interrupt + * @rmtoll IER OVIE FL_LPTIM16_EnableIT_Update + * @param LPTIM16x LPTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_EnableIT_Update(LPTIM16_Type *LPTIM16x) +{ + SET_BIT(LPTIM16x->IER, LPTIM16_IER_OVIE_Msk); +} + +/** + * @brief Enable External Trigger Interrupt + * @rmtoll IER TRIGIE FL_LPTIM16_EnableIT_Trigger + * @param LPTIM16x LPTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_EnableIT_Trigger(LPTIM16_Type *LPTIM16x) +{ + SET_BIT(LPTIM16x->IER, LPTIM16_IER_TRIGIE_Msk); +} + +/** + * @brief Enable Channel Capture Overflow Interrupt + * @rmtoll IER OVRIE FL_LPTIM16_EnableIT_CCOverflow + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_EnableIT_CCOverflow(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + SET_BIT(LPTIM16x->IER, ((channel & 0x3) << 0x8U)); +} + +/** + * @brief Disable Channel Capture/Compare Interrupt + * @rmtoll IER CCIE FL_LPTIM16_DisableIT_CC + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_DisableIT_CC(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + CLEAR_BIT(LPTIM16x->IER, ((channel & 0x3) << 0x0U)); +} + +/** + * @brief Disable Update Event Interrupt + * @rmtoll IER OVIE FL_LPTIM16_DisableIT_Update + * @param LPTIM16x LPTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_DisableIT_Update(LPTIM16_Type *LPTIM16x) +{ + CLEAR_BIT(LPTIM16x->IER, LPTIM16_IER_OVIE_Msk); +} + +/** + * @brief Disable External Trigger Interrupt + * @rmtoll IER TRIGIE FL_LPTIM16_DisableIT_Trigger + * @param LPTIM16x LPTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_DisableIT_Trigger(LPTIM16_Type *LPTIM16x) +{ + CLEAR_BIT(LPTIM16x->IER, LPTIM16_IER_TRIGIE_Msk); +} + +/** + * @brief Disable Channel Capture Overflow Interrupt + * @rmtoll IER OVRIE FL_LPTIM16_DisableIT_CCOverflow + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_DisableIT_CCOverflow(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + CLEAR_BIT(LPTIM16x->IER, ((channel & 0x3) << 0x8U)); +} + +/** + * @brief Get Channel Capture/Compare Interrupt Enable Status + * @rmtoll IER CCIE FL_LPTIM16_IsEnabledIT_CC + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IsEnabledIT_CC(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + return (uint32_t)(READ_BIT(LPTIM16x->IER, ((channel & 0x3) << 0x0U)) == ((channel & 0x3) << 0x0U)); +} + +/** + * @brief Get Counter Update Event Interrupt Enable Status + * @rmtoll IER OVIE FL_LPTIM16_IsEnabledIT_Update + * @param LPTIM16x LPTIM16 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IsEnabledIT_Update(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->IER, LPTIM16_IER_OVIE_Msk) == LPTIM16_IER_OVIE_Msk); +} + +/** + * @brief Get External Trigger Interrupt Enable Status + * @rmtoll IER TRIGIE FL_LPTIM16_IsEnabledIT_Trigger + * @param LPTIM16x LPTIM16 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IsEnabledIT_Trigger(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->IER, LPTIM16_IER_TRIGIE_Msk) == LPTIM16_IER_TRIGIE_Msk); +} + +/** + * @brief Get Channel Capture Overflow Interrupt Enable Status + * @rmtoll IER OVRIE FL_LPTIM16_IsEnabledIT_CCOverflow + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IsEnabledIT_CCOverflow(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + return (uint32_t)(READ_BIT(LPTIM16x->IER, ((channel & 0x3) << 0x8U)) == ((channel & 0x3) << 0x8U)); +} + +/** + * @brief Get Capture/Compare Channel Interrupt Flag + * @rmtoll ISR CCIF FL_LPTIM16_IsActiveFlag_CC + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IsActiveFlag_CC(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + return (uint32_t)(READ_BIT(LPTIM16x->ISR, ((channel & 0x3) << 0x0U)) == ((channel & 0x3) << 0x0U)); +} + +/** + * @brief Get Update Event Interrupt Flag + * @rmtoll ISR OVIF FL_LPTIM16_IsActiveFlag_Update + * @param LPTIM16x LPTIM16 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IsActiveFlag_Update(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->ISR, LPTIM16_ISR_OVIF_Msk) == (LPTIM16_ISR_OVIF_Msk)); +} + +/** + * @brief Get External Trigger Interrupt Flag + * @rmtoll ISR TRIGIF FL_LPTIM16_IsActiveFlag_Trigger + * @param LPTIM16x LPTIM16 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IsActiveFlag_Trigger(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->ISR, LPTIM16_ISR_TRIGIF_Msk) == (LPTIM16_ISR_TRIGIF_Msk)); +} + +/** + * @brief Get Channel Capture Overflow Interrupt Flag + * @rmtoll ISR OVRIF FL_LPTIM16_IsActiveFlag_CCOverflow + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IsActiveFlag_CCOverflow(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + return (uint32_t)(READ_BIT(LPTIM16x->ISR, ((channel & 0x3) << 0x8U)) == ((channel & 0x3) << 0x8U)); +} + +/** + * @brief Clear Capture/Compare Channel Interrupt Flag + * @rmtoll ISR CCIF FL_LPTIM16_ClearFlag_CC + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_ClearFlag_CC(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + WRITE_REG(LPTIM16x->ISR, ((channel & 0x3) << 0x0U)); +} + +/** + * @brief Clear Update Event Interrupt Flag + * @rmtoll ISR OVIF FL_LPTIM16_ClearFlag_Update + * @param LPTIM16x LPTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_ClearFlag_Update(LPTIM16_Type *LPTIM16x) +{ + WRITE_REG(LPTIM16x->ISR, LPTIM16_ISR_OVIF_Msk); +} + +/** + * @brief Clear External Trigger Interrupt Flag + * @rmtoll ISR TRIGIF FL_LPTIM16_ClearFlag_Trigger + * @param LPTIM16x LPTIM16 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_ClearFlag_Trigger(LPTIM16_Type *LPTIM16x) +{ + WRITE_REG(LPTIM16x->ISR, LPTIM16_ISR_TRIGIF_Msk); +} + +/** + * @brief Clear Channel Capture Overflow Interrupt Flag + * @rmtoll ISR OVRIF FL_LPTIM16_ClearFlag_CCOverflow + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_ClearFlag_CCOverflow(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + WRITE_REG(LPTIM16x->ISR, ((channel & 0x3) << 0x8U)); +} + +/** + * @brief Set Auto Reload Value + * @rmtoll ARR FL_LPTIM16_WriteAutoReload + * @param LPTIM16x LPTIM16 instance + * @param autoReload + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_WriteAutoReload(LPTIM16_Type *LPTIM16x, uint32_t autoReload) +{ + MODIFY_REG(LPTIM16x->ARR, (0xffffU << 0U), (autoReload << 0U)); +} + +/** + * @brief Get Auto Reload Value + * @rmtoll ARR FL_LPTIM16_ReadAutoReload + * @param LPTIM16x LPTIM16 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM16_ReadAutoReload(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->ARR, (0xffffU << 0U)) >> 0U); +} + +/** + * @brief Set Input Capture Channel Capture Edge + * @rmtoll CCSR CAPCFG FL_LPTIM16_IC_SetCaptureEdge + * @param LPTIM16x LPTIM16 instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_IC_EDGE_RISING + * @arg @ref FL_LPTIM16_IC_EDGE_FALLING + * @arg @ref FL_LPTIM16_IC_EDGE_BOTH + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_IC_SetCaptureEdge(LPTIM16_Type *LPTIM16x, uint32_t polarity, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM16_CHANNEL_1: + MODIFY_REG(LPTIM16x->CCSR, (0x3U << 8U), (polarity << 0U)); + break; + case FL_LPTIM16_CHANNEL_2: + MODIFY_REG(LPTIM16x->CCSR, (0x3U << 10U), (polarity << 2U)); + break; + } +} + +/** + * @brief Get Input Capture Channel Capture Edge + * @rmtoll CCSR CAPCFG FL_LPTIM16_IC_GetCaptureEdge + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_IC_EDGE_RISING + * @arg @ref FL_LPTIM16_IC_EDGE_FALLING + * @arg @ref FL_LPTIM16_IC_EDGE_BOTH + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IC_GetCaptureEdge(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM16_CHANNEL_1: + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, (0x3U << 8U)) >> 0U); + case FL_LPTIM16_CHANNEL_2: + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, (0x3U << 10U)) >> 2U); + default: + return 0; + } +} + +/** + * @brief Set Channel Output Compare Polarity + * @rmtoll CCSR CCP FL_LPTIM16_OC_SetPolarity + * @param LPTIM16x LPTIM16 instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_OC_POLARITY_NORMAL + * @arg @ref FL_LPTIM16_OC_POLARITY_INVERT + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_OC_SetPolarity(LPTIM16_Type *LPTIM16x, uint32_t polarity, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM16_CHANNEL_1: + MODIFY_REG(LPTIM16x->CCSR, (0x1U << 16U), (polarity << 0U)); + break; + case FL_LPTIM16_CHANNEL_2: + MODIFY_REG(LPTIM16x->CCSR, (0x1U << 17U), (polarity << 1U)); + break; + } +} + +/** + * @brief Get Channel Output Compare Polarity + * @rmtoll CCSR CCP FL_LPTIM16_OC_GetPolarity + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_OC_POLARITY_NORMAL + * @arg @ref FL_LPTIM16_OC_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_LPTIM16_OC_GetPolarity(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM16_CHANNEL_1: + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, (0x1U << 16U)) >> 0U); + case FL_LPTIM16_CHANNEL_2: + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, (0x1U << 17U)) >> 1U); + default: + return 0; + } +} + +/** + * @brief Set Input Capture Channel Input Polarity + * @rmtoll CCSR CCP FL_LPTIM16_IC_SetInputPolarity + * @param LPTIM16x LPTIM16 instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_IC_POLARITY_NORMAL + * @arg @ref FL_LPTIM16_IC_POLARITY_INVERT + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_IC_SetInputPolarity(LPTIM16_Type *LPTIM16x, uint32_t polarity, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM16_CHANNEL_1: + MODIFY_REG(LPTIM16x->CCSR, (0x1U << 16U), (polarity << 0U)); + break; + case FL_LPTIM16_CHANNEL_2: + MODIFY_REG(LPTIM16x->CCSR, (0x1U << 17U), (polarity << 1U)); + break; + } +} + +/** + * @brief Get Input Capture Channel Input Polarity + * @rmtoll CCSR CCP FL_LPTIM16_IC_GetInputPolarity + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_IC_POLARITY_NORMAL + * @arg @ref FL_LPTIM16_IC_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IC_GetInputPolarity(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM16_CHANNEL_1: + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, (0x1U << 16U)) >> 0U); + case FL_LPTIM16_CHANNEL_2: + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, (0x1U << 17U)) >> 1U); + default: + return 0; + } +} + +/** + * @brief Enable Channel Input Digital Filter + * @rmtoll CCSR FL_LPTIM16_EnableDigitalFilter + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_EnableDigitalFilter(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + SET_BIT(LPTIM16x->CCSR, ((channel & 0x3) << 0xcU)); +} + +/** + * @brief Disable Channel Input Digital Filter + * @rmtoll CCSR FL_LPTIM16_DisableDigitalFilter + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_DisableDigitalFilter(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + CLEAR_BIT(LPTIM16x->CCSR, ((channel & 0x3) << 0xcU)); +} + +/** + * @brief Get Channel Input Digital Filter Enable Status + * @rmtoll CCSR FL_LPTIM16_IsEnabledDigitalFilter + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IsEnabledDigitalFilter(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, ((channel & 0x3) << 0xcU)) == ((channel & 0x3) << 0xcU)); +} + +/** + * @brief Set Channel 1 Input Prescaler + * @rmtoll CCSR CAP1PSC FL_LPTIM16_IC_WriteChannel1Prescaler + * @param LPTIM16x LPTIM16 instance + * @param psc + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_IC_WriteChannel1Prescaler(LPTIM16_Type *LPTIM16x, uint32_t psc) +{ + MODIFY_REG(LPTIM16x->CCSR, (0x3fU << 26U), (psc << 26U)); +} + +/** + * @brief Get Channel 1 Input Prescaler Setting + * @rmtoll CCSR CAP1PSC FL_LPTIM16_IC_ReadChannel1Prescaler + * @param LPTIM16x LPTIM16 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IC_ReadChannel1Prescaler(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, (0x3fU << 26U)) >> 26U); +} + +/** + * @brief Set Channel Operation Mode + * @rmtoll CCSR CCS FL_LPTIM16_SetChannelMode + * @param LPTIM16x LPTIM16 instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_MODE_DISABLE + * @arg @ref FL_LPTIM16_CHANNEL_MODE_INPUT + * @arg @ref FL_LPTIM16_CHANNEL_MODE_OUTPUT + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_SetChannelMode(LPTIM16_Type *LPTIM16x, uint32_t mode, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM16_CHANNEL_1: + MODIFY_REG(LPTIM16x->CCSR, (0x3U << 0U), (mode << 0U)); + break; + case FL_LPTIM16_CHANNEL_2: + MODIFY_REG(LPTIM16x->CCSR, (0x3U << 2U), (mode << 2U)); + break; + } +} + +/** + * @brief Get Channel Operation Mode + * @rmtoll CCSR CCS FL_LPTIM16_GetChannelMode + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_MODE_DISABLE + * @arg @ref FL_LPTIM16_CHANNEL_MODE_INPUT + * @arg @ref FL_LPTIM16_CHANNEL_MODE_OUTPUT + */ +__STATIC_INLINE uint32_t FL_LPTIM16_GetChannelMode(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM16_CHANNEL_1: + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, (0x3U << 0U)) >> 0U); + case FL_LPTIM16_CHANNEL_2: + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, (0x3U << 2U)) >> 2U); + default: + return 0; + } +} + +/** + * @brief Get Channel Captured Edge + * @rmtoll CCSR CAPEDGE FL_LPTIM16_IC_GetCapturedEdge + * @param LPTIM16x LPTIM16 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_CHANNEL_1 + * @arg @ref FL_LPTIM16_CHANNEL_2 + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_IC_CAPCTURED_EDGE_RISING + * @arg @ref FL_LPTIM16_IC_CAPCTURED_EDGE_FALLING + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IC_GetCapturedEdge(LPTIM16_Type *LPTIM16x, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM16_CHANNEL_1: + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, (0x1U << 20U)) >> 0U); + case FL_LPTIM16_CHANNEL_2: + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, (0x1U << 21U)) >> 1U); + default: + return 0; + } +} + +/** + * @brief Set Channel 1 Capture Source + * @rmtoll CCSR CAP1SSEL FL_LPTIM16_IC_SetChannel1CaptureSource + * @param LPTIM16x LPTIM16 instance + * @param source This parameter can be one of the following values: + * @arg @ref FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP0 + * @arg @ref FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP1 + * @arg @ref FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP2 + * @arg @ref FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP3 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM16_IC_SetChannel1CaptureSource(LPTIM16_Type *LPTIM16x, uint32_t source) +{ + MODIFY_REG(LPTIM16x->CCSR, LPTIM16_CCSR_CAP1SSEL_Msk, source); +} + +/** + * @brief Get Channel 1 Capture Source Setting + * @rmtoll CCSR CAP1SSEL FL_LPTIM16_IC_GetChannel1CaptureSource + * @param LPTIM16x LPTIM16 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP0 + * @arg @ref FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP1 + * @arg @ref FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP2 + * @arg @ref FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP3 + */ +__STATIC_INLINE uint32_t FL_LPTIM16_IC_GetChannel1CaptureSource(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CCSR, LPTIM16_CCSR_CAP1SSEL_Msk)); +} + +/** + * @brief Read LPTIM16 Counter Value + * @rmtoll CNT FL_LPTIM16_ReadCounter + * @param LPTIM16x LPTIM16 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM16_ReadCounter(LPTIM16_Type *LPTIM16x) +{ + return (uint32_t)(READ_BIT(LPTIM16x->CNT, (0xffffU << 0U)) >> 0U); +} + +/** + * @} + */ + +/** @defgroup LPTIM16_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_LPTIM16_DeInit(LPTIM16_Type *LPTIM16x); +FL_ErrorStatus FL_LPTIM16_Init(LPTIM16_Type *LPTIM16x, FL_LPTIM16_InitTypeDef *init); +void FL_LPTIM16_StructInit(FL_LPTIM16_InitTypeDef *init); +FL_ErrorStatus FL_LPTIM16_IC_Init(LPTIM16_Type *LPTIM16x, uint32_t channel, FL_LPTIM16_IC_InitTypeDef *ic_init); +void FL_LPTIM16_IC_StructInit(FL_LPTIM16_IC_InitTypeDef *ic_init); +FL_ErrorStatus FL_LPTIM16_OC_Init(LPTIM16_Type *LPTIM16x, uint32_t channel, FL_LPTIM16_OC_InitTypeDef *oc_init); +void FL_LPTIM16_OC_StructInit(FL_LPTIM16_OC_InitTypeDef *oc_init); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_LPTIM16_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.1 @ 2020-12-14*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lptim32.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lptim32.h new file mode 100644 index 0000000..38721ae --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lptim32.h @@ -0,0 +1,1296 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_lptim32.h + * @author FMSH Application Team + * @brief Head file of LPTIM32 FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_LPTIM32_H +#define __FM33LG0XX_FL_LPTIM32_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup LPTIM32 LPTIM32 + * @brief LPTIM32 FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup LPTIM32_FL_ES_INIT LPTIM32 Exported Init structures + * @{ + */ + +/** + * @brief FL LPTIM32 Init Sturcture definition + */ + +/** + * @brief LPTIM32 Init Sturcture Definition + */ +typedef struct +{ + /* 内部时钟源 */ + uint32_t clockSource; + + /* 预分频器的时钟源 可选择内部时钟, 也可选择外部时钟 */ + uint32_t prescalerClockSource; + + /* 预分频系数 */ + uint32_t prescaler; + + /* 重装值 */ + uint32_t autoReload; + + /* 定时器工作模式选择 */ + uint32_t mode; + + /* 单次计数使能 */ + uint32_t onePulseMode; + + /* ETR异步计数边沿 */ + uint32_t countEdge; + + /* ETR触发计数边沿 */ + uint32_t triggerEdge; + +} FL_LPTIM32_InitTypeDef; + +/** + * @brief LPTIM32 Output Compare Configuration Structure Definition + */ +typedef struct +{ + /* 比较值 */ + uint32_t compareValue; + + /* 比较输出极性 */ + uint32_t OCPolarity; + +} FL_LPTIM32_OC_InitTypeDef; + +/** + * @brief LPTIM32 Input Capture Configuration Structure Definition + */ +typedef struct +{ + /* 通道1捕获源 */ + uint32_t ICSource; + + /* 输入捕获极性 */ + uint32_t ICEdge; + +} FL_LPTIM32_IC_InitTypeDef; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup LPTIM32_FL_Exported_Constants LPTIM32 Exported Constants + * @{ + */ + +#define LPTIM32_CR_EN_Pos (0U) +#define LPTIM32_CR_EN_Msk (0x1U << LPTIM32_CR_EN_Pos) +#define LPTIM32_CR_EN LPTIM32_CR_EN_Msk + +#define LPTIM32_CFGR_ETR_AFEN_Pos (24U) +#define LPTIM32_CFGR_ETR_AFEN_Msk (0x1U << LPTIM32_CFGR_ETR_AFEN_Pos) +#define LPTIM32_CFGR_ETR_AFEN LPTIM32_CFGR_ETR_AFEN_Msk + +#define LPTIM32_CFGR_PSCSEL_Pos (14U) +#define LPTIM32_CFGR_PSCSEL_Msk (0x1U << LPTIM32_CFGR_PSCSEL_Pos) +#define LPTIM32_CFGR_PSCSEL LPTIM32_CFGR_PSCSEL_Msk + +#define LPTIM32_CFGR_DIVSEL_Pos (10U) +#define LPTIM32_CFGR_DIVSEL_Msk (0x7U << LPTIM32_CFGR_DIVSEL_Pos) +#define LPTIM32_CFGR_DIVSEL LPTIM32_CFGR_DIVSEL_Msk + +#define LPTIM32_CFGR_EDGESEL_Pos (7U) +#define LPTIM32_CFGR_EDGESEL_Msk (0x1U << LPTIM32_CFGR_EDGESEL_Pos) +#define LPTIM32_CFGR_EDGESEL LPTIM32_CFGR_EDGESEL_Msk + +#define LPTIM32_CFGR_TRIGCFG_Pos (5U) +#define LPTIM32_CFGR_TRIGCFG_Msk (0x3U << LPTIM32_CFGR_TRIGCFG_Pos) +#define LPTIM32_CFGR_TRIGCFG LPTIM32_CFGR_TRIGCFG_Msk + +#define LPTIM32_CFGR_ONST_Pos (2U) +#define LPTIM32_CFGR_ONST_Msk (0x1U << LPTIM32_CFGR_ONST_Pos) +#define LPTIM32_CFGR_ONST LPTIM32_CFGR_ONST_Msk + +#define LPTIM32_CFGR_TMOD_Pos (0U) +#define LPTIM32_CFGR_TMOD_Msk (0x3U << LPTIM32_CFGR_TMOD_Pos) +#define LPTIM32_CFGR_TMOD LPTIM32_CFGR_TMOD_Msk + +#define LPTIM32_IER_CCIE_Pos (0U) +#define LPTIM32_IER_CCIE_Msk (0xfU << LPTIM32_IER_CCIE_Pos) +#define LPTIM32_IER_CCIE LPTIM32_IER_CCIE_Msk + +#define LPTIM32_IER_OVIE_Pos (6U) +#define LPTIM32_IER_OVIE_Msk (0x1U << LPTIM32_IER_OVIE_Pos) +#define LPTIM32_IER_OVIE LPTIM32_IER_OVIE_Msk + +#define LPTIM32_IER_TRIGIE_Pos (7U) +#define LPTIM32_IER_TRIGIE_Msk (0x1U << LPTIM32_IER_TRIGIE_Pos) +#define LPTIM32_IER_TRIGIE LPTIM32_IER_TRIGIE_Msk + +#define LPTIM32_IER_OVRIE_Pos (8U) +#define LPTIM32_IER_OVRIE_Msk (0xfU << LPTIM32_IER_OVRIE_Pos) +#define LPTIM32_IER_OVRIE LPTIM32_IER_OVRIE_Msk + +#define LPTIM32_ISR_CCIF_Pos (0U) +#define LPTIM32_ISR_CCIF_Msk (0xfU << LPTIM32_ISR_CCIF_Pos) +#define LPTIM32_ISR_CCIF LPTIM32_ISR_CCIF_Msk + +#define LPTIM32_ISR_OVIF_Pos (6U) +#define LPTIM32_ISR_OVIF_Msk (0x1U << LPTIM32_ISR_OVIF_Pos) +#define LPTIM32_ISR_OVIF LPTIM32_ISR_OVIF_Msk + +#define LPTIM32_ISR_TRIGIF_Pos (7U) +#define LPTIM32_ISR_TRIGIF_Msk (0x1U << LPTIM32_ISR_TRIGIF_Pos) +#define LPTIM32_ISR_TRIGIF LPTIM32_ISR_TRIGIF_Msk + +#define LPTIM32_ISR_OVRIF_Pos (8U) +#define LPTIM32_ISR_OVRIF_Msk (0xfU << LPTIM32_ISR_OVRIF_Pos) +#define LPTIM32_ISR_OVRIF LPTIM32_ISR_OVRIF_Msk + +#define LPTIM32_CCSR_CAPCFG_Pos (8U) +#define LPTIM32_CCSR_CAPCFG_Msk (0x3U << LPTIM32_CCSR_CAPCFG_Pos) +#define LPTIM32_CCSR_CAPCFG LPTIM32_CCSR_CAPCFG_Msk + +#define LPTIM32_CCSR_CCS_Pos (0U) +#define LPTIM32_CCSR_CCS_Msk (0x3U << LPTIM32_CCSR_CCS_Pos) +#define LPTIM32_CCSR_CCS LPTIM32_CCSR_CCS_Msk + +#define LPTIM32_CCSR_CAPEDGE_Pos (20U) +#define LPTIM32_CCSR_CAPEDGE_Msk (0x1U << LPTIM32_CCSR_CAPEDGE_Pos) +#define LPTIM32_CCSR_CAPEDGE LPTIM32_CCSR_CAPEDGE_Msk + +#define LPTIM32_CCSR_CAP1SSEL_Pos (24U) +#define LPTIM32_CCSR_CAP1SSEL_Msk (0x3U << LPTIM32_CCSR_CAP1SSEL_Pos) +#define LPTIM32_CCSR_CAP1SSEL LPTIM32_CCSR_CAP1SSEL_Msk + +#define LPTIM32_CCSR_POLAR_Pos (16U) +#define LPTIM32_CCSR_POLAR_Msk (0x1U << LPTIM32_CCSR_POLAR_Pos) +#define LPTIM32_CCSR_POLAR LPTIM32_CCSR_POLAR_Msk + +#define LPTIM32_CFGR_MMS_Pos (16U) +#define LPTIM32_CFGR_MMS_Msk (0x7U << LPTIM32_CFGR_MMS_Pos) +#define LPTIM32_CFGR_MMS LPTIM32_CFGR_MMS_Msk + + + +#define FL_LPTIM32_CHANNEL_1 (0x1U << 0U) +#define FL_LPTIM32_CHANNEL_2 (0x1U << 1U) +#define FL_LPTIM32_CHANNEL_3 (0x1U << 2U) +#define FL_LPTIM32_CHANNEL_4 (0x1U << 3U) + + + +#define FL_LPTIM32_CLK_SOURCE_INTERNAL (0x0U << LPTIM32_CFGR_PSCSEL_Pos) +#define FL_LPTIM32_CLK_SOURCE_EXTERNAL (0x1U << LPTIM32_CFGR_PSCSEL_Pos) + + +#define FL_LPTIM32_PSC_DIV1 (0x0U << LPTIM32_CFGR_DIVSEL_Pos) +#define FL_LPTIM32_PSC_DIV2 (0x1U << LPTIM32_CFGR_DIVSEL_Pos) +#define FL_LPTIM32_PSC_DIV4 (0x2U << LPTIM32_CFGR_DIVSEL_Pos) +#define FL_LPTIM32_PSC_DIV8 (0x3U << LPTIM32_CFGR_DIVSEL_Pos) +#define FL_LPTIM32_PSC_DIV16 (0x4U << LPTIM32_CFGR_DIVSEL_Pos) +#define FL_LPTIM32_PSC_DIV32 (0x5U << LPTIM32_CFGR_DIVSEL_Pos) +#define FL_LPTIM32_PSC_DIV64 (0x6U << LPTIM32_CFGR_DIVSEL_Pos) +#define FL_LPTIM32_PSC_DIV128 (0x7U << LPTIM32_CFGR_DIVSEL_Pos) + + +#define FL_LPTIM32_ETR_COUNT_EDGE_RISING (0x0U << LPTIM32_CFGR_EDGESEL_Pos) +#define FL_LPTIM32_ETR_COUNT_EDGE_FALLING (0x1U << LPTIM32_CFGR_EDGESEL_Pos) + + +#define FL_LPTIM32_ETR_TRIGGER_EDGE_RISING (0x0U << LPTIM32_CFGR_TRIGCFG_Pos) +#define FL_LPTIM32_ETR_TRIGGER_EDGE_FALLING (0x1U << LPTIM32_CFGR_TRIGCFG_Pos) +#define FL_LPTIM32_ETR_TRIGGER_EDGE_BOTH (0x2U << LPTIM32_CFGR_TRIGCFG_Pos) + + +#define FL_LPTIM32_ONE_PULSE_MODE_CONTINUOUS (0x0U << LPTIM32_CFGR_ONST_Pos) +#define FL_LPTIM32_ONE_PULSE_MODE_SINGLE (0x1U << LPTIM32_CFGR_ONST_Pos) + + +#define FL_LPTIM32_OPERATION_MODE_NORMAL (0x0U << LPTIM32_CFGR_TMOD_Pos) +#define FL_LPTIM32_OPERATION_MODE_EXTERNAL_TRIGGER_CNT (0x1U << LPTIM32_CFGR_TMOD_Pos) +#define FL_LPTIM32_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT (0x2U << LPTIM32_CFGR_TMOD_Pos) +#define FL_LPTIM32_OPERATION_MODE_TIMEOUT (0x3U << LPTIM32_CFGR_TMOD_Pos) + + +#define FL_LPTIM32_IC_EDGE_RISING (0x0U << LPTIM32_CCSR_CAPCFG_Pos) +#define FL_LPTIM32_IC_EDGE_FALLING (0x1U << LPTIM32_CCSR_CAPCFG_Pos) +#define FL_LPTIM32_IC_EDGE_BOTH (0x2U << LPTIM32_CCSR_CAPCFG_Pos) + + +#define FL_LPTIM32_CHANNEL_MODE_DISABLE (0x0U << LPTIM32_CCSR_CCS_Pos) +#define FL_LPTIM32_CHANNEL_MODE_INPUT (0x1U << LPTIM32_CCSR_CCS_Pos) +#define FL_LPTIM32_CHANNEL_MODE_OUTPUT (0x2U << LPTIM32_CCSR_CCS_Pos) + + +#define FL_LPTIM32_IC_CAPTURED_EDGE_RISING (0x0U << LPTIM32_CCSR_CAPEDGE_Pos) +#define FL_LPTIM32_IC_CAPTURED_EDGE_FALLING (0x1U << LPTIM32_CCSR_CAPEDGE_Pos) + +#define FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP0 (0x0U << LPTIM32_CCSR_CAP1SSEL_Pos) +#define FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP1 (0x1U << LPTIM32_CCSR_CAP1SSEL_Pos) +#define FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP2 (0x2U << LPTIM32_CCSR_CAP1SSEL_Pos) +#define FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP3 (0x3U << LPTIM32_CCSR_CAP1SSEL_Pos) + + +#define FL_LPTIM32_OC_POLARITY_NORMAL (0x0U << LPTIM32_CCSR_POLAR_Pos) +#define FL_LPTIM32_OC_POLARITY_INVERT (0x1U << LPTIM32_CCSR_POLAR_Pos) + + +#define FL_LPTIM32_TRGO_ENABLE (0x1U << LPTIM32_CFGR_MMS_Pos) +#define FL_LPTIM32_TRGO_UPDATE (0x2U << LPTIM32_CFGR_MMS_Pos) +#define FL_LPTIM32_TRGO_OC1REF (0x3U << LPTIM32_CFGR_MMS_Pos) +#define FL_LPTIM32_TRGO_IC1 (0x4U << LPTIM32_CFGR_MMS_Pos) +#define FL_LPTIM32_TRGO_IC2 (0x5U << LPTIM32_CFGR_MMS_Pos) +#define FL_LPTIM32_TRGO_IC3 (0x6U << LPTIM32_CFGR_MMS_Pos) +#define FL_LPTIM32_TRGO_IC4 (0x7U << LPTIM32_CFGR_MMS_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup LPTIM32_FL_Exported_Functions LPTIM32 Exported Functions + * @{ + */ + +/** + * @brief Enable LPTIM32 + * @rmtoll CR EN FL_LPTIM32_Enable + * @param LPTIM32x LPTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_Enable(LPTIM32_Type *LPTIM32x) +{ + SET_BIT(LPTIM32x->CR, LPTIM32_CR_EN_Msk); +} + +/** + * @brief Disable LPTIM32 + * @rmtoll CR EN FL_LPTIM32_Disable + * @param LPTIM32x LPTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_Disable(LPTIM32_Type *LPTIM32x) +{ + CLEAR_BIT(LPTIM32x->CR, LPTIM32_CR_EN_Msk); +} + +/** + * @brief Get LPTIM32 Enable Status + * @rmtoll CR EN FL_LPTIM32_IsEnabled + * @param LPTIM32x LPTIM32 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IsEnabled(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CR, LPTIM32_CR_EN_Msk) == LPTIM32_CR_EN_Msk); +} + +/** + * @brief Enable External Input Analog Filter + * @rmtoll CFGR ETR_AFEN FL_LPTIM32_EnableETRFilter + * @param LPTIM32x LPTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_EnableETRFilter(LPTIM32_Type *LPTIM32x) +{ + SET_BIT(LPTIM32x->CFGR, LPTIM32_CFGR_ETR_AFEN_Msk); +} + +/** + * @brief Disable External Input Analog Filter + * @rmtoll CFGR ETR_AFEN FL_LPTIM32_DisableETRFilter + * @param LPTIM32x LPTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_DisableETRFilter(LPTIM32_Type *LPTIM32x) +{ + CLEAR_BIT(LPTIM32x->CFGR, LPTIM32_CFGR_ETR_AFEN_Msk); +} + +/** + * @brief Get External Input Analog Filter Enable Status + * @rmtoll CFGR ETR_AFEN FL_LPTIM32_IsEnabledETRFilter + * @param LPTIM32x LPTIM32 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IsEnabledETRFilter(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CFGR, LPTIM32_CFGR_ETR_AFEN_Msk) == LPTIM32_CFGR_ETR_AFEN_Msk); +} + +/** + * @brief Set Clock Source + * @rmtoll CFGR PSCSEL FL_LPTIM32_SetClockSource + * @param LPTIM32x LPTIM32 instance + * @param source This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CLK_SOURCE_INTERNAL + * @arg @ref FL_LPTIM32_CLK_SOURCE_EXTERNAL + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_SetClockSource(LPTIM32_Type *LPTIM32x, uint32_t source) +{ + MODIFY_REG(LPTIM32x->CFGR, LPTIM32_CFGR_PSCSEL_Msk, source); +} + +/** + * @brief Get Clock Source Setting + * @rmtoll CFGR PSCSEL FL_LPTIM32_GetClockSource + * @param LPTIM32x LPTIM32 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM32_CLK_SOURCE_INTERNAL + * @arg @ref FL_LPTIM32_CLK_SOURCE_EXTERNAL + */ +__STATIC_INLINE uint32_t FL_LPTIM32_GetClockSource(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CFGR, LPTIM32_CFGR_PSCSEL_Msk)); +} + +/** + * @brief Set Counter Clock Prescaler + * @rmtoll CFGR DIVSEL FL_LPTIM32_SetPrescaler + * @param LPTIM32x LPTIM32 instance + * @param psc This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_PSC_DIV1 + * @arg @ref FL_LPTIM32_PSC_DIV2 + * @arg @ref FL_LPTIM32_PSC_DIV4 + * @arg @ref FL_LPTIM32_PSC_DIV8 + * @arg @ref FL_LPTIM32_PSC_DIV16 + * @arg @ref FL_LPTIM32_PSC_DIV32 + * @arg @ref FL_LPTIM32_PSC_DIV64 + * @arg @ref FL_LPTIM32_PSC_DIV128 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_SetPrescaler(LPTIM32_Type *LPTIM32x, uint32_t psc) +{ + MODIFY_REG(LPTIM32x->CFGR, LPTIM32_CFGR_DIVSEL_Msk, psc); +} + +/** + * @brief Get Counter Clock Prescaler Setting + * @rmtoll CFGR DIVSEL FL_LPTIM32_GetPrescaler + * @param LPTIM32x LPTIM32 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM32_PSC_DIV1 + * @arg @ref FL_LPTIM32_PSC_DIV2 + * @arg @ref FL_LPTIM32_PSC_DIV4 + * @arg @ref FL_LPTIM32_PSC_DIV8 + * @arg @ref FL_LPTIM32_PSC_DIV16 + * @arg @ref FL_LPTIM32_PSC_DIV32 + * @arg @ref FL_LPTIM32_PSC_DIV64 + * @arg @ref FL_LPTIM32_PSC_DIV128 + */ +__STATIC_INLINE uint32_t FL_LPTIM32_GetPrescaler(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CFGR, LPTIM32_CFGR_DIVSEL_Msk)); +} + +/** + * @brief Set ETR Count Edge + * @rmtoll CFGR EDGESEL FL_LPTIM32_SetETRCountEdge + * @param LPTIM32x LPTIM32 instance + * @param edge This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_ETR_COUNT_EDGE_RISING + * @arg @ref FL_LPTIM32_ETR_COUNT_EDGE_FALLING + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_SetETRCountEdge(LPTIM32_Type *LPTIM32x, uint32_t edge) +{ + MODIFY_REG(LPTIM32x->CFGR, LPTIM32_CFGR_EDGESEL_Msk, edge); +} + +/** + * @brief Get ETR Count Edge Setting + * @rmtoll CFGR EDGESEL FL_LPTIM32_GetETRCountEdge + * @param LPTIM32x LPTIM32 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM32_ETR_COUNT_EDGE_RISING + * @arg @ref FL_LPTIM32_ETR_COUNT_EDGE_FALLING + */ +__STATIC_INLINE uint32_t FL_LPTIM32_GetETRCountEdge(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CFGR, LPTIM32_CFGR_EDGESEL_Msk)); +} + +/** + * @brief Set ETR Trigger Edge + * @rmtoll CFGR TRIGCFG FL_LPTIM32_SetETRTriggerEdge + * @param LPTIM32x LPTIM32 instance + * @param edge This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_ETR_TRIGGER_EDGE_RISING + * @arg @ref FL_LPTIM32_ETR_TRIGGER_EDGE_FALLING + * @arg @ref FL_LPTIM32_ETR_TRIGGER_EDGE_BOTH + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_SetETRTriggerEdge(LPTIM32_Type *LPTIM32x, uint32_t edge) +{ + MODIFY_REG(LPTIM32x->CFGR, LPTIM32_CFGR_TRIGCFG_Msk, edge); +} + +/** + * @brief Get ETR Trigger Edge Setting + * @rmtoll CFGR TRIGCFG FL_LPTIM32_GetETRTriggerEdge + * @param LPTIM32x LPTIM32 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM32_ETR_TRIGGER_EDGE_RISING + * @arg @ref FL_LPTIM32_ETR_TRIGGER_EDGE_FALLING + * @arg @ref FL_LPTIM32_ETR_TRIGGER_EDGE_BOTH + */ +__STATIC_INLINE uint32_t FL_LPTIM32_GetETRTriggerEdge(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CFGR, LPTIM32_CFGR_TRIGCFG_Msk)); +} + +/** + * @brief Set One Pulse Mode + * @rmtoll CFGR ONST FL_LPTIM32_SetOnePulseMode + * @param LPTIM32x LPTIM32 instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_ONE_PULSE_MODE_CONTINUOUS + * @arg @ref FL_LPTIM32_ONE_PULSE_MODE_SINGLE + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_SetOnePulseMode(LPTIM32_Type *LPTIM32x, uint32_t mode) +{ + MODIFY_REG(LPTIM32x->CFGR, LPTIM32_CFGR_ONST_Msk, mode); +} + +/** + * @brief Get One Pulse Mode Setting + * @rmtoll CFGR ONST FL_LPTIM32_GetOnePulseMode + * @param LPTIM32x LPTIM32 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM32_ONE_PULSE_MODE_CONTINUOUS + * @arg @ref FL_LPTIM32_ONE_PULSE_MODE_SINGLE + */ +__STATIC_INLINE uint32_t FL_LPTIM32_GetOnePulseMode(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CFGR, LPTIM32_CFGR_ONST_Msk)); +} + +/** + * @brief Set Operation Mode + * @rmtoll CFGR TMOD FL_LPTIM32_SetOperationMode + * @param LPTIM32x LPTIM32 instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_OPERATION_MODE_NORMAL + * @arg @ref FL_LPTIM32_OPERATION_MODE_EXTERNAL_TRIGGER_CNT + * @arg @ref FL_LPTIM32_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT + * @arg @ref FL_LPTIM32_OPERATION_MODE_TIMEOUT + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_SetOperationMode(LPTIM32_Type *LPTIM32x, uint32_t mode) +{ + MODIFY_REG(LPTIM32x->CFGR, LPTIM32_CFGR_TMOD_Msk, mode); +} + +/** + * @brief Get Operation Mode Setting + * @rmtoll CFGR TMOD FL_LPTIM32_GetOperationMode + * @param LPTIM32x LPTIM32 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM32_OPERATION_MODE_NORMAL + * @arg @ref FL_LPTIM32_OPERATION_MODE_EXTERNAL_TRIGGER_CNT + * @arg @ref FL_LPTIM32_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT + * @arg @ref FL_LPTIM32_OPERATION_MODE_TIMEOUT + */ +__STATIC_INLINE uint32_t FL_LPTIM32_GetOperationMode(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CFGR, LPTIM32_CFGR_TMOD_Msk)); +} + +/** + * @brief Set Channel 1 Output Compare Value + * @rmtoll CCR1 FL_LPTIM32_WriteCompareCH1 + * @param LPTIM32x LPTIM32 instance + * @param compareVal + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_WriteCompareCH1(LPTIM32_Type *LPTIM32x, uint32_t compareVal) +{ + MODIFY_REG(LPTIM32x->CCR1, (0xffffffffU << 0U), (compareVal << 0U)); +} + +/** + * @brief Get Channel 1 Output Compare Value + * @rmtoll CCR1 FL_LPTIM32_ReadCompareCH1 + * @param LPTIM32x LPTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM32_ReadCompareCH1(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CCR1, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Set Channel 2 Output Compare Value + * @rmtoll CCR2 FL_LPTIM32_WriteCompareCH2 + * @param LPTIM32x LPTIM32 instance + * @param compareVal + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_WriteCompareCH2(LPTIM32_Type *LPTIM32x, uint32_t compareVal) +{ + MODIFY_REG(LPTIM32x->CCR2, (0xffffffffU << 0U), (compareVal << 0U)); +} + +/** + * @brief Get Channel 2 Output Compare Value + * @rmtoll CCR2 FL_LPTIM32_ReadCompareCH2 + * @param LPTIM32x LPTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM32_ReadCompareCH2(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CCR2, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Set Channel 3 Output Compare Value + * @rmtoll CCR3 FL_LPTIM32_WriteCompareCH3 + * @param LPTIM32x LPTIM32 instance + * @param compareVal + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_WriteCompareCH3(LPTIM32_Type *LPTIM32x, uint32_t compareVal) +{ + MODIFY_REG(LPTIM32x->CCR3, (0xffffffffU << 0U), (compareVal << 0U)); +} + +/** + * @brief Get Channel 3 Output Compare Value + * @rmtoll CCR3 FL_LPTIM32_ReadCompareCH3 + * @param LPTIM32x LPTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM32_ReadCompareCH3(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CCR3, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Set Channel 4 Output Compare Value + * @rmtoll CCR4 FL_LPTIM32_WriteCompareCH4 + * @param LPTIM32x LPTIM32 instance + * @param compareVal + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_WriteCompareCH4(LPTIM32_Type *LPTIM32x, uint32_t compareVal) +{ + MODIFY_REG(LPTIM32x->CCR4, (0xffffffffU << 0U), (compareVal << 0U)); +} + +/** + * @brief Get Channel 4 Output Compare Value + * @rmtoll CCR4 FL_LPTIM32_ReadCompareCH4 + * @param LPTIM32x LPTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM32_ReadCompareCH4(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CCR4, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Get Channel 1 Input Capture Value + * @rmtoll CCR1 FL_LPTIM32_ReadCaptureCH1 + * @param LPTIM32x LPTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM32_ReadCaptureCH1(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CCR1, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Get Channel 2 Input Capture Value + * @rmtoll CCR2 FL_LPTIM32_ReadCaptureCH2 + * @param LPTIM32x LPTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM32_ReadCaptureCH2(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CCR2, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Get Channel 3 Input Capture Value + * @rmtoll CCR3 FL_LPTIM32_ReadCaptureCH3 + * @param LPTIM32x LPTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM32_ReadCaptureCH3(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CCR3, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Get Channel 4 Input Capture Value + * @rmtoll CCR4 FL_LPTIM32_ReadCaptureCH4 + * @param LPTIM32x LPTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM32_ReadCaptureCH4(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CCR4, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Enable Channel Capture/Compare Interrupt + * @rmtoll IER CCIE FL_LPTIM32_EnableIT_CC + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_EnableIT_CC(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + SET_BIT(LPTIM32x->IER, ((channel & 0xf) << 0x0U)); +} + +/** + * @brief Enable Update Event Interrupt + * @rmtoll IER OVIE FL_LPTIM32_EnableIT_Update + * @param LPTIM32x LPTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_EnableIT_Update(LPTIM32_Type *LPTIM32x) +{ + SET_BIT(LPTIM32x->IER, LPTIM32_IER_OVIE_Msk); +} + +/** + * @brief Enable External Trigger Interrupt + * @rmtoll IER TRIGIE FL_LPTIM32_EnableIT_Trigger + * @param LPTIM32x LPTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_EnableIT_Trigger(LPTIM32_Type *LPTIM32x) +{ + SET_BIT(LPTIM32x->IER, LPTIM32_IER_TRIGIE_Msk); +} + +/** + * @brief Enable Channel Capture Overflow Interrupt + * @rmtoll IER OVRIE FL_LPTIM32_EnableIT_CCOverflow + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_EnableIT_CCOverflow(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + SET_BIT(LPTIM32x->IER, ((channel & 0xf) << 0x8U)); +} + +/** + * @brief Disable Channel Capture/Compare Interrupt + * @rmtoll IER CCIE FL_LPTIM32_DisableIT_CC + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_DisableIT_CC(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + CLEAR_BIT(LPTIM32x->IER, ((channel & 0xf) << 0x0U)); +} + +/** + * @brief Disable Update Event Interrupt + * @rmtoll IER OVIE FL_LPTIM32_DisableIT_Update + * @param LPTIM32x LPTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_DisableIT_Update(LPTIM32_Type *LPTIM32x) +{ + CLEAR_BIT(LPTIM32x->IER, LPTIM32_IER_OVIE_Msk); +} + +/** + * @brief Disable External Trigger Interrupt + * @rmtoll IER TRIGIE FL_LPTIM32_DisableIT_Trigger + * @param LPTIM32x LPTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_DisableIT_Trigger(LPTIM32_Type *LPTIM32x) +{ + CLEAR_BIT(LPTIM32x->IER, LPTIM32_IER_TRIGIE_Msk); +} + +/** + * @brief Disable Channel Capture Overflow Interrupt + * @rmtoll IER OVRIE FL_LPTIM32_DisableIT_CCOverflow + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_DisableIT_CCOverflow(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + CLEAR_BIT(LPTIM32x->IER, ((channel & 0xf) << 0x8U)); +} + +/** + * @brief Get Channel Capture/Compare Interrupt Enable Status + * @rmtoll IER CCIE FL_LPTIM32_IsEnabledIT_CC + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IsEnabledIT_CC(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + return (uint32_t)(READ_BIT(LPTIM32x->IER, ((channel & 0xf) << 0x0U)) == ((channel & 0xf) << 0x0U)); +} + +/** + * @brief Get Counter Update Event Interrupt Enable Status + * @rmtoll IER OVIE FL_LPTIM32_IsEnabledIT_Update + * @param LPTIM32x LPTIM32 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IsEnabledIT_Update(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->IER, LPTIM32_IER_OVIE_Msk) == LPTIM32_IER_OVIE_Msk); +} + +/** + * @brief Get External Trigger Interrupt Enable Status + * @rmtoll IER TRIGIE FL_LPTIM32_IsEnabledIT_Trigger + * @param LPTIM32x LPTIM32 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IsEnabledIT_Trigger(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->IER, LPTIM32_IER_TRIGIE_Msk) == LPTIM32_IER_TRIGIE_Msk); +} + +/** + * @brief Get Channel Capture Overflow Interrupt Enable Status + * @rmtoll IER OVRIE FL_LPTIM32_IsEnabledIT_CCOverflow + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IsEnabledIT_CCOverflow(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + return (uint32_t)(READ_BIT(LPTIM32x->IER, ((channel & 0xf) << 0x8U)) == ((channel & 0xf) << 0x8U)); +} + +/** + * @brief Get Capture/Compare Channel Interrupt Flag + * @rmtoll ISR CCIF FL_LPTIM32_IsActiveFlag_CC + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IsActiveFlag_CC(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + return (uint32_t)(READ_BIT(LPTIM32x->ISR, ((channel & 0xf) << 0x0U)) == ((channel & 0xf) << 0x0U)); +} + +/** + * @brief Get Update Event Interrupt Flag + * @rmtoll ISR OVIF FL_LPTIM32_IsActiveFlag_Update + * @param LPTIM32x LPTIM32 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IsActiveFlag_Update(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->ISR, LPTIM32_ISR_OVIF_Msk) == (LPTIM32_ISR_OVIF_Msk)); +} + +/** + * @brief Get External Trigger Interrupt Flag + * @rmtoll ISR TRIGIF FL_LPTIM32_IsActiveFlag_Trigger + * @param LPTIM32x LPTIM32 instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IsActiveFlag_Trigger(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->ISR, LPTIM32_ISR_TRIGIF_Msk) == (LPTIM32_ISR_TRIGIF_Msk)); +} + +/** + * @brief Get Channel Capture Overflow Interrupt Flag + * @rmtoll ISR OVRIF FL_LPTIM32_IsActiveFlag_CCOverflow + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IsActiveFlag_CCOverflow(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + return (uint32_t)(READ_BIT(LPTIM32x->ISR, ((channel & 0xf) << 0x8U)) == ((channel & 0xf) << 0x8U)); +} + +/** + * @brief Clear Capture/Compare Channel Interrupt Flag + * @rmtoll ISR CCIF FL_LPTIM32_ClearFlag_CC + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_ClearFlag_CC(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + WRITE_REG(LPTIM32x->ISR, ((channel & 0xf) << 0x0U)); +} + +/** + * @brief Clear Update Event Interrupt Flag + * @rmtoll ISR OVIF FL_LPTIM32_ClearFlag_Update + * @param LPTIM32x LPTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_ClearFlag_Update(LPTIM32_Type *LPTIM32x) +{ + WRITE_REG(LPTIM32x->ISR, LPTIM32_ISR_OVIF_Msk); +} + +/** + * @brief Clear External Trigger Interrupt Flag + * @rmtoll ISR TRIGIF FL_LPTIM32_ClearFlag_Trigger + * @param LPTIM32x LPTIM32 instance + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_ClearFlag_Trigger(LPTIM32_Type *LPTIM32x) +{ + WRITE_REG(LPTIM32x->ISR, LPTIM32_ISR_TRIGIF_Msk); +} + +/** + * @brief Clear Channel Capture Overflow Interrupt Flag + * @rmtoll ISR OVRIF FL_LPTIM32_ClearFlag_CCOverflow + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_ClearFlag_CCOverflow(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + WRITE_REG(LPTIM32x->ISR, ((channel & 0xf) << 0x8U)); +} + +/** + * @brief Set Auto Reload Value + * @rmtoll ARR FL_LPTIM32_WriteAutoReload + * @param LPTIM32x LPTIM32 instance + * @param autoReload + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_WriteAutoReload(LPTIM32_Type *LPTIM32x, uint32_t autoReload) +{ + MODIFY_REG(LPTIM32x->ARR, (0xffffffffU << 0U), (autoReload << 0U)); +} + +/** + * @brief Get Auto Reload Value + * @rmtoll ARR FL_LPTIM32_ReadAutoReload + * @param LPTIM32x LPTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM32_ReadAutoReload(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->ARR, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Set Input Capture Channel Capture Edge + * @rmtoll CCSR CAPCFG FL_LPTIM32_IC_SetCaptureEdge + * @param LPTIM32x LPTIM32 instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_IC_EDGE_RISING + * @arg @ref FL_LPTIM32_IC_EDGE_FALLING + * @arg @ref FL_LPTIM32_IC_EDGE_BOTH + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_IC_SetCaptureEdge(LPTIM32_Type *LPTIM32x, uint32_t polarity, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM32_CHANNEL_1: + MODIFY_REG(LPTIM32x->CCSR, (0x3U << 8U), (polarity << 0U)); + break; + case FL_LPTIM32_CHANNEL_2: + MODIFY_REG(LPTIM32x->CCSR, (0x3U << 10U), (polarity << 2U)); + break; + case FL_LPTIM32_CHANNEL_3: + MODIFY_REG(LPTIM32x->CCSR, (0x3U << 12U), (polarity << 4U)); + break; + case FL_LPTIM32_CHANNEL_4: + MODIFY_REG(LPTIM32x->CCSR, (0x3U << 14U), (polarity << 6U)); + break; + } +} + +/** + * @brief Get Input Capture Channel Capture Edge + * @rmtoll CCSR CAPCFG FL_LPTIM32_IC_GetCaptureEdge + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM32_IC_EDGE_RISING + * @arg @ref FL_LPTIM32_IC_EDGE_FALLING + * @arg @ref FL_LPTIM32_IC_EDGE_BOTH + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IC_GetCaptureEdge(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM32_CHANNEL_1: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x3U << 8U)) >> 0U); + case FL_LPTIM32_CHANNEL_2: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x3U << 10U)) >> 2U); + case FL_LPTIM32_CHANNEL_3: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x3U << 12U)) >> 4U); + case FL_LPTIM32_CHANNEL_4: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x3U << 14U)) >> 6U); + default: + return 0; + } +} + +/** + * @brief Set Channel Operation Mode + * @rmtoll CCSR CCS FL_LPTIM32_SetChannelMode + * @param LPTIM32x LPTIM32 instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_MODE_DISABLE + * @arg @ref FL_LPTIM32_CHANNEL_MODE_INPUT + * @arg @ref FL_LPTIM32_CHANNEL_MODE_OUTPUT + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_SetChannelMode(LPTIM32_Type *LPTIM32x, uint32_t mode, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM32_CHANNEL_1: + MODIFY_REG(LPTIM32x->CCSR, (0x3U << 0U), (mode << 0U)); + break; + case FL_LPTIM32_CHANNEL_2: + MODIFY_REG(LPTIM32x->CCSR, (0x3U << 2U), (mode << 2U)); + break; + case FL_LPTIM32_CHANNEL_3: + MODIFY_REG(LPTIM32x->CCSR, (0x3U << 4U), (mode << 4U)); + break; + case FL_LPTIM32_CHANNEL_4: + MODIFY_REG(LPTIM32x->CCSR, (0x3U << 6U), (mode << 6U)); + break; + } +} + +/** + * @brief Get Channel Operation Mode + * @rmtoll CCSR CCS FL_LPTIM32_GetChannelMode + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_MODE_DISABLE + * @arg @ref FL_LPTIM32_CHANNEL_MODE_INPUT + * @arg @ref FL_LPTIM32_CHANNEL_MODE_OUTPUT + */ +__STATIC_INLINE uint32_t FL_LPTIM32_GetChannelMode(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM32_CHANNEL_1: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x3U << 0U)) >> 0U); + case FL_LPTIM32_CHANNEL_2: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x3U << 2U)) >> 2U); + case FL_LPTIM32_CHANNEL_3: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x3U << 4U)) >> 4U); + case FL_LPTIM32_CHANNEL_4: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x3U << 6U)) >> 6U); + default: + return 0; + } +} + +/** + * @brief Get Channel Captured Edge + * @rmtoll CCSR CAPEDGE FL_LPTIM32_IC_GetCapturedEdge + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM32_IC_CAPTURED_EDGE_RISING + * @arg @ref FL_LPTIM32_IC_CAPTURED_EDGE_FALLING + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IC_GetCapturedEdge(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM32_CHANNEL_1: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x1U << 20U)) >> 0U); + case FL_LPTIM32_CHANNEL_2: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x1U << 21U)) >> 1U); + case FL_LPTIM32_CHANNEL_3: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x1U << 22U)) >> 2U); + case FL_LPTIM32_CHANNEL_4: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x1U << 23U)) >> 3U); + default: + return 0; + } +} + +/** + * @brief Set Channel 1 Capture Source + * @rmtoll CCSR CAP1SSEL FL_LPTIM32_IC_SetChannel1CaptureSource + * @param LPTIM32x LPTIM32 instance + * @param source This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP0 + * @arg @ref FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP1 + * @arg @ref FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP2 + * @arg @ref FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP3 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_IC_SetChannel1CaptureSource(LPTIM32_Type *LPTIM32x, uint32_t source) +{ + MODIFY_REG(LPTIM32x->CCSR, LPTIM32_CCSR_CAP1SSEL_Msk, source); +} + +/** + * @brief Get Channel 1 Capture Source Setting + * @rmtoll CCSR CAP1SSEL FL_LPTIM32_IC_GetChannel1CaptureSource + * @param LPTIM32x LPTIM32 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP0 + * @arg @ref FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP1 + * @arg @ref FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP2 + * @arg @ref FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP3 + */ +__STATIC_INLINE uint32_t FL_LPTIM32_IC_GetChannel1CaptureSource(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, LPTIM32_CCSR_CAP1SSEL_Msk)); +} + +/** + * @brief Set Channel Output Compare Polarity + * @rmtoll CCSR POLAR FL_LPTIM32_OC_SetPolarity + * @param LPTIM32x LPTIM32 instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_OC_POLARITY_NORMAL + * @arg @ref FL_LPTIM32_OC_POLARITY_INVERT + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_OC_SetPolarity(LPTIM32_Type *LPTIM32x, uint32_t polarity, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM32_CHANNEL_1: + MODIFY_REG(LPTIM32x->CCSR, (0x1U << 16U), (polarity << 0U)); + break; + case FL_LPTIM32_CHANNEL_2: + MODIFY_REG(LPTIM32x->CCSR, (0x1U << 17U), (polarity << 1U)); + break; + case FL_LPTIM32_CHANNEL_3: + MODIFY_REG(LPTIM32x->CCSR, (0x1U << 18U), (polarity << 2U)); + break; + case FL_LPTIM32_CHANNEL_4: + MODIFY_REG(LPTIM32x->CCSR, (0x1U << 19U), (polarity << 3U)); + break; + } +} + +/** + * @brief Get Channel Output Compare Polarity + * @rmtoll CCSR POLAR FL_LPTIM32_OC_GetPolarity + * @param LPTIM32x LPTIM32 instance + * @param channel This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_CHANNEL_1 + * @arg @ref FL_LPTIM32_CHANNEL_2 + * @arg @ref FL_LPTIM32_CHANNEL_3 + * @arg @ref FL_LPTIM32_CHANNEL_4 + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM32_OC_POLARITY_NORMAL + * @arg @ref FL_LPTIM32_OC_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_LPTIM32_OC_GetPolarity(LPTIM32_Type *LPTIM32x, uint32_t channel) +{ + switch(channel) + { + case FL_LPTIM32_CHANNEL_1: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x1U << 16U)) >> 0U); + case FL_LPTIM32_CHANNEL_2: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x1U << 17U)) >> 1U); + case FL_LPTIM32_CHANNEL_3: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x1U << 18U)) >> 2U); + case FL_LPTIM32_CHANNEL_4: + return (uint32_t)(READ_BIT(LPTIM32x->CCSR, (0x1U << 19U)) >> 3U); + default: + return 0; + } +} + +/** + * @brief Set Sync Trigger Signal Output Source + * @rmtoll CFGR MMS FL_LPTIM32_SetTriggerOutput + * @param LPTIM32x LPTIM32 instance + * @param triggerOutput This parameter can be one of the following values: + * @arg @ref FL_LPTIM32_TRGO_ENABLE + * @arg @ref FL_LPTIM32_TRGO_UPDATE + * @arg @ref FL_LPTIM32_TRGO_OC1REF + * @arg @ref FL_LPTIM32_TRGO_IC1 + * @arg @ref FL_LPTIM32_TRGO_IC2 + * @arg @ref FL_LPTIM32_TRGO_IC3 + * @arg @ref FL_LPTIM32_TRGO_IC4 + * @retval None + */ +__STATIC_INLINE void FL_LPTIM32_SetTriggerOutput(LPTIM32_Type *LPTIM32x, uint32_t triggerOutput) +{ + MODIFY_REG(LPTIM32x->CFGR, LPTIM32_CFGR_MMS_Msk, triggerOutput); +} + +/** + * @brief Get Sync Trigger Signal Output Source Setting + * @rmtoll CFGR MMS FL_LPTIM32_GetTriggerOutput + * @param LPTIM32x LPTIM32 instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPTIM32_TRGO_ENABLE + * @arg @ref FL_LPTIM32_TRGO_UPDATE + * @arg @ref FL_LPTIM32_TRGO_OC1REF + * @arg @ref FL_LPTIM32_TRGO_IC1 + * @arg @ref FL_LPTIM32_TRGO_IC2 + * @arg @ref FL_LPTIM32_TRGO_IC3 + * @arg @ref FL_LPTIM32_TRGO_IC4 + */ +__STATIC_INLINE uint32_t FL_LPTIM32_GetTriggerOutput(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CFGR, LPTIM32_CFGR_MMS_Msk)); +} + +/** + * @brief Read LPTIM32 Counter Value + * @rmtoll CNT FL_LPTIM32_ReadCounter + * @param LPTIM32x LPTIM32 instance + * @retval + */ +__STATIC_INLINE uint32_t FL_LPTIM32_ReadCounter(LPTIM32_Type *LPTIM32x) +{ + return (uint32_t)(READ_BIT(LPTIM32x->CNT, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @} + */ + +/** @defgroup LPTIM32_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_LPTIM32_DeInit(LPTIM32_Type *LPTIM32x); +FL_ErrorStatus FL_LPTIM32_Init(LPTIM32_Type *LPTIM32x, FL_LPTIM32_InitTypeDef *init); +void FL_LPTIM32_StructInit(FL_LPTIM32_InitTypeDef *init); +FL_ErrorStatus FL_LPTIM32_IC_Init(LPTIM32_Type *LPTIM32x, uint32_t channel, FL_LPTIM32_IC_InitTypeDef *ic_init); +void FL_LPTIM32_IC_StructInit(FL_LPTIM32_IC_InitTypeDef *ic_init); +FL_ErrorStatus FL_LPTIM32_OC_Init(LPTIM32_Type *LPTIM32x, uint32_t channel, FL_LPTIM32_OC_InitTypeDef *oc_init); +void FL_LPTIM32_OC_StructInit(FL_LPTIM32_OC_InitTypeDef *oc_init); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_LPTIM32_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.1 @ 2020-12-14*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lpuart.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lpuart.h new file mode 100644 index 0000000..65a2bef --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_lpuart.h @@ -0,0 +1,1128 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_lpuart.h + * @author FMSH Application Team + * @brief Head file of LPUART FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_LPUART_H +#define __FM33LG0XX_FL_LPUART_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup LPUART LPUART + * @brief LPUART FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup LPUART_FL_ES_INIT LPUART Exported Init structures + * @{ + */ + +/** + * @brief FL LPUART Init Sturcture definition + */ +typedef struct +{ + /** 时钟源选择 */ + uint32_t clockSrc; + /** 通讯波特率*/ + uint32_t baudRate; + /** 数据位宽*/ + uint32_t dataWidth; + /** 停止位 */ + uint32_t stopBits; + /** 奇偶校验 */ + uint32_t parity; + /** 传输方向 */ + uint32_t transferDirection; + +} FL_LPUART_InitTypeDef; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup LPUART_FL_Exported_Constants LPUART Exported Constants + * @{ + */ + +#define LPUART_CSR_BUSY_Pos (24U) +#define LPUART_CSR_BUSY_Msk (0x1U << LPUART_CSR_BUSY_Pos) +#define LPUART_CSR_BUSY LPUART_CSR_BUSY_Msk + +#define LPUART_CSR_WKBYTE_CFG_Pos (19U) +#define LPUART_CSR_WKBYTE_CFG_Msk (0x1U << LPUART_CSR_WKBYTE_CFG_Pos) +#define LPUART_CSR_WKBYTE_CFG LPUART_CSR_WKBYTE_CFG_Msk + +#define LPUART_CSR_RXEV_Pos (16U) +#define LPUART_CSR_RXEV_Msk (0x3U << LPUART_CSR_RXEV_Pos) +#define LPUART_CSR_RXEV LPUART_CSR_RXEV_Msk + +#define LPUART_CSR_IOSWAP_Pos (11U) +#define LPUART_CSR_IOSWAP_Msk (0x1U << LPUART_CSR_IOSWAP_Pos) +#define LPUART_CSR_IOSWAP LPUART_CSR_IOSWAP_Msk + +#define LPUART_CSR_DMATXIFCFG_Pos (10U) +#define LPUART_CSR_DMATXIFCFG_Msk (0x1U << LPUART_CSR_DMATXIFCFG_Pos) +#define LPUART_CSR_DMATXIFCFG LPUART_CSR_DMATXIFCFG_Msk + +#define LPUART_CSR_BITORD_Pos (9U) +#define LPUART_CSR_BITORD_Msk (0x1U << LPUART_CSR_BITORD_Pos) +#define LPUART_CSR_BITORD LPUART_CSR_BITORD_Msk + +#define LPUART_CSR_STOPCFG_Pos (8U) +#define LPUART_CSR_STOPCFG_Msk (0x1U << LPUART_CSR_STOPCFG_Pos) +#define LPUART_CSR_STOPCFG LPUART_CSR_STOPCFG_Msk + +#define LPUART_CSR_PDSEL_Pos (6U) +#define LPUART_CSR_PDSEL_Msk (0x3U << LPUART_CSR_PDSEL_Pos) +#define LPUART_CSR_PDSEL LPUART_CSR_PDSEL_Msk + +#define LPUART_CSR_PARITY_Pos (4U) +#define LPUART_CSR_PARITY_Msk (0x3U << LPUART_CSR_PARITY_Pos) +#define LPUART_CSR_PARITY LPUART_CSR_PARITY_Msk + +#define LPUART_CSR_RXPOL_Pos (3U) +#define LPUART_CSR_RXPOL_Msk (0x1U << LPUART_CSR_RXPOL_Pos) +#define LPUART_CSR_RXPOL LPUART_CSR_RXPOL_Msk + +#define LPUART_CSR_TXPOL_Pos (2U) +#define LPUART_CSR_TXPOL_Msk (0x1U << LPUART_CSR_TXPOL_Pos) +#define LPUART_CSR_TXPOL LPUART_CSR_TXPOL_Msk + +#define LPUART_CSR_RXEN_Pos (1U) +#define LPUART_CSR_RXEN_Msk (0x1U << LPUART_CSR_RXEN_Pos) +#define LPUART_CSR_RXEN LPUART_CSR_RXEN_Msk + +#define LPUART_CSR_TXEN_Pos (0U) +#define LPUART_CSR_TXEN_Msk (0x1U << LPUART_CSR_TXEN_Pos) +#define LPUART_CSR_TXEN LPUART_CSR_TXEN_Msk + +#define LPUART_IER_RXEV_IE_Pos (12U) +#define LPUART_IER_RXEV_IE_Msk (0x1U << LPUART_IER_RXEV_IE_Pos) +#define LPUART_IER_RXEV_IE LPUART_IER_RXEV_IE_Msk + +#define LPUART_IER_RXERR_IE_Pos (10U) +#define LPUART_IER_RXERR_IE_Msk (0x1U << LPUART_IER_RXERR_IE_Pos) +#define LPUART_IER_RXERR_IE LPUART_IER_RXERR_IE_Msk + +#define LPUART_IER_RXBF_IE_Pos (8U) +#define LPUART_IER_RXBF_IE_Msk (0x1U << LPUART_IER_RXBF_IE_Pos) +#define LPUART_IER_RXBF_IE LPUART_IER_RXBF_IE_Msk + +#define LPUART_IER_TXBE_IE_Pos (1U) +#define LPUART_IER_TXBE_IE_Msk (0x1U << LPUART_IER_TXBE_IE_Pos) +#define LPUART_IER_TXBE_IE LPUART_IER_TXBE_IE_Msk + +#define LPUART_IER_TXSE_IE_Pos (0U) +#define LPUART_IER_TXSE_IE_Msk (0x1U << LPUART_IER_TXSE_IE_Pos) +#define LPUART_IER_TXSE_IE LPUART_IER_TXSE_IE_Msk + +#define LPUART_ISR_RXEVF_Pos (24U) +#define LPUART_ISR_RXEVF_Msk (0x1U << LPUART_ISR_RXEVF_Pos) +#define LPUART_ISR_RXEVF LPUART_ISR_RXEVF_Msk + +#define LPUART_ISR_TXOV_Pos (19U) +#define LPUART_ISR_TXOV_Msk (0x1U << LPUART_ISR_TXOV_Pos) +#define LPUART_ISR_TXOV LPUART_ISR_TXOV_Msk + +#define LPUART_ISR_PERR_Pos (18U) +#define LPUART_ISR_PERR_Msk (0x1U << LPUART_ISR_PERR_Pos) +#define LPUART_ISR_PERR LPUART_ISR_PERR_Msk + +#define LPUART_ISR_FERR_Pos (17U) +#define LPUART_ISR_FERR_Msk (0x1U << LPUART_ISR_FERR_Pos) +#define LPUART_ISR_FERR LPUART_ISR_FERR_Msk + +#define LPUART_ISR_OERR_Pos (16U) +#define LPUART_ISR_OERR_Msk (0x1U << LPUART_ISR_OERR_Pos) +#define LPUART_ISR_OERR LPUART_ISR_OERR_Msk + +#define LPUART_ISR_RXBF_Pos (8U) +#define LPUART_ISR_RXBF_Msk (0x1U << LPUART_ISR_RXBF_Pos) +#define LPUART_ISR_RXBF LPUART_ISR_RXBF_Msk + +#define LPUART_ISR_TXBE_Pos (1U) +#define LPUART_ISR_TXBE_Msk (0x1U << LPUART_ISR_TXBE_Pos) +#define LPUART_ISR_TXBE LPUART_ISR_TXBE_Msk + +#define LPUART_ISR_TXSE_Pos (0U) +#define LPUART_ISR_TXSE_Msk (0x1U << LPUART_ISR_TXSE_Pos) +#define LPUART_ISR_TXSE LPUART_ISR_TXSE_Msk + +#define LPUART_BMR_MCTL_EN_Pos (31U) +#define LPUART_BMR_MCTL_EN_Msk (0x1U << LPUART_BMR_MCTL_EN_Pos) +#define LPUART_BMR_MCTL_EN LPUART_BMR_MCTL_EN_Msk + +#define LPUART_BMR_BAUD_Pos (0U) +#define LPUART_BMR_BAUD_Msk (0x7U << LPUART_BMR_BAUD_Pos) +#define LPUART_BMR_BAUD LPUART_BMR_BAUD_Msk + +#define LPUART_BMR_MCTL_Pos (16U) +#define LPUART_BMR_MCTL_Msk (0x1fffU << LPUART_BMR_MCTL_Pos) +#define LPUART_BMR_MCTL LPUART_BMR_MCTL_Msk + + + + + + +#define FL_LPUART_WAKEUP_NO_CHECK (0x0U << LPUART_CSR_WKBYTE_CFG_Pos) +#define FL_LPUART_WAKEUP_CHECK (0x1U << LPUART_CSR_WKBYTE_CFG_Pos) + + +#define FL_LPUART_WAKEUP_EVENT_START (0x0U << LPUART_CSR_RXEV_Pos) +#define FL_LPUART_WAKEUP_EVENT_RECV_1BYTE (0x1U << LPUART_CSR_RXEV_Pos) +#define FL_LPUART_WAKEUP_EVENT_RECV_MATCH (0x2U << LPUART_CSR_RXEV_Pos) +#define FL_LPUART_WAKEUP_EVENT_RX_FALLING (0x3U << LPUART_CSR_RXEV_Pos) + + +#define FL_LPUART_TXIF_MODE_ALWAYS (0x0U << LPUART_CSR_DMATXIFCFG_Pos) +#define FL_LPUART_TXIF_MODE_AFTER_DMA (0x1U << LPUART_CSR_DMATXIFCFG_Pos) + + +#define FL_LPUART_BIT_ORDER_LSB_FIRST (0x0U << LPUART_CSR_BITORD_Pos) +#define FL_LPUART_BIT_ORDER_MSB_FIRST (0x1U << LPUART_CSR_BITORD_Pos) + + +#define FL_LPUART_STOP_BIT_WIDTH_1B (0x0U << LPUART_CSR_STOPCFG_Pos) +#define FL_LPUART_STOP_BIT_WIDTH_2B (0x1U << LPUART_CSR_STOPCFG_Pos) + + +#define FL_LPUART_DATA_WIDTH_7B (0x0U << LPUART_CSR_PDSEL_Pos) +#define FL_LPUART_DATA_WIDTH_8B (0x1U << LPUART_CSR_PDSEL_Pos) +#define FL_LPUART_DATA_WIDTH_9B (0x2U << LPUART_CSR_PDSEL_Pos) +#define FL_LPUART_DATA_WIDTH_6B (0x3U << LPUART_CSR_PDSEL_Pos) + + +#define FL_LPUART_PARITY_NONE (0x0U << LPUART_CSR_PARITY_Pos) +#define FL_LPUART_PARITY_EVEN (0x1U << LPUART_CSR_PARITY_Pos) +#define FL_LPUART_PARITY_ODD (0x2U << LPUART_CSR_PARITY_Pos) + + +#define FL_LPUART_RX_POLARITY_NORMAL (0x0U << LPUART_CSR_RXPOL_Pos) +#define FL_LPUART_RX_POLARITY_INVERT (0x1U << LPUART_CSR_RXPOL_Pos) + + +#define FL_LPUART_TX_POLARITY_NORMAL (0x0U << LPUART_CSR_TXPOL_Pos) +#define FL_LPUART_TX_POLARITY_INVERT (0x1U << LPUART_CSR_TXPOL_Pos) + + +#define FL_LPUART_BAUDRATE_9600 (0x0U << LPUART_BMR_BAUD_Pos) +#define FL_LPUART_BAUDRATE_4800 (0x1U << LPUART_BMR_BAUD_Pos) +#define FL_LPUART_BAUDRATE_2400 (0x2U << LPUART_BMR_BAUD_Pos) +#define FL_LPUART_BAUDRATE_1200 (0x3U << LPUART_BMR_BAUD_Pos) +#define FL_LPUART_BAUDRATE_600 (0x4U << LPUART_BMR_BAUD_Pos) +#define FL_LPUART_BAUDRATE_300 (0x5U << LPUART_BMR_BAUD_Pos) + + +#define FL_LPUART_DIRECTION_NONE 0x00000000U +#define FL_LPUART_DIRECTION_RX LPUART_CSR_RXEN +#define FL_LPUART_DIRECTION_TX LPUART_CSR_TXEN +#define FL_LPUART_DIRECTION_TX_RX (LPUART_CSR_RXEN|LPUART_CSR_TXEN) +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup LPUART_FL_Exported_Functions LPUART Exported Functions + * @{ + */ + +/** + * @brief Get LPUART Busy Flag + * @rmtoll CSR BUSY FL_LPUART_IsActiveFlag_Busy + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsActiveFlag_Busy(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_BUSY_Msk) == (LPUART_CSR_BUSY_Msk)); +} + +/** + * @brief Set Data Receive Wakeup Mode + * @rmtoll CSR WKBYTE_CFG FL_LPUART_SetRXWakeupMode + * @param LPUARTx LPUART instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_LPUART_WAKEUP_NO_CHECK + * @arg @ref FL_LPUART_WAKEUP_CHECK + * @retval None + */ +__STATIC_INLINE void FL_LPUART_SetRXWakeupMode(LPUART_Type *LPUARTx, uint32_t mode) +{ + MODIFY_REG(LPUARTx->CSR, LPUART_CSR_WKBYTE_CFG_Msk, mode); +} + +/** + * @brief Get Data Receive Wakeup Mode Setting + * @rmtoll CSR WKBYTE_CFG FL_LPUART_GetRXWakeupMode + * @param LPUARTx LPUART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPUART_WAKEUP_NO_CHECK + * @arg @ref FL_LPUART_WAKEUP_CHECK + */ +__STATIC_INLINE uint32_t FL_LPUART_GetRXWakeupMode(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_WKBYTE_CFG_Msk)); +} + +/** + * @brief Set Receive Wakeup Event + * @rmtoll CSR RXEV FL_LPUART_SetWakeup + * @param LPUARTx LPUART instance + * @param event This parameter can be one of the following values: + * @arg @ref FL_LPUART_WAKEUP_EVENT_START + * @arg @ref FL_LPUART_WAKEUP_EVENT_RECV_1BYTE + * @arg @ref FL_LPUART_WAKEUP_EVENT_RECV_MATCH + * @arg @ref FL_LPUART_WAKEUP_EVENT_RX_FALLING + * @retval None + */ +__STATIC_INLINE void FL_LPUART_SetWakeup(LPUART_Type *LPUARTx, uint32_t event) +{ + MODIFY_REG(LPUARTx->CSR, LPUART_CSR_RXEV_Msk, event); +} + +/** + * @brief Get Receive Wakeup Event Setting + * @rmtoll CSR RXEV FL_LPUART_GetWakeup + * @param LPUARTx LPUART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPUART_WAKEUP_EVENT_START + * @arg @ref FL_LPUART_WAKEUP_EVENT_RECV_1BYTE + * @arg @ref FL_LPUART_WAKEUP_EVENT_RECV_MATCH + * @arg @ref FL_LPUART_WAKEUP_EVENT_RX_FALLING + */ +__STATIC_INLINE uint32_t FL_LPUART_GetWakeup(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_RXEV_Msk)); +} + +/** + * @brief Enable LPUART Pin Swap Between TX Pin and RX Pin + * @rmtoll CSR IOSWAP FL_LPUART_EnablePinSwap + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_EnablePinSwap(LPUART_Type *LPUARTx) +{ + SET_BIT(LPUARTx->CSR, LPUART_CSR_IOSWAP_Msk); +} + +/** + * @brief Disable LPUART Pin Swap Between TX Pin and RX Pin + * @rmtoll CSR IOSWAP FL_LPUART_DisablePinSwap + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_DisablePinSwap(LPUART_Type *LPUARTx) +{ + CLEAR_BIT(LPUARTx->CSR, LPUART_CSR_IOSWAP_Msk); +} + +/** + * @brief Get UART Pin Swap Enable Status Between UART TX Pin and RX Pin + + * @rmtoll CSR IOSWAP FL_LPUART_IsEnabledPinSwap + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsEnabledPinSwap(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_IOSWAP_Msk) == LPUART_CSR_IOSWAP_Msk); +} + +/** + * @brief Enable DMA TX Complete Interrupt + * @rmtoll CSR DMATXIFCFG FL_LPUART_SetTXIFMode + * @param LPUARTx LPUART instance + * @param txifMode This parameter can be one of the following values: + * @arg @ref FL_LPUART_TXIF_MODE_ALWAYS + * @arg @ref FL_LPUART_TXIF_MODE_AFTER_DMA + * @retval None + */ +__STATIC_INLINE void FL_LPUART_SetTXIFMode(LPUART_Type *LPUARTx, uint32_t txifMode) +{ + MODIFY_REG(LPUARTx->CSR, LPUART_CSR_DMATXIFCFG_Msk, txifMode); +} + +/** + * @brief Disable DMA TX Complete Interrupt + * @rmtoll CSR DMATXIFCFG FL_LPUART_GetTXIFMode + * @param LPUARTx LPUART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPUART_TXIF_MODE_ALWAYS + * @arg @ref FL_LPUART_TXIF_MODE_AFTER_DMA + */ +__STATIC_INLINE uint32_t FL_LPUART_GetTXIFMode(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_DMATXIFCFG_Msk)); +} + +/** + * @brief Set LPUART Transfer Bit Order + * @rmtoll CSR BITORD FL_LPUART_SetBitOrder + * @param LPUARTx LPUART instance + * @param bitOrder This parameter can be one of the following values: + * @arg @ref FL_LPUART_BIT_ORDER_LSB_FIRST + * @arg @ref FL_LPUART_BIT_ORDER_MSB_FIRST + * @retval None + */ +__STATIC_INLINE void FL_LPUART_SetBitOrder(LPUART_Type *LPUARTx, uint32_t bitOrder) +{ + MODIFY_REG(LPUARTx->CSR, LPUART_CSR_BITORD_Msk, bitOrder); +} + +/** + * @brief Get LPUART Transfer Bit Order Setting + * @rmtoll CSR BITORD FL_LPUART_GetBitOrder + * @param LPUARTx LPUART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPUART_BIT_ORDER_LSB_FIRST + * @arg @ref FL_LPUART_BIT_ORDER_MSB_FIRST + */ +__STATIC_INLINE uint32_t FL_LPUART_GetBitOrder(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_BITORD_Msk)); +} + +/** + * @brief Set LPUART Stop Bits Length + * @rmtoll CSR STOPCFG FL_LPUART_SetStopBitsWidth + * @param LPUARTx LPUART instance + * @param stopBits This parameter can be one of the following values: + * @arg @ref FL_LPUART_STOP_BIT_WIDTH_1B + * @arg @ref FL_LPUART_STOP_BIT_WIDTH_2B + * @retval None + */ +__STATIC_INLINE void FL_LPUART_SetStopBitsWidth(LPUART_Type *LPUARTx, uint32_t stopBits) +{ + MODIFY_REG(LPUARTx->CSR, LPUART_CSR_STOPCFG_Msk, stopBits); +} + +/** + * @brief Get LPUART Stop Bits Length Setting + * @rmtoll CSR STOPCFG FL_LPUART_GetStopBitsWidth + * @param LPUARTx LPUART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPUART_STOP_BIT_WIDTH_1B + * @arg @ref FL_LPUART_STOP_BIT_WIDTH_2B + */ +__STATIC_INLINE uint32_t FL_LPUART_GetStopBitsWidth(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_STOPCFG_Msk)); +} + +/** + * @brief Set LPUART Data Width + * @rmtoll CSR PDSEL FL_LPUART_SetDataWidth + * @param LPUARTx LPUART instance + * @param dataWidth This parameter can be one of the following values: + * @arg @ref FL_LPUART_DATA_WIDTH_7B + * @arg @ref FL_LPUART_DATA_WIDTH_8B + * @arg @ref FL_LPUART_DATA_WIDTH_9B + * @arg @ref FL_LPUART_DATA_WIDTH_6B + * @retval None + */ +__STATIC_INLINE void FL_LPUART_SetDataWidth(LPUART_Type *LPUARTx, uint32_t dataWidth) +{ + MODIFY_REG(LPUARTx->CSR, LPUART_CSR_PDSEL_Msk, dataWidth); +} + +/** + * @brief Get LPUART Stop Bits Length Setting + * @rmtoll CSR PDSEL FL_LPUART_GetDataWidth + * @param LPUARTx LPUART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPUART_DATA_WIDTH_7B + * @arg @ref FL_LPUART_DATA_WIDTH_8B + * @arg @ref FL_LPUART_DATA_WIDTH_9B + * @arg @ref FL_LPUART_DATA_WIDTH_6B + */ +__STATIC_INLINE uint32_t FL_LPUART_GetDataWidth(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_PDSEL_Msk)); +} + +/** + * @brief Set LPUART Parity + * @rmtoll CSR PARITY FL_LPUART_SetParity + * @param LPUARTx LPUART instance + * @param parity This parameter can be one of the following values: + * @arg @ref FL_LPUART_PARITY_NONE + * @arg @ref FL_LPUART_PARITY_EVEN + * @arg @ref FL_LPUART_PARITY_ODD + * @retval None + */ +__STATIC_INLINE void FL_LPUART_SetParity(LPUART_Type *LPUARTx, uint32_t parity) +{ + MODIFY_REG(LPUARTx->CSR, LPUART_CSR_PARITY_Msk, parity); +} + +/** + * @brief Get LPUART Parity Setting + * @rmtoll CSR PARITY FL_LPUART_GetParity + * @param LPUARTx LPUART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPUART_PARITY_NONE + * @arg @ref FL_LPUART_PARITY_EVEN + * @arg @ref FL_LPUART_PARITY_ODD + */ +__STATIC_INLINE uint32_t FL_LPUART_GetParity(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_PARITY_Msk)); +} + +/** + * @brief Set LPUART Receive Polarity + * @rmtoll CSR RXPOL FL_LPUART_SetRXPolarity + * @param LPUARTx LPUART instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_LPUART_RX_POLARITY_NORMAL + * @arg @ref FL_LPUART_RX_POLARITY_INVERT + * @retval None + */ +__STATIC_INLINE void FL_LPUART_SetRXPolarity(LPUART_Type *LPUARTx, uint32_t polarity) +{ + MODIFY_REG(LPUARTx->CSR, LPUART_CSR_RXPOL_Msk, polarity); +} + +/** + * @brief Get LPUART Receive Polarity Setting + * @rmtoll CSR RXPOL FL_LPUART_GetRXPolarity + * @param LPUARTx LPUART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPUART_RX_POLARITY_NORMAL + * @arg @ref FL_LPUART_RX_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_LPUART_GetRXPolarity(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_RXPOL_Msk)); +} + +/** + * @brief Set LPUART Transmit Polarity + * @rmtoll CSR TXPOL FL_LPUART_SetTXPolarity + * @param LPUARTx LPUART instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_LPUART_TX_POLARITY_NORMAL + * @arg @ref FL_LPUART_TX_POLARITY_INVERT + * @retval None + */ +__STATIC_INLINE void FL_LPUART_SetTXPolarity(LPUART_Type *LPUARTx, uint32_t polarity) +{ + MODIFY_REG(LPUARTx->CSR, LPUART_CSR_TXPOL_Msk, polarity); +} + +/** + * @brief Get LPUART Transmit Polarity Setting + * @rmtoll CSR TXPOL FL_LPUART_GetTXPolarity + * @param LPUARTx LPUART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPUART_TX_POLARITY_NORMAL + * @arg @ref FL_LPUART_TX_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_LPUART_GetTXPolarity(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_TXPOL_Msk)); +} + +/** + * @brief Enable LPUART Receive + * @rmtoll CSR RXEN FL_LPUART_EnableRX + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_EnableRX(LPUART_Type *LPUARTx) +{ + SET_BIT(LPUARTx->CSR, LPUART_CSR_RXEN_Msk); +} + +/** + * @brief Get LPUART Receive Enable Status + * @rmtoll CSR RXEN FL_LPUART_IsEnabledRX + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsEnabledRX(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_RXEN_Msk) == LPUART_CSR_RXEN_Msk); +} + +/** + * @brief Disable LPUART Receive + * @rmtoll CSR RXEN FL_LPUART_DisableRX + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_DisableRX(LPUART_Type *LPUARTx) +{ + CLEAR_BIT(LPUARTx->CSR, LPUART_CSR_RXEN_Msk); +} + +/** + * @brief Enable LPUART Receive + * @rmtoll CSR TXEN FL_LPUART_EnableTX + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_EnableTX(LPUART_Type *LPUARTx) +{ + SET_BIT(LPUARTx->CSR, LPUART_CSR_TXEN_Msk); +} + +/** + * @brief Get LPUART Receive Enable Status + * @rmtoll CSR TXEN FL_LPUART_IsEnabledTX + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsEnabledTX(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->CSR, LPUART_CSR_TXEN_Msk) == LPUART_CSR_TXEN_Msk); +} + +/** + * @brief Disable LPUART Receive + * @rmtoll CSR TXEN FL_LPUART_DisableTX + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_DisableTX(LPUART_Type *LPUARTx) +{ + CLEAR_BIT(LPUARTx->CSR, LPUART_CSR_TXEN_Msk); +} + +/** + * @brief Enable LPUART Receive Event Interrupt + * @rmtoll IER RXEV_IE FL_LPUART_EnableIT_RXWakeup + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_EnableIT_RXWakeup(LPUART_Type *LPUARTx) +{ + SET_BIT(LPUARTx->IER, LPUART_IER_RXEV_IE_Msk); +} + +/** + * @brief Get LPUART Receive Event Interrupt Enable Status + * @rmtoll IER RXEV_IE FL_LPUART_IsEnabledIT_RXWakeup + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsEnabledIT_RXWakeup(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->IER, LPUART_IER_RXEV_IE_Msk) == LPUART_IER_RXEV_IE_Msk); +} + +/** + * @brief Disable LPUART Receive Event Interrupt + * @rmtoll IER RXEV_IE FL_LPUART_DisableIT_RXWakeup + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_DisableIT_RXWakeup(LPUART_Type *LPUARTx) +{ + CLEAR_BIT(LPUARTx->IER, LPUART_IER_RXEV_IE_Msk); +} + +/** + * @brief Enable LPUART Receive Error Interrupt + * @rmtoll IER RXERR_IE FL_LPUART_EnableIT_RXError + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_EnableIT_RXError(LPUART_Type *LPUARTx) +{ + SET_BIT(LPUARTx->IER, LPUART_IER_RXERR_IE_Msk); +} + +/** + * @brief Get LPUART Receive Error Interrupt Enable Status + * @rmtoll IER RXERR_IE FL_LPUART_IsEnabledIT_RXError + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsEnabledIT_RXError(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->IER, LPUART_IER_RXERR_IE_Msk) == LPUART_IER_RXERR_IE_Msk); +} + +/** + * @brief Disable LPUART Receive Error Interrupt + * @rmtoll IER RXERR_IE FL_LPUART_DisableIT_RXError + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_DisableIT_RXError(LPUART_Type *LPUARTx) +{ + CLEAR_BIT(LPUARTx->IER, LPUART_IER_RXERR_IE_Msk); +} + +/** + * @brief Enable LPUART Receive Buffer Full Interrupt + * @rmtoll IER RXBF_IE FL_LPUART_EnableIT_RXBuffFull + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_EnableIT_RXBuffFull(LPUART_Type *LPUARTx) +{ + SET_BIT(LPUARTx->IER, LPUART_IER_RXBF_IE_Msk); +} + +/** + * @brief Get LPUART Receive Buffer Full Interrupt Enable Status + * @rmtoll IER RXBF_IE FL_LPUART_IsEnabledIT_RXBuffFull + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsEnabledIT_RXBuffFull(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->IER, LPUART_IER_RXBF_IE_Msk) == LPUART_IER_RXBF_IE_Msk); +} + +/** + * @brief Disable LPUART Receive Buffer Full Interrupt + * @rmtoll IER RXBF_IE FL_LPUART_DisableIT_RXBufFull + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_DisableIT_RXBufFull(LPUART_Type *LPUARTx) +{ + CLEAR_BIT(LPUARTx->IER, LPUART_IER_RXBF_IE_Msk); +} + +/** + * @brief Enable LPUART Transmit Buffer Empty Interrupt + * @rmtoll IER TXBE_IE FL_LPUART_EnableIT_TXBuffEmpty + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_EnableIT_TXBuffEmpty(LPUART_Type *LPUARTx) +{ + SET_BIT(LPUARTx->IER, LPUART_IER_TXBE_IE_Msk); +} + +/** + * @brief Get LPUART Transmit Buffer Empty Interrupt Enable Status + * @rmtoll IER TXBE_IE FL_LPUART_IsEnabledIT_TXBuffEmpty + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsEnabledIT_TXBuffEmpty(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->IER, LPUART_IER_TXBE_IE_Msk) == LPUART_IER_TXBE_IE_Msk); +} + +/** + * @brief Disable LPUART Transmit Buffer Empty Interrupt + * @rmtoll IER TXBE_IE FL_LPUART_DisableIT_TXBuffEmpty + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_DisableIT_TXBuffEmpty(LPUART_Type *LPUARTx) +{ + CLEAR_BIT(LPUARTx->IER, LPUART_IER_TXBE_IE_Msk); +} + +/** + * @brief Enable LPUART Transmit Shift Register Interrupt + * @rmtoll IER TXSE_IE FL_LPUART_EnableIT_TXShiftBuffEmpty + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_EnableIT_TXShiftBuffEmpty(LPUART_Type *LPUARTx) +{ + SET_BIT(LPUARTx->IER, LPUART_IER_TXSE_IE_Msk); +} + +/** + * @brief Get LPUART Transmit Shift Register Interrupt Enable Status + * @rmtoll IER TXSE_IE FL_LPUART_IsEnabledIT_TXShiftBuffEmpty + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsEnabledIT_TXShiftBuffEmpty(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->IER, LPUART_IER_TXSE_IE_Msk) == LPUART_IER_TXSE_IE_Msk); +} + +/** + * @brief Disable LPUART Transmit Shift Register Interrupt + * @rmtoll IER TXSE_IE FL_LPUART_DisableIT_TXShiftBuffEmpty + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_DisableIT_TXShiftBuffEmpty(LPUART_Type *LPUARTx) +{ + CLEAR_BIT(LPUARTx->IER, LPUART_IER_TXSE_IE_Msk); +} + +/** + * @brief Get LPUART Receive Event Interrupt Flag + * @rmtoll ISR RXEVF FL_LPUART_IsActiveFlag_RXWakeup + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsActiveFlag_RXWakeup(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->ISR, LPUART_ISR_RXEVF_Msk) == (LPUART_ISR_RXEVF_Msk)); +} + +/** + * @brief Clear LPUART Receive Event Interrupt Flag + * @rmtoll ISR RXEVF FL_LPUART_ClearFlag_RXWakeup + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_ClearFlag_RXWakeup(LPUART_Type *LPUARTx) +{ + WRITE_REG(LPUARTx->ISR, LPUART_ISR_RXEVF_Msk); +} + +/** + * @brief Get LPUART Transmit Overflow Error Flag + * @rmtoll ISR TXOV FL_LPUART_IsActiveFlag_TXBuffOverflow + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsActiveFlag_TXBuffOverflow(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->ISR, LPUART_ISR_TXOV_Msk) == (LPUART_ISR_TXOV_Msk)); +} + +/** + * @brief Clear LPUART Transmit Overflow Error Flag + * @rmtoll ISR TXOV FL_LPUART_ClearFlag_TXBuffOverflow + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_ClearFlag_TXBuffOverflow(LPUART_Type *LPUARTx) +{ + WRITE_REG(LPUARTx->ISR, LPUART_ISR_TXOV_Msk); +} + +/** + * @brief Get LPUART Parity Error Flag + * @rmtoll ISR PERR FL_LPUART_IsActiveFlag_ParityError + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsActiveFlag_ParityError(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->ISR, LPUART_ISR_PERR_Msk) == (LPUART_ISR_PERR_Msk)); +} + +/** + * @brief Clear LPUART Parity Error Flag + * @rmtoll ISR PERR FL_LPUART_ClearFlag_ParityError + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_ClearFlag_ParityError(LPUART_Type *LPUARTx) +{ + WRITE_REG(LPUARTx->ISR, LPUART_ISR_PERR_Msk); +} + +/** + * @brief Get LPUART Frame Error Flag + * @rmtoll ISR FERR FL_LPUART_IsActiveFlag_FrameError + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsActiveFlag_FrameError(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->ISR, LPUART_ISR_FERR_Msk) == (LPUART_ISR_FERR_Msk)); +} + +/** + * @brief Clear LPUART Frame Error Flag + * @rmtoll ISR FERR FL_LPUART_ClearFlag_FrameError + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_ClearFlag_FrameError(LPUART_Type *LPUARTx) +{ + WRITE_REG(LPUARTx->ISR, LPUART_ISR_FERR_Msk); +} + +/** + * @brief Get LPUART Receive Buffer Overflow Error Flag + * @rmtoll ISR OERR FL_LPUART_IsActiveFlag_RXBuffOverflow + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsActiveFlag_RXBuffOverflow(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->ISR, LPUART_ISR_OERR_Msk) == (LPUART_ISR_OERR_Msk)); +} + +/** + * @brief Clear LPUART Receive Buffer Overflow Error Flag + * @rmtoll ISR OERR FL_LPUART_ClearFlag_RXBuffOverflow + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_ClearFlag_RXBuffOverflow(LPUART_Type *LPUARTx) +{ + WRITE_REG(LPUARTx->ISR, LPUART_ISR_OERR_Msk); +} + +/** + * @brief Get LPUART Receive Buffer Full Flag + * @rmtoll ISR RXBF FL_LPUART_IsActiveFlag_RXBuffFull + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsActiveFlag_RXBuffFull(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->ISR, LPUART_ISR_RXBF_Msk) == (LPUART_ISR_RXBF_Msk)); +} + +/** + * @brief Clear LPUART Receive Buffer Full Flag + * @rmtoll ISR RXBF FL_LPUART_ClearFlag_RXBuffFull + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_ClearFlag_RXBuffFull(LPUART_Type *LPUARTx) +{ + WRITE_REG(LPUARTx->ISR, LPUART_ISR_RXBF_Msk); +} + +/** + * @brief Get LPUART Transmit Buffer Empty Flag + * @rmtoll ISR TXBE FL_LPUART_IsActiveFlag_TXBuffEmpty + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsActiveFlag_TXBuffEmpty(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->ISR, LPUART_ISR_TXBE_Msk) == (LPUART_ISR_TXBE_Msk)); +} + +/** + * @brief Clear LPUART Transmit Buffer Empty Flag + * @rmtoll ISR TXBE FL_LPUART_ClearFlag_TXBuffEmpty + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_ClearFlag_TXBuffEmpty(LPUART_Type *LPUARTx) +{ + WRITE_REG(LPUARTx->ISR, LPUART_ISR_TXBE_Msk); +} + +/** + * @brief Get LPUART Transmit Shift register Empty Flag + * @rmtoll ISR TXSE FL_LPUART_IsActiveFlag_TXShiftBuffEmpty + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsActiveFlag_TXShiftBuffEmpty(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->ISR, LPUART_ISR_TXSE_Msk) == (LPUART_ISR_TXSE_Msk)); +} + +/** + * @brief Clear LPUART Transmit Shift register Empty Flag + * @rmtoll ISR TXSE FL_LPUART_ClearFlag_TXShiftBuffEmpty + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_ClearFlag_TXShiftBuffEmpty(LPUART_Type *LPUARTx) +{ + WRITE_REG(LPUARTx->ISR, LPUART_ISR_TXSE_Msk); +} + +/** + * @brief Enable LPUART BaudRate Modulation + * @rmtoll BMR MCTL_EN FL_LPUART_EnableBaudRateModulation + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_EnableBaudRateModulation(LPUART_Type *LPUARTx) +{ + SET_BIT(LPUARTx->BMR, LPUART_BMR_MCTL_EN_Msk); +} + +/** + * @brief Get LPUART BaudRate Modulation Enable Status + * @rmtoll BMR MCTL_EN FL_LPUART_IsEnabledBaudRateModulation + * @param LPUARTx LPUART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_LPUART_IsEnabledBaudRateModulation(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->BMR, LPUART_BMR_MCTL_EN_Msk) == LPUART_BMR_MCTL_EN_Msk); +} + +/** + * @brief Disable LPUART BaudRate Modulation + * @rmtoll BMR MCTL_EN FL_LPUART_DisableBaudRateModulation + * @param LPUARTx LPUART instance + * @retval None + */ +__STATIC_INLINE void FL_LPUART_DisableBaudRateModulation(LPUART_Type *LPUARTx) +{ + CLEAR_BIT(LPUARTx->BMR, LPUART_BMR_MCTL_EN_Msk); +} + +/** + * @brief Set LPUART BaudRate + * @rmtoll BMR BAUD FL_LPUART_SetBaudRate + * @param LPUARTx LPUART instance + * @param baudRate This parameter can be one of the following values: + * @arg @ref FL_LPUART_BAUDRATE_9600 + * @arg @ref FL_LPUART_BAUDRATE_4800 + * @arg @ref FL_LPUART_BAUDRATE_2400 + * @arg @ref FL_LPUART_BAUDRATE_1200 + * @arg @ref FL_LPUART_BAUDRATE_600 + * @arg @ref FL_LPUART_BAUDRATE_300 + * @retval None + */ +__STATIC_INLINE void FL_LPUART_SetBaudRate(LPUART_Type *LPUARTx, uint32_t baudRate) +{ + MODIFY_REG(LPUARTx->BMR, LPUART_BMR_BAUD_Msk, baudRate); +} + +/** + * @brief Get LPUART BaudRate + * @rmtoll BMR BAUD FL_LPUART_GetBaudRate + * @param LPUARTx LPUART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_LPUART_BAUDRATE_9600 + * @arg @ref FL_LPUART_BAUDRATE_4800 + * @arg @ref FL_LPUART_BAUDRATE_2400 + * @arg @ref FL_LPUART_BAUDRATE_1200 + * @arg @ref FL_LPUART_BAUDRATE_600 + * @arg @ref FL_LPUART_BAUDRATE_300 + */ +__STATIC_INLINE uint32_t FL_LPUART_GetBaudRate(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->BMR, LPUART_BMR_BAUD_Msk)); +} + +/** + * @brief LPUART Receive 1 byte of data + * @rmtoll RXBUF FL_LPUART_ReadRXBuff + * @param LPUARTx LPUART instance + * @retval The LPUart received data + */ +__STATIC_INLINE uint32_t FL_LPUART_ReadRXBuff(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->RXBUF, 0x1ffU)); +} + +/** + * @brief LPUART Transmit 1 byte of data + * @rmtoll TXBUF FL_LPUART_WriteTXBuff + * @param LPUARTx LPUART instance + * @param data The data need to transmit through the LPUart + * @retval None + */ +__STATIC_INLINE void FL_LPUART_WriteTXBuff(LPUART_Type *LPUARTx, uint8_t data) +{ + MODIFY_REG(LPUARTx->TXBUF, 0x1ffU, data); +} + +/** + * @brief Set LPUART Matched Data + * @rmtoll DMR FL_LPUART_WriteMatchData + * @param LPUARTx LPUART instance + * @param data The value of match under SLEEP MODE + * @retval None + */ +__STATIC_INLINE void FL_LPUART_WriteMatchData(LPUART_Type *LPUARTx, uint8_t data) +{ + MODIFY_REG(LPUARTx->DMR, 0x1ffU, data); +} + +/** + * @brief Get LPUART Matched Data + * @rmtoll DMR FL_LPUART_ReadMatchData + * @param LPUARTx LPUART instance + * @retval The value of match data under SLEEP MODE + */ +__STATIC_INLINE uint32_t FL_LPUART_ReadMatchData(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->DMR, 0x1ffU)); +} + +/** + * @brief Set LPUART Bit Modulation + * @rmtoll BMR MCTL FL_LPUART_WriteBitModulation + * @param LPUARTx LPUART instance + * @param bitModulation The value of Bit Modulation Control + * @retval None + */ +__STATIC_INLINE void FL_LPUART_WriteBitModulation(LPUART_Type *LPUARTx, uint32_t bitModulation) +{ + MODIFY_REG(LPUARTx->BMR, (0xfffU << 16U), (bitModulation << 16U)); +} + +/** + * @brief Get LPUART Bit Modulation + * @rmtoll BMR MCTL FL_LPUART_ReadBitModulation + * @param LPUARTx LPUART instance + * @retval The value of Bit Modulation Control + */ +__STATIC_INLINE uint32_t FL_LPUART_ReadBitModulation(LPUART_Type *LPUARTx) +{ + return (uint32_t)(READ_BIT(LPUARTx->BMR, (0xfffU << 16U)) >> 16U); +} + +/** + * @} + */ + +/** @defgroup LPUART_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_LPUART_DeInit(LPUART_Type *LPUARTx); +void FL_LPUART_StructInit(FL_LPUART_InitTypeDef *initStruct); +FL_ErrorStatus FL_LPUART_Init(LPUART_Type *LPUARTx, FL_LPUART_InitTypeDef *initStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_LPUART_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-14*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_pmu.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_pmu.h new file mode 100644 index 0000000..2ac4125 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_pmu.h @@ -0,0 +1,1017 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_pmu.h + * @author FMSH Application Team + * @brief Head file of PMU FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_PMU_H +#define __FM33LG0XX_FL_PMU_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup PMU PMU + * @brief PMU FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup PMU_FL_ES_INIT PMU Exported Init structures + * @{ + */ + +/** + * @brief FL PMU Init Sturcture definition + */ +typedef struct +{ + /*! 低功耗模式配置 */ + uint32_t powerMode; + /*! 低功耗模式下内核电压降低与否 */ + FL_FunState coreVoltageScaling; + /*! 睡眠模式配置 */ + uint32_t deepSleep; + /*! 唤醒后的系统频率,仅对RCHF */ + uint32_t wakeupFrequency; + /*! 芯片LDO是否进入低功耗 */ + uint32_t LDOLowPowerMode; + /*! 额外唤醒延迟 */ + uint32_t wakeupDelay; +} FL_PMU_SleepInitTypeDef; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup PMU_FL_Exported_Constants PMU Exported Constants + * @{ + */ + +#define PMU_CR_LDO_LPM_Pos (18U) +#define PMU_CR_LDO_LPM_Msk (0x3U << PMU_CR_LDO_LPM_Pos) +#define PMU_CR_LDO_LPM PMU_CR_LDO_LPM_Msk + +#define PMU_CR_LDO15EN_Pos (17U) +#define PMU_CR_LDO15EN_Msk (0x1U << PMU_CR_LDO15EN_Pos) +#define PMU_CR_LDO15EN PMU_CR_LDO15EN_Msk + +#define PMU_CR_LDO15EN_B_Pos (16U) +#define PMU_CR_LDO15EN_B_Msk (0x1U << PMU_CR_LDO15EN_B_Pos) +#define PMU_CR_LDO15EN_B PMU_CR_LDO15EN_B_Msk + +#define PMU_CR_WKFSEL_Pos (10U) +#define PMU_CR_WKFSEL_Msk (0x3U << PMU_CR_WKFSEL_Pos) +#define PMU_CR_WKFSEL PMU_CR_WKFSEL_Msk + +#define PMU_CR_SLPDP_Pos (9U) +#define PMU_CR_SLPDP_Msk (0x1U << PMU_CR_SLPDP_Pos) +#define PMU_CR_SLPDP PMU_CR_SLPDP_Msk + +#define PMU_CR_CVS_Pos (8U) +#define PMU_CR_CVS_Msk (0x1U << PMU_CR_CVS_Pos) +#define PMU_CR_CVS PMU_CR_CVS_Msk + +#define PMU_CR_PMOD_Pos (0U) +#define PMU_CR_PMOD_Msk (0x3U << PMU_CR_PMOD_Pos) +#define PMU_CR_PMOD PMU_CR_PMOD_Msk + +#define PMU_WKTR_VREFDLY_Pos (3U) +#define PMU_WKTR_VREFDLY_Msk (0x1U << PMU_WKTR_VREFDLY_Pos) +#define PMU_WKTR_VREFDLY PMU_WKTR_VREFDLY_Msk + +#define PMU_WKTR_STPCLR_Pos (2U) +#define PMU_WKTR_STPCLR_Msk (0x1U << PMU_WKTR_STPCLR_Pos) +#define PMU_WKTR_STPCLR PMU_WKTR_STPCLR_Msk + +#define PMU_WKTR_T1A_Pos (0U) +#define PMU_WKTR_T1A_Msk (0x3U << PMU_WKTR_T1A_Pos) +#define PMU_WKTR_T1A PMU_WKTR_T1A_Msk + +#define PMU_WKFR_ADCWKF_Pos (31U) +#define PMU_WKFR_ADCWKF_Msk (0x1U << PMU_WKFR_ADCWKF_Pos) +#define PMU_WKFR_ADCWKF PMU_WKFR_ADCWKF_Msk + +#define PMU_WKFR_UART1WKF_Pos (30U) +#define PMU_WKFR_UART1WKF_Msk (0x1U << PMU_WKFR_UART1WKF_Pos) +#define PMU_WKFR_UART1WKF PMU_WKFR_UART1WKF_Msk + +#define PMU_WKFR_UART0WKF_Pos (29U) +#define PMU_WKFR_UART0WKF_Msk (0x1U << PMU_WKFR_UART0WKF_Pos) +#define PMU_WKFR_UART0WKF PMU_WKFR_UART0WKF_Msk + +#define PMU_WKFR_RTCWKF_Pos (28U) +#define PMU_WKFR_RTCWKF_Msk (0x1U << PMU_WKFR_RTCWKF_Pos) +#define PMU_WKFR_RTCWKF PMU_WKFR_RTCWKF_Msk + +#define PMU_WKFR_SVDWKF_Pos (27U) +#define PMU_WKFR_SVDWKF_Msk (0x1U << PMU_WKFR_SVDWKF_Pos) +#define PMU_WKFR_SVDWKF PMU_WKFR_SVDWKF_Msk + +#define PMU_WKFR_LFDETWKF_Pos (26U) +#define PMU_WKFR_LFDETWKF_Msk (0x1U << PMU_WKFR_LFDETWKF_Pos) +#define PMU_WKFR_LFDETWKF PMU_WKFR_LFDETWKF_Msk + +#define PMU_WKFR_VREFWKF_Pos (25U) +#define PMU_WKFR_VREFWKF_Msk (0x1U << PMU_WKFR_VREFWKF_Pos) +#define PMU_WKFR_VREFWKF PMU_WKFR_VREFWKF_Msk + +#define PMU_WKFR_IOWKF_Pos (24U) +#define PMU_WKFR_IOWKF_Msk (0x1U << PMU_WKFR_IOWKF_Pos) +#define PMU_WKFR_IOWKF PMU_WKFR_IOWKF_Msk + +#define PMU_WKFR_IICWKF_Pos (23U) +#define PMU_WKFR_IICWKF_Msk (0x1U << PMU_WKFR_IICWKF_Pos) +#define PMU_WKFR_IICWKF PMU_WKFR_IICWKF_Msk + +#define PMU_WKFR_LPU2WKF_Pos (22U) +#define PMU_WKFR_LPU2WKF_Msk (0x1U << PMU_WKFR_LPU2WKF_Pos) +#define PMU_WKFR_LPU2WKF PMU_WKFR_LPU2WKF_Msk + +#define PMU_WKFR_LPU1WKF_Pos (21U) +#define PMU_WKFR_LPU1WKF_Msk (0x1U << PMU_WKFR_LPU1WKF_Pos) +#define PMU_WKFR_LPU1WKF PMU_WKFR_LPU1WKF_Msk + +#define PMU_WKFR_LPU0WKF_Pos (20U) +#define PMU_WKFR_LPU0WKF_Msk (0x1U << PMU_WKFR_LPU0WKF_Pos) +#define PMU_WKFR_LPU0WKF PMU_WKFR_LPU0WKF_Msk + +#define PMU_WKFR_COMP3WKF_Pos (18U) +#define PMU_WKFR_COMP3WKF_Msk (0x1U << PMU_WKFR_COMP3WKF_Pos) +#define PMU_WKFR_COMP3WKF PMU_WKFR_COMP3WKF_Msk + +#define PMU_WKFR_COMP2WKF_Pos (17U) +#define PMU_WKFR_COMP2WKF_Msk (0x1U << PMU_WKFR_COMP2WKF_Pos) +#define PMU_WKFR_COMP2WKF PMU_WKFR_COMP2WKF_Msk + +#define PMU_WKFR_COMP1WKF_Pos (16U) +#define PMU_WKFR_COMP1WKF_Msk (0x1U << PMU_WKFR_COMP1WKF_Pos) +#define PMU_WKFR_COMP1WKF PMU_WKFR_COMP1WKF_Msk + +#define PMU_WKFR_LPT32WKF_Pos (14U) +#define PMU_WKFR_LPT32WKF_Msk (0x1U << PMU_WKFR_LPT32WKF_Pos) +#define PMU_WKFR_LPT32WKF PMU_WKFR_LPT32WKF_Msk + +#define PMU_WKFR_LPT16WKF_Pos (13U) +#define PMU_WKFR_LPT16WKF_Msk (0x1U << PMU_WKFR_LPT16WKF_Pos) +#define PMU_WKFR_LPT16WKF PMU_WKFR_LPT16WKF_Msk + +#define PMU_WKFR_BST32WKF_Pos (12U) +#define PMU_WKFR_BST32WKF_Msk (0x1U << PMU_WKFR_BST32WKF_Pos) +#define PMU_WKFR_BST32WKF PMU_WKFR_BST32WKF_Msk + +#define PMU_WKFR_BST16WKF_Pos (11U) +#define PMU_WKFR_BST16WKF_Msk (0x1U << PMU_WKFR_BST16WKF_Pos) +#define PMU_WKFR_BST16WKF PMU_WKFR_BST16WKF_Msk + +#define PMU_WKFR_DBGWKF_Pos (10U) +#define PMU_WKFR_DBGWKF_Msk (0x1U << PMU_WKFR_DBGWKF_Pos) +#define PMU_WKFR_DBGWKF PMU_WKFR_DBGWKF_Msk + +#define PMU_WKFR_WKPXF_Pos (0U) +#define PMU_WKFR_WKPXF_Msk (0x3ffU << PMU_WKFR_WKPXF_Pos) +#define PMU_WKFR_WKPXF PMU_WKFR_WKPXF_Msk + +#define PMU_IER_LPACTIE_Pos (2U) +#define PMU_IER_LPACTIE_Msk (0x1U << PMU_IER_LPACTIE_Pos) +#define PMU_IER_LPACTIE PMU_IER_LPACTIE_Msk + +#define PMU_IER_SLPEIE_Pos (1U) +#define PMU_IER_SLPEIE_Msk (0x1U << PMU_IER_SLPEIE_Pos) +#define PMU_IER_SLPEIE PMU_IER_SLPEIE_Msk + +#define PMU_IER_LPREIE_Pos (0U) +#define PMU_IER_LPREIE_Msk (0x1U << PMU_IER_LPREIE_Pos) +#define PMU_IER_LPREIE PMU_IER_LPREIE_Msk + +#define PMU_ISR_LPACTIF_Pos (2U) +#define PMU_ISR_LPACTIF_Msk (0x1U << PMU_ISR_LPACTIF_Pos) +#define PMU_ISR_LPACTIF PMU_ISR_LPACTIF_Msk + +#define PMU_ISR_SLPEIF_Pos (1U) +#define PMU_ISR_SLPEIF_Msk (0x1U << PMU_ISR_SLPEIF_Pos) +#define PMU_ISR_SLPEIF PMU_ISR_SLPEIF_Msk + +#define PMU_ISR_LPREIF_Pos (0U) +#define PMU_ISR_LPREIF_Msk (0x1U << PMU_ISR_LPREIF_Pos) +#define PMU_ISR_LPREIF PMU_ISR_LPREIF_Msk + + + +#define FL_PMU_WAKEUP0_PIN (0x1U << 0U) +#define FL_PMU_WAKEUP1_PIN (0x1U << 1U) +#define FL_PMU_WAKEUP2_PIN (0x1U << 2U) +#define FL_PMU_WAKEUP3_PIN (0x1U << 3U) +#define FL_PMU_WAKEUP4_PIN (0x1U << 4U) +#define FL_PMU_WAKEUP5_PIN (0x1U << 5U) +#define FL_PMU_WAKEUP6_PIN (0x1U << 6U) +#define FL_PMU_WAKEUP7_PIN (0x1U << 7U) +#define FL_PMU_WAKEUP8_PIN (0x1U << 8U) +#define FL_PMU_WAKEUP9_PIN (0x1U << 9U) + + + +#define FL_PMU_LDO_LPM_DISABLE (0x0U << PMU_CR_LDO_LPM_Pos) +#define FL_PMU_LDO_LPM_ENABLE (0x2U << PMU_CR_LDO_LPM_Pos) + + +#define FL_PMU_RCHF_WAKEUP_FREQ_8MHZ (0x0U << PMU_CR_WKFSEL_Pos) +#define FL_PMU_RCHF_WAKEUP_FREQ_16MHZ (0x1U << PMU_CR_WKFSEL_Pos) +#define FL_PMU_RCHF_WAKEUP_FREQ_24MHZ (0x2U << PMU_CR_WKFSEL_Pos) + + +#define FL_PMU_SLEEP_MODE_DEEP (0x1U << PMU_CR_SLPDP_Pos) +#define FL_PMU_SLEEP_MODE_NORMAL (0x0U << PMU_CR_SLPDP_Pos) + + +#define FL_PMU_POWER_MODE_ACTIVE_OR_LPACTIVE (0x0U << PMU_CR_PMOD_Pos) +#define FL_PMU_POWER_MODE_LPRUN_ONLY (0x1U << PMU_CR_PMOD_Pos) +#define FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP (0x2U << PMU_CR_PMOD_Pos) + +#define FL_PMU_WAKEUP_DELAY_MODE_IMMEDIATE (0x0U << PMU_WKTR_VREFDLY_Pos) +#define FL_PMU_WAKEUP_DELAY_MODE_WAIT_VREF1P2 (0x1U << PMU_WKTR_VREFDLY_Pos) + + +#define FL_PMU_FLASH_STOP_CLEAR_MODE_SYNCHRONOUS (0x0U << PMU_WKTR_STPCLR_Pos) +#define FL_PMU_FLASH_STOP_CLEAR_MODE_ASYNCHRONOUS (0x1U << PMU_WKTR_STPCLR_Pos) + + +#define FL_PMU_WAKEUP_DELAY_0US (0x0U << PMU_WKTR_T1A_Pos) +#define FL_PMU_WAKEUP_DELAY_2US (0x1U << PMU_WKTR_T1A_Pos) +#define FL_PMU_WAKEUP_DELAY_4US (0x2U << PMU_WKTR_T1A_Pos) +#define FL_PMU_WAKEUP_DELAY_8US (0x3U << PMU_WKTR_T1A_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup PMU_FL_Exported_Functions PMU Exported Functions + * @{ + */ + +/** + * @brief Set LDO Low Power Mode + * @rmtoll CR LDO_LPM FL_PMU_SetLDOLowPowerMode + * @param PMUx PMU instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_PMU_LDO_LPM_DISABLE + * @arg @ref FL_PMU_LDO_LPM_ENABLE + * @retval None + */ +__STATIC_INLINE void FL_PMU_SetLDOLowPowerMode(PMU_Type *PMUx, uint32_t mode) +{ + MODIFY_REG(PMUx->CR, PMU_CR_LDO_LPM_Msk, mode); +} + +/** + * @brief Get LDO Low Power Mode Setting + * @rmtoll CR LDO_LPM FL_PMU_GetLDOLowPowerMode + * @param PMUx PMU instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_PMU_LDO_LPM_DISABLE + * @arg @ref FL_PMU_LDO_LPM_ENABLE + */ +__STATIC_INLINE uint32_t FL_PMU_GetLDOLowPowerMode(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->CR, PMU_CR_LDO_LPM_Msk)); +} + +/** + * @brief Get LDO15 Enable Status + * @rmtoll CR LDO15EN FL_PMU_GetLDO15Status + * @param PMUx PMU instance + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_PMU_GetLDO15Status(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->CR, PMU_CR_LDO15EN_Msk)); +} + +/** + * @brief Get LDO15 Inverse check bit + * @rmtoll CR LDO15EN_B FL_PMU_GetLDO15StatusInvert + * @param PMUx PMU instance + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_PMU_GetLDO15StatusInvert(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->CR, PMU_CR_LDO15EN_B_Msk)); +} + +/** + * @brief Set RCHF Frequency After Wakeup + * @rmtoll CR WKFSEL FL_PMU_SetRCHFWakeupFrequency + * @param PMUx PMU instance + * @param Freq This parameter can be one of the following values: + * @arg @ref FL_PMU_RCHF_WAKEUP_FREQ_8MHZ + * @arg @ref FL_PMU_RCHF_WAKEUP_FREQ_16MHZ + * @arg @ref FL_PMU_RCHF_WAKEUP_FREQ_24MHZ + * @retval None + */ +__STATIC_INLINE void FL_PMU_SetRCHFWakeupFrequency(PMU_Type *PMUx, uint32_t Freq) +{ + MODIFY_REG(PMUx->CR, PMU_CR_WKFSEL_Msk, Freq); +} + +/** + * @brief Get RCHF Frequency After Wakeup Setting + * @rmtoll CR WKFSEL FL_PMU_GetRCHFWakeupFrequency + * @param PMUx PMU instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_PMU_RCHF_WAKEUP_FREQ_8MHZ + * @arg @ref FL_PMU_RCHF_WAKEUP_FREQ_16MHZ + * @arg @ref FL_PMU_RCHF_WAKEUP_FREQ_24MHZ + */ +__STATIC_INLINE uint32_t FL_PMU_GetRCHFWakeupFrequency(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->CR, PMU_CR_WKFSEL_Msk)); +} + +/** + * @brief Set Sleep Mode + * @rmtoll CR SLPDP FL_PMU_SetSleepMode + * @param PMUx PMU instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_PMU_SLEEP_MODE_DEEP + * @arg @ref FL_PMU_SLEEP_MODE_NORMAL + * @retval None + */ +__STATIC_INLINE void FL_PMU_SetSleepMode(PMU_Type *PMUx, uint32_t mode) +{ + MODIFY_REG(PMUx->CR, PMU_CR_SLPDP_Msk, mode); +} + +/** + * @brief Get Sleep Mode Setting + * @rmtoll CR SLPDP FL_PMU_GetSleepMode + * @param PMUx PMU instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_PMU_SLEEP_MODE_DEEP + * @arg @ref FL_PMU_SLEEP_MODE_NORMAL + */ +__STATIC_INLINE uint32_t FL_PMU_GetSleepMode(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->CR, PMU_CR_SLPDP_Msk)); +} + +/** + * @brief Enable Core Voltage Scaling Under Low Power Mode + * @rmtoll CR CVS FL_PMU_EnableCoreVoltageScaling + * @param PMUx PMU instance + * @retval None + */ +__STATIC_INLINE void FL_PMU_EnableCoreVoltageScaling(PMU_Type *PMUx) +{ + SET_BIT(PMUx->CR, PMU_CR_CVS_Msk); +} + +/** + * @brief Get Core Voltage Scaling Under Low Power Mode Enable Status + * @rmtoll CR CVS FL_PMU_IsEnabledCoreVoltageScaling + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsEnabledCoreVoltageScaling(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->CR, PMU_CR_CVS_Msk) == PMU_CR_CVS_Msk); +} + +/** + * @brief Disable Core Voltage Scaling Under Low Power Mode + * @rmtoll CR CVS FL_PMU_DisableCoreVoltageScaling + * @param PMUx PMU instance + * @retval None + */ +__STATIC_INLINE void FL_PMU_DisableCoreVoltageScaling(PMU_Type *PMUx) +{ + CLEAR_BIT(PMUx->CR, PMU_CR_CVS_Msk); +} + +/** + * @brief Set Low Power Mode + * @rmtoll CR PMOD FL_PMU_SetLowPowerMode + * @param PMUx PMU instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_PMU_POWER_MODE_ACTIVE_OR_LPACTIVE + * @arg @ref FL_PMU_POWER_MODE_LPRUN_ONLY + * @arg @ref FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP + * @retval None + */ +__STATIC_INLINE void FL_PMU_SetLowPowerMode(PMU_Type *PMUx, uint32_t mode) +{ + MODIFY_REG(PMUx->CR, PMU_CR_PMOD_Msk, mode); +} + +/** + * @brief Get Low Power Mode Setting + * @rmtoll CR PMOD FL_PMU_GetLowPowerMode + * @param PMUx PMU instance + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_PMU_GetLowPowerMode(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->CR, PMU_CR_PMOD_Msk)); +} + +/** + * @brief Set VREF delay wakeup mode + * @rmtoll WKTR VREFDLY FL_PMU_SetVREFWakeupDelayMode + * @param PMUx PMU instance + * @param VREFDelay This parameter can be one of the following values: + * @arg @ref FL_PMU_WAKEUP_DELAY_MODE_IMMEDIATE + * @arg @ref FL_PMU_WAKEUP_DELAY_MODE_WAIT_VREF1P2 + * @retval None + */ +__STATIC_INLINE void FL_PMU_SetVREFWakeupDelayMode(PMU_Type *PMUx, uint32_t VREFDelay) +{ + MODIFY_REG(PMUx->WKTR, PMU_WKTR_VREFDLY_Msk, VREFDelay); +} + +/** + * @brief Get VREF delay wakeup status + * @rmtoll WKTR VREFDLY FL_PMU_GetVREFWakeupDelayMode + * @param PMUx PMU instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_PMU_WAKEUP_DELAY_MODE_IMMEDIATE + * @arg @ref FL_PMU_WAKEUP_DELAY_MODE_WAIT_VREF1P2 + */ +__STATIC_INLINE uint32_t FL_PMU_GetVREFWakeupDelayMode(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKTR, PMU_WKTR_VREFDLY_Msk)); +} + +/** + * @brief Set Flash Stop Signal Clear Way + * @rmtoll WKTR STPCLR FL_PMU_SetFlashStopSignalClearMode + * @param PMUx PMU instance + * @param config This parameter can be one of the following values: + * @arg @ref FL_PMU_FLASH_STOP_CLEAR_MODE_ASYNCHRONOUS + * @arg @ref FL_PMU_FLASH_STOP_CLEAR_MODE_SYNCHRONOUS + * @retval None + */ +__STATIC_INLINE void FL_PMU_SetFlashStopSignalClearMode(PMU_Type *PMUx, uint32_t config) +{ + MODIFY_REG(PMUx->WKTR, PMU_WKTR_STPCLR_Msk, config); +} + +/** + * @brief Get Flash Stop Signal Clear Way Setting + * @rmtoll WKTR STPCLR FL_PMU_GetFlashStopSignalClearMode + * @param PMUx PMU instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_PMU_FLASH_STOP_CLEAR_MODE_ASYNCHRONOUS + * @arg @ref FL_PMU_FLASH_STOP_CLEAR_MODE_SYNCHRONOUS + */ +__STATIC_INLINE uint32_t FL_PMU_GetFlashStopSignalClearMode(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKTR, PMU_WKTR_STPCLR_Msk)); +} + +/** + * @brief Set Extra Wakeup Delay Under Sleep/DeepSleep Mode + * @rmtoll WKTR T1A FL_PMU_SetWakeupDelay + * @param PMUx PMU instance + * @param time This parameter can be one of the following values: + * @arg @ref FL_PMU_WAKEUP_DELAY_0US + * @arg @ref FL_PMU_WAKEUP_DELAY_2US + * @arg @ref FL_PMU_WAKEUP_DELAY_4US + * @arg @ref FL_PMU_WAKEUP_DELAY_8US + * @retval None + */ +__STATIC_INLINE void FL_PMU_SetWakeupDelay(PMU_Type *PMUx, uint32_t time) +{ + MODIFY_REG(PMUx->WKTR, PMU_WKTR_T1A_Msk, time); +} + +/** + * @brief Get Extra Wakeup Delay Under Sleep/DeepSleep Mode Setting + * @rmtoll WKTR T1A FL_PMU_GetWakeupDelay + * @param PMUx PMU instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_PMU_WAKEUP_DELAY_0US + * @arg @ref FL_PMU_WAKEUP_DELAY_2US + * @arg @ref FL_PMU_WAKEUP_DELAY_4US + * @arg @ref FL_PMU_WAKEUP_DELAY_8US + */ +__STATIC_INLINE uint32_t FL_PMU_GetWakeupDelay(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKTR, PMU_WKTR_T1A_Msk)); +} + +/** + * @brief Get ADC interrupt wakeup flag + * @rmtoll WKFR ADCWKF FL_PMU_IsActiveFlag_WakeupADC + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupADC(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_ADCWKF_Msk) == (PMU_WKFR_ADCWKF_Msk)); +} + +/** + * @brief Get UART1 interrupt wakeup flag + * @rmtoll WKFR UART1WKF FL_PMU_IsActiveFlag_WakeupUART1 + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupUART1(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_UART1WKF_Msk) == (PMU_WKFR_UART1WKF_Msk)); +} + +/** + * @brief Get UART0 interrupt wakeup flag + * @rmtoll WKFR UART0WKF FL_PMU_IsActiveFlag_WakeupUART0 + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupUART0(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_UART0WKF_Msk) == (PMU_WKFR_UART0WKF_Msk)); +} + +/** + * @brief Get RTC interrupt wakeup flag + * @rmtoll WKFR RTCWKF FL_PMU_IsActiveFlag_WakeupRTC + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupRTC(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_RTCWKF_Msk) == (PMU_WKFR_RTCWKF_Msk)); +} + +/** + * @brief Get SVD interrupt wakeup flag + * @rmtoll WKFR SVDWKF FL_PMU_IsActiveFlag_WakeupSVD + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupSVD(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_SVDWKF_Msk) == (PMU_WKFR_SVDWKF_Msk)); +} + +/** + * @brief Get LFDET interrupt wakeup flag + * @rmtoll WKFR LFDETWKF FL_PMU_IsActiveFlag_WakeupLFDET + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupLFDET(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_LFDETWKF_Msk) == (PMU_WKFR_LFDETWKF_Msk)); +} + +/** + * @brief Get VREF interrupt wakeup flag + * @rmtoll WKFR VREFWKF FL_PMU_IsActiveFlag_WakeupVREF + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupVREF(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_VREFWKF_Msk) == (PMU_WKFR_VREFWKF_Msk)); +} + +/** + * @brief Get IO interrupt wakeup flag + * @rmtoll WKFR IOWKF FL_PMU_IsActiveFlag_WakeupEXTI + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupEXTI(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_IOWKF_Msk) == (PMU_WKFR_IOWKF_Msk)); +} + +/** + * @brief Get I2C interrupt wakeup flag + * @rmtoll WKFR IICWKF FL_PMU_IsActiveFlag_WakeupI2C + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupI2C(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_IICWKF_Msk) == (PMU_WKFR_IICWKF_Msk)); +} + +/** + * @brief Get LPUART2 interrupt wakeup flag + * @rmtoll WKFR LPU2WKF FL_PMU_IsActiveFlag_WakeupLPUART2 + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupLPUART2(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_LPU2WKF_Msk) == (PMU_WKFR_LPU2WKF_Msk)); +} + +/** + * @brief Get LPUART1 interrupt wakeup flag + * @rmtoll WKFR LPU1WKF FL_PMU_IsActiveFlag_WakeupLPUART1 + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupLPUART1(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_LPU1WKF_Msk) == (PMU_WKFR_LPU1WKF_Msk)); +} + +/** + * @brief Get LPUART0 interrupt wakeup flag + * @rmtoll WKFR LPU0WKF FL_PMU_IsActiveFlag_WakeupLPUART0 + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupLPUART0(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_LPU0WKF_Msk) == (PMU_WKFR_LPU0WKF_Msk)); +} + +/** + * @brief Get COMP3 interrrupt wakeup flag + * @rmtoll WKFR COMP3WKF FL_PMU_IsActiveFlag_WakeupCOMP3 + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupCOMP3(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_COMP3WKF_Msk) == (PMU_WKFR_COMP3WKF_Msk)); +} + +/** + * @brief Get COMP2 interrrupt wakeup flag + * @rmtoll WKFR COMP2WKF FL_PMU_IsActiveFlag_WakeupCOMP2 + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupCOMP2(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_COMP2WKF_Msk) == (PMU_WKFR_COMP2WKF_Msk)); +} + +/** + * @brief Get COMP1 interrrupt wakeup flag + * @rmtoll WKFR COMP1WKF FL_PMU_IsActiveFlag_WakeupCOMP1 + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupCOMP1(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_COMP1WKF_Msk) == (PMU_WKFR_COMP1WKF_Msk)); +} + +/** + * @brief Get LPTIM32 interrupt wakeup flag + * @rmtoll WKFR LPT32WKF FL_PMU_IsActiveFlag_WakeupLPTIM32 + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupLPTIM32(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_LPT32WKF_Msk) == (PMU_WKFR_LPT32WKF_Msk)); +} + +/** + * @brief Get LPTIM16 interrupt wakeup flag + * @rmtoll WKFR LPT16WKF FL_PMU_IsActiveFlag_WakeupLPTIM16 + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupLPTIM16(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_LPT16WKF_Msk) == (PMU_WKFR_LPT16WKF_Msk)); +} + +/** + * @brief Get BSTIM32 interrupt wakeup flag + * @rmtoll WKFR BST32WKF FL_PMU_IsActiveFlag_WakeupBSTIM32 + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupBSTIM32(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_BST32WKF_Msk) == (PMU_WKFR_BST32WKF_Msk)); +} + +/** + * @brief Get BSTIM16 interrupt wakeup flag + * @rmtoll WKFR BST16WKF FL_PMU_IsActiveFlag_WakeupBSTIM16 + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupBSTIM16(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_BST16WKF_Msk) == (PMU_WKFR_BST16WKF_Msk)); +} + +/** + * @brief Get CPU Debugger wakeup flag + * @rmtoll WKFR DBGWKF FL_PMU_IsActiveFlag_WakeupDBG + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupDBG(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, PMU_WKFR_DBGWKF_Msk) == (PMU_WKFR_DBGWKF_Msk)); +} + +/** + * @brief Clear CPU Debugger wakeup flag + * @rmtoll WKFR DBGWKF FL_PMU_ClearFlag_WakeupDBG + * @param PMUx PMU instance + * @retval None + */ +__STATIC_INLINE void FL_PMU_ClearFlag_WakeupDBG(PMU_Type *PMUx) +{ + WRITE_REG(PMUx->WKFR, PMU_WKFR_DBGWKF_Msk); +} + +/** + * @brief Get pinx wakeup flag + * @rmtoll WKFR WKPXF FL_PMU_IsActiveFlag_WakeupPIN + * @param PMUx PMU instance + * @param Pin This parameter can be one of the following values: + * @arg @ref FL_PMU_WAKEUP0_PIN + * @arg @ref FL_PMU_WAKEUP1_PIN + * @arg @ref FL_PMU_WAKEUP2_PIN + * @arg @ref FL_PMU_WAKEUP3_PIN + * @arg @ref FL_PMU_WAKEUP4_PIN + * @arg @ref FL_PMU_WAKEUP5_PIN + * @arg @ref FL_PMU_WAKEUP6_PIN + * @arg @ref FL_PMU_WAKEUP7_PIN + * @arg @ref FL_PMU_WAKEUP8_PIN + * @arg @ref FL_PMU_WAKEUP9_PIN + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_WakeupPIN(PMU_Type *PMUx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(PMUx->WKFR, ((Pin & 0x3ff) << 0x0U)) == ((Pin & 0x3ff) << 0x0U)); +} + +/** + * @brief Clear pinx wakeup flag + * @rmtoll WKFR WKPXF FL_PMU_ClearFlag_WakeupPIN + * @param PMUx PMU instance + * @param Pin This parameter can be one of the following values: + * @arg @ref FL_PMU_WAKEUP0_PIN + * @arg @ref FL_PMU_WAKEUP1_PIN + * @arg @ref FL_PMU_WAKEUP2_PIN + * @arg @ref FL_PMU_WAKEUP3_PIN + * @arg @ref FL_PMU_WAKEUP4_PIN + * @arg @ref FL_PMU_WAKEUP5_PIN + * @arg @ref FL_PMU_WAKEUP6_PIN + * @arg @ref FL_PMU_WAKEUP7_PIN + * @arg @ref FL_PMU_WAKEUP8_PIN + * @arg @ref FL_PMU_WAKEUP9_PIN + * @retval None + */ +__STATIC_INLINE void FL_PMU_ClearFlag_WakeupPIN(PMU_Type *PMUx, uint32_t Pin) +{ + WRITE_REG(PMUx->WKFR, ((Pin & 0x3ff) << 0x0U)); +} + +/** + * @brief LPActive error interrupt enable + * @rmtoll IER LPACTIE FL_PMU_EnableIT_LPActiveError + * @param PMUx PMU instance + * @retval None + */ +__STATIC_INLINE void FL_PMU_EnableIT_LPActiveError(PMU_Type *PMUx) +{ + SET_BIT(PMUx->IER, PMU_IER_LPACTIE_Msk); +} + +/** + * @brief Get LPActive error interrupt enable status + * @rmtoll IER LPACTIE FL_PMU_IsEnabledIT_LPActiveError + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsEnabledIT_LPActiveError(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->IER, PMU_IER_LPACTIE_Msk) == PMU_IER_LPACTIE_Msk); +} + +/** + * @brief LPActive error interrupt disable + * @rmtoll IER LPACTIE FL_PMU_DisableIT_LPActiveError + * @param PMUx PMU instance + * @retval None + */ +__STATIC_INLINE void FL_PMU_DisableIT_LPActiveError(PMU_Type *PMUx) +{ + CLEAR_BIT(PMUx->IER, PMU_IER_LPACTIE_Msk); +} + +/** + * @brief Sleep error interrupt enable + * @rmtoll IER SLPEIE FL_PMU_EnableIT_SleepError + * @param PMUx PMU instance + * @retval None + */ +__STATIC_INLINE void FL_PMU_EnableIT_SleepError(PMU_Type *PMUx) +{ + SET_BIT(PMUx->IER, PMU_IER_SLPEIE_Msk); +} + +/** + * @brief Get sleep error interrupt enable status + * @rmtoll IER SLPEIE FL_PMU_IsEnabledIT_SleepError + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsEnabledIT_SleepError(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->IER, PMU_IER_SLPEIE_Msk) == PMU_IER_SLPEIE_Msk); +} + +/** + * @brief Sleep error interrupt disable + * @rmtoll IER SLPEIE FL_PMU_DisableIT_SleepError + * @param PMUx PMU instance + * @retval None + */ +__STATIC_INLINE void FL_PMU_DisableIT_SleepError(PMU_Type *PMUx) +{ + CLEAR_BIT(PMUx->IER, PMU_IER_SLPEIE_Msk); +} + +/** + * @brief LPREIE error interrupt enable + * @rmtoll IER LPREIE FL_PMU_EnableIT_LPRunError + * @param PMUx PMU instance + * @retval None + */ +__STATIC_INLINE void FL_PMU_EnableIT_LPRunError(PMU_Type *PMUx) +{ + SET_BIT(PMUx->IER, PMU_IER_LPREIE_Msk); +} + +/** + * @brief Get LPREIE error interrupt enable status + * @rmtoll IER LPREIE FL_PMU_IsEnabledIT_LPRunError + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsEnabledIT_LPRunError(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->IER, PMU_IER_LPREIE_Msk) == PMU_IER_LPREIE_Msk); +} + +/** + * @brief LPREIE error interrupt disable + * @rmtoll IER LPREIE FL_PMU_DisableIT_LPRunError + * @param PMUx PMU instance + * @retval None + */ +__STATIC_INLINE void FL_PMU_DisableIT_LPRunError(PMU_Type *PMUx) +{ + CLEAR_BIT(PMUx->IER, PMU_IER_LPREIE_Msk); +} + +/** + * @brief Get LPACTIF error interrupt flag + * @rmtoll ISR LPACTIF FL_PMU_IsActiveFlag_LPActiveError + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_LPActiveError(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->ISR, PMU_ISR_LPACTIF_Msk) == (PMU_ISR_LPACTIF_Msk)); +} + +/** + * @brief Clear LPACTIF error interrupt flag + * @rmtoll ISR LPACTIF FL_PMU_ClearFlag_LPActiveError + * @param PMUx PMU instance + * @retval None + */ +__STATIC_INLINE void FL_PMU_ClearFlag_LPActiveError(PMU_Type *PMUx) +{ + WRITE_REG(PMUx->ISR, PMU_ISR_LPACTIF_Msk); +} + +/** + * @brief Get SLEEP error interrupt flag + * @rmtoll ISR SLPEIF FL_PMU_IsActiveFlag_SleepError + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_SleepError(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->ISR, PMU_ISR_SLPEIF_Msk) == (PMU_ISR_SLPEIF_Msk)); +} + +/** + * @brief Clear SLEEP error interrupt flag + * @rmtoll ISR SLPEIF FL_PMU_ClearFlag_SleepError + * @param PMUx PMU instance + * @retval None + */ +__STATIC_INLINE void FL_PMU_ClearFlag_SleepError(PMU_Type *PMUx) +{ + WRITE_REG(PMUx->ISR, PMU_ISR_SLPEIF_Msk); +} + +/** + * @brief Get LPRUN error interrupt flag + * @rmtoll ISR LPREIF FL_PMU_IsActiveFlag_LPRunError + * @param PMUx PMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_PMU_IsActiveFlag_LPRunError(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->ISR, PMU_ISR_LPREIF_Msk) == (PMU_ISR_LPREIF_Msk)); +} + +/** + * @brief Clear LPRUN error interrupt flag + * @rmtoll ISR LPREIF FL_PMU_ClearFlag_LPRunError + * @param PMUx PMU instance + * @retval None + */ +__STATIC_INLINE void FL_PMU_ClearFlag_LPRunError(PMU_Type *PMUx) +{ + WRITE_REG(PMUx->ISR, PMU_ISR_LPREIF_Msk); +} + +/** + * @brief Set ULPBG output VREF + * @rmtoll ULPB_TR FL_PMU_WriteULPBGOutputTrim + * @param PMUx PMU instance + * @param trim + * @retval None + */ +__STATIC_INLINE void FL_PMU_WriteULPBGOutputTrim(PMU_Type *PMUx, uint32_t trim) +{ + MODIFY_REG(PMUx->ULPB_TR, (0x1fU << 0U), (trim << 0U)); +} + +/** + * @brief Get ULPBG output VREF + * @rmtoll ULPB_TR FL_PMU_ReadULPBGOutputTrim + * @param PMUx PMU instance + * @retval + */ +__STATIC_INLINE uint32_t FL_PMU_ReadULPBGOutputTrim(PMU_Type *PMUx) +{ + return (uint32_t)(READ_BIT(PMUx->ULPB_TR, (0x1fU << 0U)) >> 0U); +} + +/** + * @} + */ + +/** @defgroup PMU_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_PMU_Sleep_DeInit(PMU_Type *PMUx); +FL_ErrorStatus FL_PMU_Sleep_Init(PMU_Type *PMUx, FL_PMU_SleepInitTypeDef *LPM_InitStruct); +void FL_PMU_StructInit(FL_PMU_SleepInitTypeDef *LPM_InitStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_PMU_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.1 @ 2020-10-20*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_rmu.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_rmu.h new file mode 100644 index 0000000..ef4d284 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_rmu.h @@ -0,0 +1,758 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_rmu.h + * @author FMSH Application Team + * @brief Head file of RMU FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_RMU_H +#define __FM33LG0XX_FL_RMU_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup RMU RMU + * @brief RMU FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup RMU_FL_ES_INIT RMU Exported Init structures + * @{ + */ + +/** + * @brief FL RMU Init Sturcture definition + */ + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup RMU_FL_Exported_Constants RMU Exported Constants + * @{ + */ + +#define RMU_PDRCR_CFG_Pos (1U) +#define RMU_PDRCR_CFG_Msk (0x3U << RMU_PDRCR_CFG_Pos) +#define RMU_PDRCR_CFG RMU_PDRCR_CFG_Msk + +#define RMU_PDRCR_EN_Pos (0U) +#define RMU_PDRCR_EN_Msk (0x1U << RMU_PDRCR_EN_Pos) +#define RMU_PDRCR_EN RMU_PDRCR_EN_Msk + +#define RMU_BORCR_CFG_Pos (2U) +#define RMU_BORCR_CFG_Msk (0x3U << RMU_BORCR_CFG_Pos) +#define RMU_BORCR_CFG RMU_BORCR_CFG_Msk + +#define RMU_BORCR_ENB_Pos (0U) +#define RMU_BORCR_ENB_Msk (0x1U << RMU_BORCR_ENB_Pos) +#define RMU_BORCR_ENB RMU_BORCR_ENB_Msk + +#define RMU_LKPCR_EN_Pos (1U) +#define RMU_LKPCR_EN_Msk (0x1U << RMU_LKPCR_EN_Pos) +#define RMU_LKPCR_EN RMU_LKPCR_EN_Msk + +#define RMU_RSTFR_MDFN_FLAG_Pos (12U) +#define RMU_RSTFR_MDFN_FLAG_Msk (0x1U << RMU_RSTFR_MDFN_FLAG_Pos) +#define RMU_RSTFR_MDFN_FLAG RMU_RSTFR_MDFN_FLAG_Msk + +#define RMU_RSTFR_NRSTN_FLAG_Pos (11U) +#define RMU_RSTFR_NRSTN_FLAG_Msk (0x1U << RMU_RSTFR_NRSTN_FLAG_Pos) +#define RMU_RSTFR_NRSTN_FLAG RMU_RSTFR_NRSTN_FLAG_Msk + +#define RMU_RSTFR_PRC_FLAG_Pos (10U) +#define RMU_RSTFR_PRC_FLAG_Msk (0x1U << RMU_RSTFR_PRC_FLAG_Pos) +#define RMU_RSTFR_PRC_FLAG RMU_RSTFR_PRC_FLAG_Msk + +#define RMU_RSTFR_PORN_FLAG_Pos (9U) +#define RMU_RSTFR_PORN_FLAG_Msk (0x1U << RMU_RSTFR_PORN_FLAG_Pos) +#define RMU_RSTFR_PORN_FLAG RMU_RSTFR_PORN_FLAG_Msk + +#define RMU_RSTFR_PDRN_FLAG_Pos (8U) +#define RMU_RSTFR_PDRN_FLAG_Msk (0x1U << RMU_RSTFR_PDRN_FLAG_Pos) +#define RMU_RSTFR_PDRN_FLAG RMU_RSTFR_PDRN_FLAG_Msk + +#define RMU_RSTFR_SOFTN_FLAG_Pos (5U) +#define RMU_RSTFR_SOFTN_FLAG_Msk (0x1U << RMU_RSTFR_SOFTN_FLAG_Pos) +#define RMU_RSTFR_SOFTN_FLAG RMU_RSTFR_SOFTN_FLAG_Msk + +#define RMU_RSTFR_IWDTN_FLAG_Pos (4U) +#define RMU_RSTFR_IWDTN_FLAG_Msk (0x1U << RMU_RSTFR_IWDTN_FLAG_Pos) +#define RMU_RSTFR_IWDTN_FLAG RMU_RSTFR_IWDTN_FLAG_Msk + +#define RMU_RSTFR_WWDTN_FLAG_Pos (2U) +#define RMU_RSTFR_WWDTN_FLAG_Msk (0x1U << RMU_RSTFR_WWDTN_FLAG_Pos) +#define RMU_RSTFR_WWDTN_FLAG RMU_RSTFR_WWDTN_FLAG_Msk + +#define RMU_RSTFR_LKUPN_FLAG_Pos (1U) +#define RMU_RSTFR_LKUPN_FLAG_Msk (0x1U << RMU_RSTFR_LKUPN_FLAG_Pos) +#define RMU_RSTFR_LKUPN_FLAG RMU_RSTFR_LKUPN_FLAG_Msk + +#define RMU_RSTFR_NVICN_FLAG_Pos (0U) +#define RMU_RSTFR_NVICN_FLAG_Msk (0x1U << RMU_RSTFR_NVICN_FLAG_Pos) +#define RMU_RSTFR_NVICN_FLAG RMU_RSTFR_NVICN_FLAG_Msk + +#define PERHRSTEN_KEY (0x13579BDFUL) +#define SOFTWARERESET_KEY (0x5C5CAABBUL) + +#define FL_RMU_RSTAHB_DMA (0x1U << 0U) +#define FL_RMU_RSTAPB_UART5 (0x1fU << 0U) +#define FL_RMU_RSTAPB_UART4 (0x1eU << 0U) +#define FL_RMU_RSTAPB_UART3 (0x1dU << 0U) +#define FL_RMU_RSTAPB_UART1 (0x1bU << 0U) +#define FL_RMU_RSTAPB_UART0 (0x1aU << 0U) +#define FL_RMU_RSTAPB_UCIR (0x19U << 0U) +#define FL_RMU_RSTAPB_U7816 (0x18U << 0U) +#define FL_RMU_RSTAPB_GPTIM2 (0x17U << 0U) +#define FL_RMU_RSTAPB_GPTIM1 (0x16U << 0U) +#define FL_RMU_RSTAPB_GPTIM0 (0x15U << 0U) +#define FL_RMU_RSTAPB_ATIM (0x14U << 0U) +#define FL_RMU_RSTAPB_BSTIM32 (0x13U << 0U) +#define FL_RMU_RSTAPB_BSTIM16 (0x12U << 0U) +#define FL_RMU_RSTAPB_SPI2 (0xfU << 0U) +#define FL_RMU_RSTAPB_SPI1 (0xeU << 0U) +#define FL_RMU_RSTAPB_SPI0 (0xdU << 0U) +#define FL_RMU_RSTAPB_I2C (0xbU << 0U) +#define FL_RMU_RSTAPB_LPUART2 (0xaU << 0U) +#define FL_RMU_RSTAPB_LPUART1 (0x9U << 0U) +#define FL_RMU_RSTAPB_LPUART0 (0x8U << 0U) +#define FL_RMU_RSTAPB_VREF (0x6U << 0U) +#define FL_RMU_RSTAPB_PGL (0x5U << 0U) +#define FL_RMU_RSTAPB_LCD (0x4U << 0U) +#define FL_RMU_RSTAPB_DAC (0x3U << 0U) +#define FL_RMU_RSTAPB_OPA (0x2U << 0U) +#define FL_RMU_RSTAPB_LPTIM16 (0x1U << 0U) +#define FL_RMU_RSTAPB_LPTIM32 (0x0U << 0U) +#define FL_RMU_RSTAPB_ADCCR (0x38U << 0U) +#define FL_RMU_RSTAPB_ADC (0x37U << 0U) +#define FL_RMU_RSTAPB_AES (0x32U << 0U) +#define FL_RMU_RSTAPB_CRC (0x31U << 0U) +#define FL_RMU_RSTAPB_RNG (0x30U << 0U) +#define FL_RMU_RSTAPB_DIVAS (0x23U << 0U) +#define FL_RMU_RSTAPB_CAN (0x22U << 0U) +#define FL_RMU_RSTAPB_SVD (0x21U << 0U) +#define FL_RMU_RSTAPB_COMP (0x20U << 0U) + + + +#define FL_RMU_PDR_THRESHOLD_1P40V (0x0U << RMU_PDRCR_CFG_Pos) +#define FL_RMU_PDR_THRESHOLD_1P45V (0x1U << RMU_PDRCR_CFG_Pos) +#define FL_RMU_PDR_THRESHOLD_1P50V (0x2U << RMU_PDRCR_CFG_Pos) +#define FL_RMU_PDR_THRESHOLD_1P55V (0x3U << RMU_PDRCR_CFG_Pos) + + +#define FL_RMU_BOR_THRESHOLD_1P80V (0x0U << RMU_BORCR_CFG_Pos) +#define FL_RMU_BOR_THRESHOLD_2P00V (0x1U << RMU_BORCR_CFG_Pos) +#define FL_RMU_BOR_THRESHOLD_2P20V (0x2U << RMU_BORCR_CFG_Pos) +#define FL_RMU_BOR_THRESHOLD_2P40V (0x3U << RMU_BORCR_CFG_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup RMU_FL_Exported_Functions RMU Exported Functions + * @{ + */ + +/** + * @brief Set Power Down Reset Voltage + * @rmtoll PDRCR CFG FL_RMU_PDR_SetThreshold + * @param RMUx RMU instance + * @param threshold This parameter can be one of the following values: + * @arg @ref FL_RMU_PDR_THRESHOLD_1P40V + * @arg @ref FL_RMU_PDR_THRESHOLD_1P45V + * @arg @ref FL_RMU_PDR_THRESHOLD_1P50V + * @arg @ref FL_RMU_PDR_THRESHOLD_1P55V + * @retval None + */ +__STATIC_INLINE void FL_RMU_PDR_SetThreshold(RMU_Type *RMUx, uint32_t threshold) +{ + MODIFY_REG(RMUx->PDRCR, RMU_PDRCR_CFG_Msk, threshold); +} + +/** + * @brief Get Power Down Reset Voltage Setting + * @rmtoll PDRCR CFG FL_RMU_PDR_GetThreshold + * @param RMUx RMU instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_RMU_PDR_THRESHOLD_1P40V + * @arg @ref FL_RMU_PDR_THRESHOLD_1P45V + * @arg @ref FL_RMU_PDR_THRESHOLD_1P50V + * @arg @ref FL_RMU_PDR_THRESHOLD_1P55V + */ +__STATIC_INLINE uint32_t FL_RMU_PDR_GetThreshold(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->PDRCR, RMU_PDRCR_CFG_Msk)); +} + +/** + * @brief Get Power Down Reset Enable Status + * @rmtoll PDRCR EN FL_RMU_PDR_IsEnabled + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_PDR_IsEnabled(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->PDRCR, RMU_PDRCR_EN_Msk) == RMU_PDRCR_EN_Msk); +} + +/** + * @brief Disable Power Down Reset + * @rmtoll PDRCR EN FL_RMU_PDR_Disable + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_PDR_Disable(RMU_Type *RMUx) +{ + CLEAR_BIT(RMUx->PDRCR, RMU_PDRCR_EN_Msk); +} + +/** + * @brief Enable Power Down Reset + * @rmtoll PDRCR EN FL_RMU_PDR_Enable + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_PDR_Enable(RMU_Type *RMUx) +{ + SET_BIT(RMUx->PDRCR, RMU_PDRCR_EN_Msk); +} + +/** + * @brief Set Brown Out Reset Voltage + * @rmtoll BORCR CFG FL_RMU_BOR_SetThreshold + * @param RMUx RMU instance + * @param threshold This parameter can be one of the following values: + * @arg @ref FL_RMU_BOR_THRESHOLD_1P80V + * @arg @ref FL_RMU_BOR_THRESHOLD_2P00V + * @arg @ref FL_RMU_BOR_THRESHOLD_2P20V + * @arg @ref FL_RMU_BOR_THRESHOLD_2P40V + * @retval None + */ +__STATIC_INLINE void FL_RMU_BOR_SetThreshold(RMU_Type *RMUx, uint32_t threshold) +{ + MODIFY_REG(RMUx->BORCR, RMU_BORCR_CFG_Msk, threshold); +} + +/** + * @brief Get Brown Out Reset Setting + * @rmtoll BORCR CFG FL_RMU_BOR_GetThreshold + * @param RMUx RMU instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_RMU_BOR_THRESHOLD_1P80V + * @arg @ref FL_RMU_BOR_THRESHOLD_2P00V + * @arg @ref FL_RMU_BOR_THRESHOLD_2P20V + * @arg @ref FL_RMU_BOR_THRESHOLD_2P40V + */ +__STATIC_INLINE uint32_t FL_RMU_BOR_GetThreshold(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->BORCR, RMU_BORCR_CFG_Msk)); +} + +/** + * @brief Get Brown Out Reset Enable Status + * @rmtoll BORCR ENB FL_RMU_BOR_IsEnabled + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_BOR_IsEnabled(RMU_Type *RMUx) +{ + return (uint32_t)!(READ_BIT(RMUx->BORCR, RMU_BORCR_ENB_Msk) == RMU_BORCR_ENB_Msk); +} + +/** + * @brief Disable Brown Out Reset + * @rmtoll BORCR ENB FL_RMU_BOR_Disable + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_BOR_Disable(RMU_Type *RMUx) +{ + SET_BIT(RMUx->BORCR, RMU_BORCR_ENB_Msk); +} + +/** + * @brief Enable Brown Out Reset + * @rmtoll BORCR ENB FL_RMU_BOR_Enable + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_BOR_Enable(RMU_Type *RMUx) +{ + CLEAR_BIT(RMUx->BORCR, RMU_BORCR_ENB_Msk); +} + +/** + * @brief Get LockUp Reset Enable Status + * @rmtoll LKPCR EN FL_RMU_IsEnabledLockUpReset + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_IsEnabledLockUpReset(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->LKPCR, RMU_LKPCR_EN_Msk) == RMU_LKPCR_EN_Msk); +} + +/** + * @brief Disable LockUp Reset + * @rmtoll LKPCR EN FL_RMU_DisableLockUpReset + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_DisableLockUpReset(RMU_Type *RMUx) +{ + CLEAR_BIT(RMUx->LKPCR, RMU_LKPCR_EN_Msk); +} + +/** + * @brief Enable LockUp Reset + * @rmtoll LKPCR EN FL_RMU_EnableLockUpReset + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_EnableLockUpReset(RMU_Type *RMUx) +{ + SET_BIT(RMUx->LKPCR, RMU_LKPCR_EN_Msk); +} + +/** + * @brief Soft Reset Chip + * @rmtoll SOFTRST FL_RMU_SetSoftReset + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_SetSoftReset(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->SOFTRST, SOFTWARERESET_KEY); +} + +/** + * @brief Get MDF Reset Flag + * @rmtoll RSTFR MDFN_FLAG FL_RMU_IsActiveFlag_MDF + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_IsActiveFlag_MDF(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->RSTFR, RMU_RSTFR_MDFN_FLAG_Msk) == (RMU_RSTFR_MDFN_FLAG_Msk)); +} + +/** + * @brief Clear MDF Reset Flag + * @rmtoll RSTFR MDFN_FLAG FL_RMU_ClearFlag_MDF + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_ClearFlag_MDF(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->RSTFR, RMU_RSTFR_MDFN_FLAG_Msk); +} + +/** + * @brief Get NRST Reset Flag + * @rmtoll RSTFR NRSTN_FLAG FL_RMU_IsActiveFlag_NRSTN + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_IsActiveFlag_NRSTN(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->RSTFR, RMU_RSTFR_NRSTN_FLAG_Msk) == (RMU_RSTFR_NRSTN_FLAG_Msk)); +} + +/** + * @brief Clear NRST Reset Flag + * @rmtoll RSTFR NRSTN_FLAG FL_RMU_ClearFlag_NRSTN + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_ClearFlag_NRSTN(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->RSTFR, RMU_RSTFR_NRSTN_FLAG_Msk); +} + +/** + * @brief Get PRC Reset Flag + * @rmtoll RSTFR PRC_FLAG FL_RMU_IsActiveFlag_PRCN + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_IsActiveFlag_PRCN(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->RSTFR, RMU_RSTFR_PRC_FLAG_Msk) == (RMU_RSTFR_PRC_FLAG_Msk)); +} + +/** + * @brief Clear PRC Reset Flag + * @rmtoll RSTFR PRC_FLAG FL_RMU_ClearFlag_PRCN + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_ClearFlag_PRCN(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->RSTFR, RMU_RSTFR_PRC_FLAG_Msk); +} + +/** + * @brief Get Power On Reset Flag + * @rmtoll RSTFR PORN_FLAG FL_RMU_IsActiveFlag_PORN + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_IsActiveFlag_PORN(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->RSTFR, RMU_RSTFR_PORN_FLAG_Msk) == (RMU_RSTFR_PORN_FLAG_Msk)); +} + +/** + * @brief Clear Power On Reset Flag + * @rmtoll RSTFR PORN_FLAG FL_RMU_ClearFlag_PORN + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_ClearFlag_PORN(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->RSTFR, RMU_RSTFR_PORN_FLAG_Msk); +} + +/** + * @brief Get Power Down Reset Flag + * @rmtoll RSTFR PDRN_FLAG FL_RMU_IsActiveFlag_PDRN + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_IsActiveFlag_PDRN(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->RSTFR, RMU_RSTFR_PDRN_FLAG_Msk) == (RMU_RSTFR_PDRN_FLAG_Msk)); +} + +/** + * @brief Clear Power Down Reset Flag + * @rmtoll RSTFR PDRN_FLAG FL_RMU_ClearFlag_PDRN + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_ClearFlag_PDRN(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->RSTFR, RMU_RSTFR_PDRN_FLAG_Msk); +} + +/** + * @brief Get Software Reset Flag + * @rmtoll RSTFR SOFTN_FLAG FL_RMU_IsActiveFlag_SOFTN + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_IsActiveFlag_SOFTN(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->RSTFR, RMU_RSTFR_SOFTN_FLAG_Msk) == (RMU_RSTFR_SOFTN_FLAG_Msk)); +} + +/** + * @brief Clear Software Reset Flag + * @rmtoll RSTFR SOFTN_FLAG FL_RMU_ClearFlag_SOFTN + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_ClearFlag_SOFTN(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->RSTFR, RMU_RSTFR_SOFTN_FLAG_Msk); +} + +/** + * @brief Get IWDT Reset Flag + * @rmtoll RSTFR IWDTN_FLAG FL_RMU_IsActiveFlag_IWDTN + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_IsActiveFlag_IWDTN(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->RSTFR, RMU_RSTFR_IWDTN_FLAG_Msk) == (RMU_RSTFR_IWDTN_FLAG_Msk)); +} + +/** + * @brief Clear IWDT Reset Flag + * @rmtoll RSTFR IWDTN_FLAG FL_RMU_ClearFlag_IWDTN + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_ClearFlag_IWDTN(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->RSTFR, RMU_RSTFR_IWDTN_FLAG_Msk); +} + +/** + * @brief Get WWDT Reset Flag + * @rmtoll RSTFR WWDTN_FLAG FL_RMU_IsActiveFlag_WWDTN + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_IsActiveFlag_WWDTN(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->RSTFR, RMU_RSTFR_WWDTN_FLAG_Msk) == (RMU_RSTFR_WWDTN_FLAG_Msk)); +} + +/** + * @brief Clear WWDT Reset Flag + * @rmtoll RSTFR WWDTN_FLAG FL_RMU_ClearFlag_WWDTN + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_ClearFlag_WWDTN(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->RSTFR, RMU_RSTFR_WWDTN_FLAG_Msk); +} + +/** + * @brief Get LockUp Reset Flag + * @rmtoll RSTFR LKUPN_FLAG FL_RMU_IsActiveFlag_LKUPN + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_IsActiveFlag_LKUPN(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->RSTFR, RMU_RSTFR_LKUPN_FLAG_Msk) == (RMU_RSTFR_LKUPN_FLAG_Msk)); +} + +/** + * @brief Clear LockUp Reset Flag + * @rmtoll RSTFR LKUPN_FLAG FL_RMU_ClearFlag_LKUPN + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_ClearFlag_LKUPN(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->RSTFR, RMU_RSTFR_LKUPN_FLAG_Msk); +} + +/** + * @brief Get NVIC Reset Flag + * @rmtoll RSTFR NVICN_FLAG FL_RMU_IsActiveFlag_NVICN + * @param RMUx RMU instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RMU_IsActiveFlag_NVICN(RMU_Type *RMUx) +{ + return (uint32_t)(READ_BIT(RMUx->RSTFR, RMU_RSTFR_NVICN_FLAG_Msk) == (RMU_RSTFR_NVICN_FLAG_Msk)); +} + +/** + * @brief Clear NVIC Reset Flag + * @rmtoll RSTFR NVICN_FLAG FL_RMU_ClearFlag_NVICN + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_ClearFlag_NVICN(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->RSTFR, RMU_RSTFR_NVICN_FLAG_Msk); +} + +/** + * @brief Disable Peripheral Reset + * @rmtoll PRSTEN FL_RMU_DisablePeripheralReset + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_DisablePeripheralReset(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->PRSTEN, (~PERHRSTEN_KEY)); +} + +/** + * @brief Enable Peripheral Reset + * @rmtoll PRSTEN FL_RMU_EnablePeripheralReset + * @param RMUx RMU instance + * @retval None + */ +__STATIC_INLINE void FL_RMU_EnablePeripheralReset(RMU_Type *RMUx) +{ + WRITE_REG(RMUx->PRSTEN, PERHRSTEN_KEY); +} + +/** + * @brief Enable AHB Peripheral Reset + * @rmtoll AHBRSTCR FL_RMU_EnableResetAHBPeripheral + * @param RMUx RMU instance + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_RMU_RSTAHB_DMA + * @retval None + */ +__STATIC_INLINE void FL_RMU_EnableResetAHBPeripheral(RMU_Type *RMUx, uint32_t peripheral) +{ + SET_BIT(RMUx->AHBRSTCR, ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Enable APB Peripheral Reset1 + * @rmtoll APBRSTCR FL_RMU_EnableResetAPBPeripheral + * @param RMUx RMU instance + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_RMU_RSTAPB_UART5 + * @arg @ref FL_RMU_RSTAPB_UART4 + * @arg @ref FL_RMU_RSTAPB_UART3 + * @arg @ref FL_RMU_RSTAPB_UART1 + * @arg @ref FL_RMU_RSTAPB_UART0 + * @arg @ref FL_RMU_RSTAPB_UCIR + * @arg @ref FL_RMU_RSTAPB_U7816 + * @arg @ref FL_RMU_RSTAPB_GPTIM2 + * @arg @ref FL_RMU_RSTAPB_GPTIM1 + * @arg @ref FL_RMU_RSTAPB_GPTIM0 + * @arg @ref FL_RMU_RSTAPB_ATIM + * @arg @ref FL_RMU_RSTAPB_BSTIM32 + * @arg @ref FL_RMU_RSTAPB_BSTIM16 + * @arg @ref FL_RMU_RSTAPB_SPI2 + * @arg @ref FL_RMU_RSTAPB_SPI1 + * @arg @ref FL_RMU_RSTAPB_SPI0 + * @arg @ref FL_RMU_RSTAPB_I2C + * @arg @ref FL_RMU_RSTAPB_LPUART2 + * @arg @ref FL_RMU_RSTAPB_LPUART1 + * @arg @ref FL_RMU_RSTAPB_LPUART0 + * @arg @ref FL_RMU_RSTAPB_VREF + * @arg @ref FL_RMU_RSTAPB_PGL + * @arg @ref FL_RMU_RSTAPB_LCD + * @arg @ref FL_RMU_RSTAPB_DAC + * @arg @ref FL_RMU_RSTAPB_OPA + * @arg @ref FL_RMU_RSTAPB_LPTIM16 + * @arg @ref FL_RMU_RSTAPB_LPTIM32 + * @arg @ref FL_RMU_RSTAPB_ADCCR + * @arg @ref FL_RMU_RSTAPB_ADC + * @arg @ref FL_RMU_RSTAPB_AES + * @arg @ref FL_RMU_RSTAPB_CRC + * @arg @ref FL_RMU_RSTAPB_RNG + * @arg @ref FL_RMU_RSTAPB_DIVAS + * @arg @ref FL_RMU_RSTAPB_CAN + * @arg @ref FL_RMU_RSTAPB_SVD + * @arg @ref FL_RMU_RSTAPB_COMP + * @retval None + */ +__STATIC_INLINE void FL_RMU_EnableResetAPBPeripheral(RMU_Type *RMUx, uint32_t peripheral) +{ + if(peripheral < FL_RMU_RSTAPB_COMP) + { + SET_BIT(RMUx->APBRSTCR1, (0x1U << peripheral)); + } + else + { + SET_BIT(RMUx->APBRSTCR2, (0x1U << (peripheral - 32))); + } +} + +/** + * @brief Disable AHB Peripheral Reset + * @rmtoll AHBRSTCR FL_RMU_DisableResetAHBPeripheral + * @param RMUx RMU instance + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_RMU_RSTAHB_DMA + * @retval None + */ +__STATIC_INLINE void FL_RMU_DisableResetAHBPeripheral(RMU_Type *RMUx, uint32_t peripheral) +{ + CLEAR_BIT(RMUx->AHBRSTCR, ((peripheral & 0xffffffff) << 0x0U)); +} + +/** + * @brief Disable APB Peripheral Reset1 + * @rmtoll APBRSTCR FL_RMU_DisableResetAPBPeripheral + * @param RMUx RMU instance + * @param peripheral This parameter can be one of the following values: + * @arg @ref FL_RMU_RSTAPB_UART5 + * @arg @ref FL_RMU_RSTAPB_UART4 + * @arg @ref FL_RMU_RSTAPB_UART3 + * @arg @ref FL_RMU_RSTAPB_UART1 + * @arg @ref FL_RMU_RSTAPB_UART0 + * @arg @ref FL_RMU_RSTAPB_UCIR + * @arg @ref FL_RMU_RSTAPB_U7816 + * @arg @ref FL_RMU_RSTAPB_GPTIM2 + * @arg @ref FL_RMU_RSTAPB_GPTIM1 + * @arg @ref FL_RMU_RSTAPB_GPTIM0 + * @arg @ref FL_RMU_RSTAPB_ATIM + * @arg @ref FL_RMU_RSTAPB_BSTIM32 + * @arg @ref FL_RMU_RSTAPB_BSTIM16 + * @arg @ref FL_RMU_RSTAPB_SPI2 + * @arg @ref FL_RMU_RSTAPB_SPI1 + * @arg @ref FL_RMU_RSTAPB_SPI0 + * @arg @ref FL_RMU_RSTAPB_I2C + * @arg @ref FL_RMU_RSTAPB_LPUART2 + * @arg @ref FL_RMU_RSTAPB_LPUART1 + * @arg @ref FL_RMU_RSTAPB_LPUART0 + * @arg @ref FL_RMU_RSTAPB_VREF + * @arg @ref FL_RMU_RSTAPB_PGL + * @arg @ref FL_RMU_RSTAPB_LCD + * @arg @ref FL_RMU_RSTAPB_DAC + * @arg @ref FL_RMU_RSTAPB_OPA + * @arg @ref FL_RMU_RSTAPB_LPTIM16 + * @arg @ref FL_RMU_RSTAPB_LPTIM32 + * @arg @ref FL_RMU_RSTAPB_ADCCR + * @arg @ref FL_RMU_RSTAPB_ADC + * @arg @ref FL_RMU_RSTAPB_AES + * @arg @ref FL_RMU_RSTAPB_CRC + * @arg @ref FL_RMU_RSTAPB_RNG + * @arg @ref FL_RMU_RSTAPB_DIVAS + * @arg @ref FL_RMU_RSTAPB_CAN + * @arg @ref FL_RMU_RSTAPB_SVD + * @arg @ref FL_RMU_RSTAPB_COMP + * @retval None + */ +__STATIC_INLINE void FL_RMU_DisableResetAPBPeripheral(RMU_Type *RMUx, uint32_t peripheral) +{ + if(peripheral < FL_RMU_RSTAPB_COMP) + { + CLEAR_BIT(RMUx->APBRSTCR1, (0x1U << peripheral)); + } + else + { + CLEAR_BIT(RMUx->APBRSTCR2, (0x1U << (peripheral - 32))); + } +} + +/** + * @} + */ + +/** @defgroup RMU_FL_EF_Init Initialization and de-initialization functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_RMU_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.1 @ 2020-10-20*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_rng.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_rng.h new file mode 100644 index 0000000..32b53ff --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_rng.h @@ -0,0 +1,255 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_rng.h + * @author FMSH Application Team + * @brief Head file of RNG FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_RNG_H +#define __FM33LG0XX_FL_RNG_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup RNG RNG + * @brief RNG FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup RNG_FL_ES_INIT RNG Exported Init structures + * @{ + */ + +/** + * @brief FL RNG Init Sturcture definition + */ + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup RNG_FL_Exported_Constants RNG Exported Constants + * @{ + */ + +#define RNG_CR_EN_Pos (0U) +#define RNG_CR_EN_Msk (0x1U << RNG_CR_EN_Pos) +#define RNG_CR_EN RNG_CR_EN_Msk + +#define RNG_SR_RBUSY_Pos (1U) +#define RNG_SR_RBUSY_Msk (0x1U << RNG_SR_RBUSY_Pos) +#define RNG_SR_RBUSY RNG_SR_RBUSY_Msk + +#define RNG_SR_RNF_Pos (0U) +#define RNG_SR_RNF_Msk (0x1U << RNG_SR_RNF_Pos) +#define RNG_SR_RNF RNG_SR_RNF_Msk + +#define RNG_CRCCR_CRCEN_Pos (0U) +#define RNG_CRCCR_CRCEN_Msk (0x1U << RNG_CRCCR_CRCEN_Pos) +#define RNG_CRCCR_CRCEN RNG_CRCCR_CRCEN_Msk + +#define RNG_CRCSR_CRCDONE_Pos (0U) +#define RNG_CRCSR_CRCDONE_Msk (0x1U << RNG_CRCSR_CRCDONE_Pos) +#define RNG_CRCSR_CRCDONE RNG_CRCSR_CRCDONE_Msk + + + + + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup RNG_FL_Exported_Functions RNG Exported Functions + * @{ + */ + +/** + * @brief RNG enable + * @rmtoll CR EN FL_RNG_Enable + * @param RNGx RNG instance + * @retval None + */ +__STATIC_INLINE void FL_RNG_Enable(RNG_Type *RNGx) +{ + SET_BIT(RNGx->CR, RNG_CR_EN_Msk); +} + +/** + * @brief RNG enable status + * @rmtoll CR EN FL_RNG_IsEnabled + * @param RNGx RNG instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RNG_IsEnabled(RNG_Type *RNGx) +{ + return (uint32_t)(READ_BIT(RNGx->CR, RNG_CR_EN_Msk) == RNG_CR_EN_Msk); +} + +/** + * @brief RNG disable + * @rmtoll CR EN FL_RNG_Disable + * @param RNGx RNG instance + * @retval None + */ +__STATIC_INLINE void FL_RNG_Disable(RNG_Type *RNGx) +{ + CLEAR_BIT(RNGx->CR, RNG_CR_EN_Msk); +} + +/** + * @brief Read RNG output data register + * @rmtoll DOR FL_RNG_ReadData + * @param RNGx RNG instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RNG_ReadData(RNG_Type *RNGx) +{ + return (uint32_t)(READ_BIT(RNGx->DOR, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @brief Get LFSR Flag + * @rmtoll SR RBUSY FL_RNG_IsActiveFlag_Busy + * @param RNGx RNG instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RNG_IsActiveFlag_Busy(RNG_Type *RNGx) +{ + return (uint32_t)(READ_BIT(RNGx->SR, RNG_SR_RBUSY_Msk) == (RNG_SR_RBUSY_Msk)); +} + +/** + * @brief Get random number fail flag + * @rmtoll SR RNF FL_RNG_IsActiveFlag_RandomFail + * @param RNGx RNG instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RNG_IsActiveFlag_RandomFail(RNG_Type *RNGx) +{ + return (uint32_t)(READ_BIT(RNGx->SR, RNG_SR_RNF_Msk) == (RNG_SR_RNF_Msk)); +} + +/** + * @brief Clear random number fail flag + * @rmtoll SR RNF FL_RNG_ClearFlag_RandomFail + * @param RNGx RNG instance + * @retval None + */ +__STATIC_INLINE void FL_RNG_ClearFlag_RandomFail(RNG_Type *RNGx) +{ + WRITE_REG(RNGx->SR, RNG_SR_RNF_Msk); +} + +/** + * @brief CRC enable + * @rmtoll CRCCR CRCEN FL_RNG_CRC_Enable + * @param RNGx RNG instance + * @retval None + */ +__STATIC_INLINE void FL_RNG_CRC_Enable(RNG_Type *RNGx) +{ + SET_BIT(RNGx->CRCCR, RNG_CRCCR_CRCEN_Msk); +} + +/** + * @brief Get CRC enable status + * @rmtoll CRCCR CRCEN FL_RNG_CRC_IsEnabled + * @param RNGx RNG instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RNG_CRC_IsEnabled(RNG_Type *RNGx) +{ + return (uint32_t)(READ_BIT(RNGx->CRCCR, RNG_CRCCR_CRCEN_Msk) == RNG_CRCCR_CRCEN_Msk); +} + +/** + * @brief Write CRC data input + * @rmtoll CRCDIR FL_RNG_CRC_WriteData + * @param RNGx RNG instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_RNG_CRC_WriteData(RNG_Type *RNGx, uint32_t data) +{ + MODIFY_REG(RNGx->CRCDIR, (0xffffffffU << 0U), (data << 0U)); +} + +/** + * @brief Get CRC calculation done Flag + * @rmtoll CRCSR CRCDONE FL_RNG_IsActiveFlag_CRCComplete + * @param RNGx RNG instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RNG_IsActiveFlag_CRCComplete(RNG_Type *RNGx) +{ + return (uint32_t)(READ_BIT(RNGx->CRCSR, RNG_CRCSR_CRCDONE_Msk) == (RNG_CRCSR_CRCDONE_Msk)); +} + +/** + * @brief Clear CRC calculation done Flag + * @rmtoll CRCSR CRCDONE FL_RNG_ClearFlag_CRCComplete + * @param RNGx RNG instance + * @retval None + */ +__STATIC_INLINE void FL_RNG_ClearFlag_CRCComplete(RNG_Type *RNGx) +{ + CLEAR_BIT(RNGx->CRCSR, RNG_CRCSR_CRCDONE_Msk); +} + +/** + * @} + */ + +/** @defgroup RNG_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_RNG_DeInit(RNG_Type *RNGx); +FL_ErrorStatus FL_RNG_Init(RNG_Type *RNGx); +uint32_t GetRandomNumber(void); +uint32_t GetCrc32(uint32_t dataIn); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_RNG_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-12*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_rtca.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_rtca.h new file mode 100644 index 0000000..74899f9 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_rtca.h @@ -0,0 +1,1374 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_rtca.h + * @author FMSH Application Team + * @brief Head file of RTCA FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_RTCA_H +#define __FM33LG0XX_FL_RTCA_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup RTCA RTCA + * @brief RTCA FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup RTCA_FL_ES_INIT RTCA Exported Init structures + * @{ + */ + +/** + * @brief FL RTCA Init Sturcture definition + */ +typedef struct +{ + /** 年 */ + uint32_t year; + /** 月 */ + uint32_t month; + /** 日 */ + uint32_t day; + /** 周 */ + uint32_t week; + /** 时 */ + uint32_t hour; + /** 分 */ + uint32_t minute; + /** 秒 */ + uint32_t second; + +} FL_RTCA_InitTypeDef; +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup RTCA_FL_Exported_Constants RTCA Exported Constants + * @{ + */ + +#define RTCA_IER_ADJ_IE_Pos (12U) +#define RTCA_IER_ADJ_IE_Msk (0x1U << RTCA_IER_ADJ_IE_Pos) +#define RTCA_IER_ADJ_IE RTCA_IER_ADJ_IE_Msk + +#define RTCA_IER_ALARM_IE_Pos (11U) +#define RTCA_IER_ALARM_IE_Msk (0x1U << RTCA_IER_ALARM_IE_Pos) +#define RTCA_IER_ALARM_IE RTCA_IER_ALARM_IE_Msk + +#define RTCA_IER_1KHZ_IE_Pos (10U) +#define RTCA_IER_1KHZ_IE_Msk (0x1U << RTCA_IER_1KHZ_IE_Pos) +#define RTCA_IER_1KHZ_IE RTCA_IER_1KHZ_IE_Msk + +#define RTCA_IER_256HZ_IE_Pos (9U) +#define RTCA_IER_256HZ_IE_Msk (0x1U << RTCA_IER_256HZ_IE_Pos) +#define RTCA_IER_256HZ_IE RTCA_IER_256HZ_IE_Msk + +#define RTCA_IER_64HZ_IE_Pos (8U) +#define RTCA_IER_64HZ_IE_Msk (0x1U << RTCA_IER_64HZ_IE_Pos) +#define RTCA_IER_64HZ_IE RTCA_IER_64HZ_IE_Msk + +#define RTCA_IER_16HZ_IE_Pos (7U) +#define RTCA_IER_16HZ_IE_Msk (0x1U << RTCA_IER_16HZ_IE_Pos) +#define RTCA_IER_16HZ_IE RTCA_IER_16HZ_IE_Msk + +#define RTCA_IER_8HZ_IE_Pos (6U) +#define RTCA_IER_8HZ_IE_Msk (0x1U << RTCA_IER_8HZ_IE_Pos) +#define RTCA_IER_8HZ_IE RTCA_IER_8HZ_IE_Msk + +#define RTCA_IER_4HZ_IE_Pos (5U) +#define RTCA_IER_4HZ_IE_Msk (0x1U << RTCA_IER_4HZ_IE_Pos) +#define RTCA_IER_4HZ_IE RTCA_IER_4HZ_IE_Msk + +#define RTCA_IER_2HZ_IE_Pos (4U) +#define RTCA_IER_2HZ_IE_Msk (0x1U << RTCA_IER_2HZ_IE_Pos) +#define RTCA_IER_2HZ_IE RTCA_IER_2HZ_IE_Msk + +#define RTCA_IER_SEC_IE_Pos (3U) +#define RTCA_IER_SEC_IE_Msk (0x1U << RTCA_IER_SEC_IE_Pos) +#define RTCA_IER_SEC_IE RTCA_IER_SEC_IE_Msk + +#define RTCA_IER_MIN_IE_Pos (2U) +#define RTCA_IER_MIN_IE_Msk (0x1U << RTCA_IER_MIN_IE_Pos) +#define RTCA_IER_MIN_IE RTCA_IER_MIN_IE_Msk + +#define RTCA_IER_HOUR_IE_Pos (1U) +#define RTCA_IER_HOUR_IE_Msk (0x1U << RTCA_IER_HOUR_IE_Pos) +#define RTCA_IER_HOUR_IE RTCA_IER_HOUR_IE_Msk + +#define RTCA_IER_DAY_IE_Pos (0U) +#define RTCA_IER_DAY_IE_Msk (0x1U << RTCA_IER_DAY_IE_Pos) +#define RTCA_IER_DAY_IE RTCA_IER_DAY_IE_Msk + +#define RTCA_ISR_ADJ_IF_Pos (12U) +#define RTCA_ISR_ADJ_IF_Msk (0x1U << RTCA_ISR_ADJ_IF_Pos) +#define RTCA_ISR_ADJ_IF RTCA_ISR_ADJ_IF_Msk + +#define RTCA_ISR_ALARM_IF_Pos (11U) +#define RTCA_ISR_ALARM_IF_Msk (0x1U << RTCA_ISR_ALARM_IF_Pos) +#define RTCA_ISR_ALARM_IF RTCA_ISR_ALARM_IF_Msk + +#define RTCA_ISR_1KHZ_IF_Pos (10U) +#define RTCA_ISR_1KHZ_IF_Msk (0x1U << RTCA_ISR_1KHZ_IF_Pos) +#define RTCA_ISR_1KHZ_IF RTCA_ISR_1KHZ_IF_Msk + +#define RTCA_ISR_256HZ_IF_Pos (9U) +#define RTCA_ISR_256HZ_IF_Msk (0x1U << RTCA_ISR_256HZ_IF_Pos) +#define RTCA_ISR_256HZ_IF RTCA_ISR_256HZ_IF_Msk + +#define RTCA_ISR_64HZ_IF_Pos (8U) +#define RTCA_ISR_64HZ_IF_Msk (0x1U << RTCA_ISR_64HZ_IF_Pos) +#define RTCA_ISR_64HZ_IF RTCA_ISR_64HZ_IF_Msk + +#define RTCA_ISR_16HZ_IF_Pos (7U) +#define RTCA_ISR_16HZ_IF_Msk (0x1U << RTCA_ISR_16HZ_IF_Pos) +#define RTCA_ISR_16HZ_IF RTCA_ISR_16HZ_IF_Msk + +#define RTCA_ISR_8HZ_IF_Pos (6U) +#define RTCA_ISR_8HZ_IF_Msk (0x1U << RTCA_ISR_8HZ_IF_Pos) +#define RTCA_ISR_8HZ_IF RTCA_ISR_8HZ_IF_Msk + +#define RTCA_ISR_4HZ_IF_Pos (5U) +#define RTCA_ISR_4HZ_IF_Msk (0x1U << RTCA_ISR_4HZ_IF_Pos) +#define RTCA_ISR_4HZ_IF RTCA_ISR_4HZ_IF_Msk + +#define RTCA_ISR_2HZ_IF_Pos (4U) +#define RTCA_ISR_2HZ_IF_Msk (0x1U << RTCA_ISR_2HZ_IF_Pos) +#define RTCA_ISR_2HZ_IF RTCA_ISR_2HZ_IF_Msk + +#define RTCA_ISR_SEC_IF_Pos (3U) +#define RTCA_ISR_SEC_IF_Msk (0x1U << RTCA_ISR_SEC_IF_Pos) +#define RTCA_ISR_SEC_IF RTCA_ISR_SEC_IF_Msk + +#define RTCA_ISR_MIN_IF_Pos (2U) +#define RTCA_ISR_MIN_IF_Msk (0x1U << RTCA_ISR_MIN_IF_Pos) +#define RTCA_ISR_MIN_IF RTCA_ISR_MIN_IF_Msk + +#define RTCA_ISR_HOUR_IF_Pos (1U) +#define RTCA_ISR_HOUR_IF_Msk (0x1U << RTCA_ISR_HOUR_IF_Pos) +#define RTCA_ISR_HOUR_IF RTCA_ISR_HOUR_IF_Msk + +#define RTCA_ISR_DAY_IF_Pos (0U) +#define RTCA_ISR_DAY_IF_Msk (0x1U << RTCA_ISR_DAY_IF_Pos) +#define RTCA_ISR_DAY_IF RTCA_ISR_DAY_IF_Msk + +#define RTCA_TMSEL_TMSEL_Pos (0U) +#define RTCA_TMSEL_TMSEL_Msk (0xfU << RTCA_TMSEL_TMSEL_Pos) +#define RTCA_TMSEL_TMSEL RTCA_TMSEL_TMSEL_Msk + +#define RTCA_ADJUST_ADSIGN_Pos (9U) +#define RTCA_ADJUST_ADSIGN_Msk (0x1U << RTCA_ADJUST_ADSIGN_Pos) +#define RTCA_ADJUST_ADSIGN RTCA_ADJUST_ADSIGN_Msk + +#define RTCA_CR_EN_Pos (0U) +#define RTCA_CR_EN_Msk (0x1U << RTCA_CR_EN_Pos) +#define RTCA_CR_EN RTCA_CR_EN_Msk + + + + + + +#define FL_RTCA_TIME_MARK_SECOND (0x2U << RTCA_TMSEL_TMSEL_Pos) +#define FL_RTCA_TIME_MARK_MINUTE (0x3U << RTCA_TMSEL_TMSEL_Pos) +#define FL_RTCA_TIME_MARK_HOUR (0x4U << RTCA_TMSEL_TMSEL_Pos) +#define FL_RTCA_TIME_MARK_DAY (0x5U << RTCA_TMSEL_TMSEL_Pos) +#define FL_RTCA_TIME_MARK_ALARM (0x6U << RTCA_TMSEL_TMSEL_Pos) +#define FL_RTCA_TIME_MARK_32_SEC (0x7U << RTCA_TMSEL_TMSEL_Pos) +#define FL_RTCA_TIME_MARK_SECOND_REVERSE (0x9U << RTCA_TMSEL_TMSEL_Pos) +#define FL_RTCA_TIME_MARK_MINUTE_REVERSE (0xaU << RTCA_TMSEL_TMSEL_Pos) +#define FL_RTCA_TIME_MARK_HOUR_REVERSE (0xbU << RTCA_TMSEL_TMSEL_Pos) +#define FL_RTCA_TIME_MARK_DAY_REVERSE (0xcU << RTCA_TMSEL_TMSEL_Pos) +#define FL_RTCA_TIME_MARK_ALARM_REVERSE (0xdU << RTCA_TMSEL_TMSEL_Pos) +#define FL_RTCA_TIME_MARK_SEC (0xfU << RTCA_TMSEL_TMSEL_Pos) + + +#define FL_RTCA_ADJUST_DIR_INCREASE (0x0U << RTCA_ADJUST_ADSIGN_Pos) +#define FL_RTCA_ADJUST_DIR_DECREASE (0x1U << RTCA_ADJUST_ADSIGN_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup RTCA_FL_Exported_Functions RTCA Exported Functions + * @{ + */ + +/** + * @brief Enable RTCA Config Time + * @rmtoll WER FL_RTCA_WriteEnable + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteEnable(RTCA_Type *RTCAx) +{ + RTCAx->WER = 0xACACACAC; +} + +/** + * @brief Disable RTCA Config Time + * @rmtoll WER FL_RTCA_WriteDisable + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteDisable(RTCA_Type *RTCAx) +{ + RTCAx->WER = 0x5A5A5A5A; +} + +/** + * @brief Enable RTCA Time Adjust Interrupt + * @rmtoll IER ADJ_IE FL_RTCA_EnableIT_Adjust + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_Adjust(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_ADJ_IE_Msk); +} + +/** + * @brief Get RTCA Time Adjust Interrupt Enable Status + * @rmtoll IER ADJ_IE FL_RTCA_IsEnabledIT_Adjust + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_Adjust(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_ADJ_IE_Msk) == RTCA_IER_ADJ_IE_Msk); +} + +/** + * @brief Disable RTCA Time Adjust Interrupt + * @rmtoll IER ADJ_IE FL_RTCA_DisableIT_Adjust + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_Adjust(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_ADJ_IE_Msk); +} + +/** + * @brief Enable RTCA Alarm Interrupt + * @rmtoll IER ALARM_IE FL_RTCA_EnableIT_Alarm + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_Alarm(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_ALARM_IE_Msk); +} + +/** + * @brief Get RTCA Alarm Interrupt Enable Status + * @rmtoll IER ALARM_IE FL_RTCA_IsEnabledIT_Alarm + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_Alarm(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_ALARM_IE_Msk) == RTCA_IER_ALARM_IE_Msk); +} + +/** + * @brief Disable RTCA Alarm Interrupt + * @rmtoll IER ALARM_IE FL_RTCA_DisableIT_Alarm + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_Alarm(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_ALARM_IE_Msk); +} + +/** + * @brief Enable RTCA 1KHz Interrupt + * @rmtoll IER 1KHZ_IE FL_RTCA_EnableIT_1KHz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_1KHz(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_1KHZ_IE_Msk); +} + +/** + * @brief Get RTCA 1KHz Interrupt Enable Status + * @rmtoll IER 1KHZ_IE FL_RTCA_IsEnabledIT_1KHz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_1KHz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_1KHZ_IE_Msk) == RTCA_IER_1KHZ_IE_Msk); +} + +/** + * @brief Disable RTCA 1KHz Interrupt + * @rmtoll IER 1KHZ_IE FL_RTCA_DisableIT_1KHz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_1KHz(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_1KHZ_IE_Msk); +} + +/** + * @brief Enable RTCA 256Hz Interrupt + * @rmtoll IER 256HZ_IE FL_RTCA_EnableIT_256Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_256Hz(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_256HZ_IE_Msk); +} + +/** + * @brief Get RTCA 256Hz Interrupt Enable Status + * @rmtoll IER 256HZ_IE FL_RTCA_IsEnabledIT_256Hz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_256Hz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_256HZ_IE_Msk) == RTCA_IER_256HZ_IE_Msk); +} + +/** + * @brief Disable RTCA 256Hz Interrupt + * @rmtoll IER 256HZ_IE FL_RTCA_DisableIT_256Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_256Hz(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_256HZ_IE_Msk); +} + +/** + * @brief Enable RTCA 64Hz Interrupt + * @rmtoll IER 64HZ_IE FL_RTCA_EnableIT_64Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_64Hz(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_64HZ_IE_Msk); +} + +/** + * @brief Get RTCA 64Hz Interrupt Enable Status + * @rmtoll IER 64HZ_IE FL_RTCA_IsEnabledIT_64Hz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_64Hz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_64HZ_IE_Msk) == RTCA_IER_64HZ_IE_Msk); +} + +/** + * @brief Disable RTCA 64Hz Interrupt + * @rmtoll IER 64HZ_IE FL_RTCA_DisableIT_64Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_64Hz(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_64HZ_IE_Msk); +} + +/** + * @brief Enable RTCA 16Hz Interrupt + * @rmtoll IER 16HZ_IE FL_RTCA_EnableIT_16Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_16Hz(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_16HZ_IE_Msk); +} + +/** + * @brief Get RTCA 16Hz Interrupt Enable Status + * @rmtoll IER 16HZ_IE FL_RTCA_IsEnabledIT_16Hz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_16Hz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_16HZ_IE_Msk) == RTCA_IER_16HZ_IE_Msk); +} + +/** + * @brief Disable RTCA 16Hz Interrupt + * @rmtoll IER 16HZ_IE FL_RTCA_DisableIT_16Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_16Hz(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_16HZ_IE_Msk); +} + +/** + * @brief Enable RTCA 8Hz Interrupt + * @rmtoll IER 8HZ_IE FL_RTCA_EnableIT_8Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_8Hz(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_8HZ_IE_Msk); +} + +/** + * @brief Get RTCA 8Hz Interrupt Enable Status + * @rmtoll IER 8HZ_IE FL_RTCA_IsEnabledIT_8Hz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_8Hz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_8HZ_IE_Msk) == RTCA_IER_8HZ_IE_Msk); +} + +/** + * @brief Disable RTCA 8Hz Interrupt + * @rmtoll IER 8HZ_IE FL_RTCA_DisableIT_8Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_8Hz(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_8HZ_IE_Msk); +} + +/** + * @brief Enable RTCA 4Hz Interrupt + * @rmtoll IER 4HZ_IE FL_RTCA_EnableIT_4Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_4Hz(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_4HZ_IE_Msk); +} + +/** + * @brief Get RTCA 4Hz Interrupt Enable Status + * @rmtoll IER 4HZ_IE FL_RTCA_IsEnabledIT_4Hz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_4Hz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_4HZ_IE_Msk) == RTCA_IER_4HZ_IE_Msk); +} + +/** + * @brief Disable RTCA 4Hz Interrupt + * @rmtoll IER 4HZ_IE FL_RTCA_DisableIT_4Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_4Hz(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_4HZ_IE_Msk); +} + +/** + * @brief Enable RTCA 2Hz Interrupt + * @rmtoll IER 2HZ_IE FL_RTCA_EnableIT_2Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_2Hz(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_2HZ_IE_Msk); +} + +/** + * @brief Get RTCA 2Hz Interrupt Enable Status + * @rmtoll IER 2HZ_IE FL_RTCA_IsEnabledIT_2Hz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_2Hz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_2HZ_IE_Msk) == RTCA_IER_2HZ_IE_Msk); +} + +/** + * @brief Disable RTCA 2Hz Interrupt + * @rmtoll IER 2HZ_IE FL_RTCA_DisableIT_2Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_2Hz(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_2HZ_IE_Msk); +} + +/** + * @brief Enable RTCA Second Interrupt + * @rmtoll IER SEC_IE FL_RTCA_EnableIT_Second + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_Second(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_SEC_IE_Msk); +} + +/** + * @brief Get RTCA Second Interrupt Enable Status + * @rmtoll IER SEC_IE FL_RTCA_IsEnabledIT_Second + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_Second(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_SEC_IE_Msk) == RTCA_IER_SEC_IE_Msk); +} + +/** + * @brief Disable RTCA Second Interrupt + * @rmtoll IER SEC_IE FL_RTCA_DisableIT_Second + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_Second(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_SEC_IE_Msk); +} + +/** + * @brief Enable RTCA Minute Interrupt + * @rmtoll IER MIN_IE FL_RTCA_EnableIT_Minute + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_Minute(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_MIN_IE_Msk); +} + +/** + * @brief Get RTCA Minute Interrupt Enable Status + * @rmtoll IER MIN_IE FL_RTCA_IsEnabledIT_Minute + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_Minute(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_MIN_IE_Msk) == RTCA_IER_MIN_IE_Msk); +} + +/** + * @brief Disable RTCA Minute Interrupt + * @rmtoll IER MIN_IE FL_RTCA_DisableIT_Minute + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_Minute(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_MIN_IE_Msk); +} + +/** + * @brief Enable RTCA Hour Interrupt + * @rmtoll IER HOUR_IE FL_RTCA_EnableIT_Hour + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_Hour(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_HOUR_IE_Msk); +} + +/** + * @brief Get RTCA Hour Interrupt Enable Status + * @rmtoll IER HOUR_IE FL_RTCA_IsEnabledIT_Hour + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_Hour(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_HOUR_IE_Msk) == RTCA_IER_HOUR_IE_Msk); +} + +/** + * @brief Disable RTCA Hour Interrupt + * @rmtoll IER HOUR_IE FL_RTCA_DisableIT_Hour + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_Hour(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_HOUR_IE_Msk); +} + +/** + * @brief Enable RTCA Day Interrupt + * @rmtoll IER DAY_IE FL_RTCA_EnableIT_Day + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_EnableIT_Day(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->IER, RTCA_IER_DAY_IE_Msk); +} + +/** + * @brief Get RTCA Day Interrupt Enable Status + * @rmtoll IER DAY_IE FL_RTCA_IsEnabledIT_Day + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabledIT_Day(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->IER, RTCA_IER_DAY_IE_Msk) == RTCA_IER_DAY_IE_Msk); +} + +/** + * @brief Disable RTCA Day Interrupt + * @rmtoll IER DAY_IE FL_RTCA_DisableIT_Day + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_DisableIT_Day(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->IER, RTCA_IER_DAY_IE_Msk); +} + +/** + * @brief Clear RTCA Time Adjust Interrupt Flag + * @rmtoll ISR ADJ_IF FL_RTCA_ClearFlag_Adjust + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_Adjust(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_ADJ_IF_Msk); +} + +/** + * @brief Get RTCA Time Adjust Interrupt Flag + * @rmtoll ISR ADJ_IF FL_RTCA_IsActiveFlag_Adjust + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_Adjust(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_ADJ_IF_Msk) == (RTCA_ISR_ADJ_IF_Msk)); +} + +/** + * @brief Clear RTCA Alarm Interrupt Flag + * @rmtoll ISR ALARM_IF FL_RTCA_ClearFlag_Alarm + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_Alarm(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_ALARM_IF_Msk); +} + +/** + * @brief Get RTCA Alarm Interrupt Flag + * @rmtoll ISR ALARM_IF FL_RTCA_IsActiveFlag_Alarm + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_Alarm(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_ALARM_IF_Msk) == (RTCA_ISR_ALARM_IF_Msk)); +} + +/** + * @brief Clear RTCA 1KHz Interrupt Flag + * @rmtoll ISR 1KHZ_IF FL_RTCA_ClearFlag_1KHz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_1KHz(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_1KHZ_IF_Msk); +} + +/** + * @brief Get RTCA 1KHz Interrupt Flag + * @rmtoll ISR 1KHZ_IF FL_RTCA_IsActiveFlag_1KHz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_1KHz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_1KHZ_IF_Msk) == (RTCA_ISR_1KHZ_IF_Msk)); +} + +/** + * @brief Clear RTCA 256Hz Interrupt Flag + * @rmtoll ISR 256HZ_IF FL_RTCA_ClearFlag_256Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_256Hz(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_256HZ_IF_Msk); +} + +/** + * @brief Get RTCA 256Hz Interrupt Flag + * @rmtoll ISR 256HZ_IF FL_RTCA_IsActiveFlag_256Hz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_256Hz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_256HZ_IF_Msk) == (RTCA_ISR_256HZ_IF_Msk)); +} + +/** + * @brief Clear RTCA 64Hz Interrupt Flag + * @rmtoll ISR 64HZ_IF FL_RTCA_ClearFlag_64Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_64Hz(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_64HZ_IF_Msk); +} + +/** + * @brief Get RTCA 64Hz Interrupt Flag + * @rmtoll ISR 64HZ_IF FL_RTCA_IsActiveFlag_64Hz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_64Hz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_64HZ_IF_Msk) == (RTCA_ISR_64HZ_IF_Msk)); +} + +/** + * @brief Clear RTCA 16Hz Interrupt Flag + * @rmtoll ISR 16HZ_IF FL_RTCA_ClearFlag_16Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_16Hz(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_16HZ_IF_Msk); +} + +/** + * @brief Get RTCA 16Hz Interrupt Flag + * @rmtoll ISR 16HZ_IF FL_RTCA_IsActiveFlag_16Hz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_16Hz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_16HZ_IF_Msk) == (RTCA_ISR_16HZ_IF_Msk)); +} + +/** + * @brief Clear RTCA 8Hz Interrupt Flag + * @rmtoll ISR 8HZ_IF FL_RTCA_ClearFlag_8Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_8Hz(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_8HZ_IF_Msk); +} + +/** + * @brief Get RTCA 8Hz Interrupt Flag + * @rmtoll ISR 8HZ_IF FL_RTCA_IsActiveFlag_8Hz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_8Hz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_8HZ_IF_Msk) == (RTCA_ISR_8HZ_IF_Msk)); +} + +/** + * @brief Clear RTCA 4Hz Interrupt Flag + * @rmtoll ISR 4HZ_IF FL_RTCA_ClearFlag_4Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_4Hz(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_4HZ_IF_Msk); +} + +/** + * @brief Get RTCA 4Hz Interrupt Flag + * @rmtoll ISR 4HZ_IF FL_RTCA_IsActiveFlag_4Hz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_4Hz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_4HZ_IF_Msk) == (RTCA_ISR_4HZ_IF_Msk)); +} + +/** + * @brief Clear RTCA 2Hz Interrupt Flag + * @rmtoll ISR 2HZ_IF FL_RTCA_ClearFlag_2Hz + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_2Hz(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_2HZ_IF_Msk); +} + +/** + * @brief Get RTCA 2Hz Interrupt Flag + * @rmtoll ISR 2HZ_IF FL_RTCA_IsActiveFlag_2Hz + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_2Hz(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_2HZ_IF_Msk) == (RTCA_ISR_2HZ_IF_Msk)); +} + +/** + * @brief Clear RTCA Second Interrupt Flag + * @rmtoll ISR SEC_IF FL_RTCA_ClearFlag_Second + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_Second(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_SEC_IF_Msk); +} + +/** + * @brief Get RTCA Second Interrupt Flag + * @rmtoll ISR SEC_IF FL_RTCA_IsActiveFlag_Second + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_Second(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_SEC_IF_Msk) == (RTCA_ISR_SEC_IF_Msk)); +} + +/** + * @brief Clear RTCA Minute Interrupt Flag + * @rmtoll ISR MIN_IF FL_RTCA_ClearFlag_Minute + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_Minute(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_MIN_IF_Msk); +} + +/** + * @brief Get RTCA Minute Interrupt Flag + * @rmtoll ISR MIN_IF FL_RTCA_IsActiveFlag_Minute + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_Minute(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_MIN_IF_Msk) == (RTCA_ISR_MIN_IF_Msk)); +} + +/** + * @brief Clear RTCA Hour Interrupt Flag + * @rmtoll ISR HOUR_IF FL_RTCA_ClearFlag_Hour + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_Hour(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_HOUR_IF_Msk); +} + +/** + * @brief Get RTCA Hour Interrupt Flag + * @rmtoll ISR HOUR_IF FL_RTCA_IsActiveFlag_Hour + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_Hour(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_HOUR_IF_Msk) == (RTCA_ISR_HOUR_IF_Msk)); +} + +/** + * @brief Clear RTCA Day Interrupt Flag + * @rmtoll ISR DAY_IF FL_RTCA_ClearFlag_Day + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_ClearFlag_Day(RTCA_Type *RTCAx) +{ + WRITE_REG(RTCAx->ISR, RTCA_ISR_DAY_IF_Msk); +} + +/** + * @brief Get RTCA Day Interrupt Flag + * @rmtoll ISR DAY_IF FL_RTCA_IsActiveFlag_Day + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsActiveFlag_Day(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ISR, RTCA_ISR_DAY_IF_Msk) == (RTCA_ISR_DAY_IF_Msk)); +} + +/** + * @brief Get RTCA Second Value + * @rmtoll BCDSEC FL_RTCA_ReadSecond + * @param RTCAx RTCA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RTCA_ReadSecond(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->BCDSEC, (0x7fU << 0U)) >> 0U); +} + +/** + * @brief Set RTCA Second Value + * @rmtoll BCDSEC FL_RTCA_WriteSecond + * @param RTCAx RTCA instance + * @param second + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteSecond(RTCA_Type *RTCAx, uint32_t second) +{ + MODIFY_REG(RTCAx->BCDSEC, (0x7fU << 0U), (second << 0U)); +} + +/** + * @brief Get RTCA Minute Value + * @rmtoll BCDMIN FL_RTCA_ReadMinute + * @param RTCAx RTCA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RTCA_ReadMinute(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->BCDMIN, (0x7fU << 0U)) >> 0U); +} + +/** + * @brief Set RTCA Minute Value + * @rmtoll BCDMIN FL_RTCA_WriteMinute + * @param RTCAx RTCA instance + * @param minute + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteMinute(RTCA_Type *RTCAx, uint32_t minute) +{ + MODIFY_REG(RTCAx->BCDMIN, (0x7fU << 0U), (minute << 0U)); +} + +/** + * @brief Get RTCA Hour Value + * @rmtoll BCDHOUR FL_RTCA_ReadHour + * @param RTCAx RTCA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RTCA_ReadHour(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->BCDHOUR, (0x3fU << 0U)) >> 0U); +} + +/** + * @brief Set RTCA Hour Value + * @rmtoll BCDHOUR FL_RTCA_WriteHour + * @param RTCAx RTCA instance + * @param hour + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteHour(RTCA_Type *RTCAx, uint32_t hour) +{ + MODIFY_REG(RTCAx->BCDHOUR, (0x3fU << 0U), (hour << 0U)); +} + +/** + * @brief Get RTCA Day Value + * @rmtoll BCDDAY FL_RTCA_ReadDay + * @param RTCAx RTCA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RTCA_ReadDay(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->BCDDAY, (0x3fU << 0U)) >> 0U); +} + +/** + * @brief Set RTCA Day Value + * @rmtoll BCDDAY FL_RTCA_WriteDay + * @param RTCAx RTCA instance + * @param day + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteDay(RTCA_Type *RTCAx, uint32_t day) +{ + MODIFY_REG(RTCAx->BCDDAY, (0x3fU << 0U), (day << 0U)); +} + +/** + * @brief Get RTCA Week Value + * @rmtoll BCDWEEK FL_RTCA_ReadWeek + * @param RTCAx RTCA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RTCA_ReadWeek(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->BCDWEEK, (0x7U << 0U)) >> 0U); +} + +/** + * @brief Set RTCA Week Value + * @rmtoll BCDWEEK FL_RTCA_WriteWeek + * @param RTCAx RTCA instance + * @param week + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteWeek(RTCA_Type *RTCAx, uint32_t week) +{ + MODIFY_REG(RTCAx->BCDWEEK, (0x7U << 0U), (week << 0U)); +} + +/** + * @brief Get RTCA Month Value + * @rmtoll BCDMONTH FL_RTCA_ReadMonth + * @param RTCAx RTCA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RTCA_ReadMonth(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->BCDMONTH, (0x1fU << 0U)) >> 0U); +} + +/** + * @brief Set RTCA Month Value + * @rmtoll BCDMONTH FL_RTCA_WriteMonth + * @param RTCAx RTCA instance + * @param month + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteMonth(RTCA_Type *RTCAx, uint32_t month) +{ + MODIFY_REG(RTCAx->BCDMONTH, (0x1fU << 0U), (month << 0U)); +} + +/** + * @brief Get RTCA Year Value + * @rmtoll BCDYEAR FL_RTCA_ReadYear + * @param RTCAx RTCA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RTCA_ReadYear(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->BCDYEAR, (0xffU << 0U)) >> 0U); +} + +/** + * @brief Set RTCA Year Value + * @rmtoll BCDYEAR FL_RTCA_WriteYear + * @param RTCAx RTCA instance + * @param year + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteYear(RTCA_Type *RTCAx, uint32_t year) +{ + MODIFY_REG(RTCAx->BCDYEAR, (0xffU << 0U), (year << 0U)); +} + +/** + * @brief Get RTCA Alarm Hour Value + * @rmtoll ALARM FL_RTCA_ReadHourAlarm + * @param RTCAx RTCA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RTCA_ReadHourAlarm(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ALARM, (0x3fU << 16U)) >> 16U); +} + +/** + * @brief Set RTCA Alarm Hour Value + * @rmtoll ALARM FL_RTCA_WriteHourAlarm + * @param RTCAx RTCA instance + * @param hour + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteHourAlarm(RTCA_Type *RTCAx, uint32_t hour) +{ + MODIFY_REG(RTCAx->ALARM, (0x3fU << 16U), (hour << 16U)); +} + +/** + * @brief Get RTCA Alarm Minute Value + * @rmtoll ALARM FL_RTCA_ReadMinuteAlarm + * @param RTCAx RTCA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RTCA_ReadMinuteAlarm(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ALARM, (0x7fU << 8U)) >> 8U); +} + +/** + * @brief Set RTCA Alarm Minute Value + * @rmtoll ALARM FL_RTCA_WriteMinuteAlarm + * @param RTCAx RTCA instance + * @param minute + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteMinuteAlarm(RTCA_Type *RTCAx, uint32_t minute) +{ + MODIFY_REG(RTCAx->ALARM, (0x7fU << 8U), (minute << 8U)); +} + +/** + * @brief Get RTCA Alarm Second Value + * @rmtoll ALARM FL_RTCA_ReadSecondAlarm + * @param RTCAx RTCA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RTCA_ReadSecondAlarm(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ALARM, (0x7fU << 0U)) >> 0U); +} + +/** + * @brief Set RTCA Alarm Second Value + * @rmtoll ALARM FL_RTCA_WriteSecondAlarm + * @param RTCAx RTCA instance + * @param second + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteSecondAlarm(RTCA_Type *RTCAx, uint32_t second) +{ + MODIFY_REG(RTCAx->ALARM, (0x7fU << 0U), (second << 0U)); +} + +/** + * @brief Set RTCA Output Time Mark Signal + * @rmtoll TMSEL TMSEL FL_RTCA_SetTimeMarkOutput + * @param RTCAx RTCA instance + * @param markSelect This parameter can be one of the following values: + * @arg @ref FL_RTCA_TIME_MARK_SECOND + * @arg @ref FL_RTCA_TIME_MARK_MINUTE + * @arg @ref FL_RTCA_TIME_MARK_HOUR + * @arg @ref FL_RTCA_TIME_MARK_DAY + * @arg @ref FL_RTCA_TIME_MARK_ALARM + * @arg @ref FL_RTCA_TIME_MARK_32_SEC + * @arg @ref FL_RTCA_TIME_MARK_SECOND_REVERSE + * @arg @ref FL_RTCA_TIME_MARK_MINUTE_REVERSE + * @arg @ref FL_RTCA_TIME_MARK_HOUR_REVERSE + * @arg @ref FL_RTCA_TIME_MARK_DAY_REVERSE + * @arg @ref FL_RTCA_TIME_MARK_ALARM_REVERSE + * @arg @ref FL_RTCA_TIME_MARK_SEC + * @retval None + */ +__STATIC_INLINE void FL_RTCA_SetTimeMarkOutput(RTCA_Type *RTCAx, uint32_t markSelect) +{ + MODIFY_REG(RTCAx->TMSEL, RTCA_TMSEL_TMSEL_Msk, markSelect); +} + +/** + * @brief Get RTCA Output Time Mark Signal Setting + * @rmtoll TMSEL TMSEL FL_RTCA_GetTimeMarkOutput + * @param RTCAx RTCA instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_RTCA_TIME_MARK_SECOND + * @arg @ref FL_RTCA_TIME_MARK_MINUTE + * @arg @ref FL_RTCA_TIME_MARK_HOUR + * @arg @ref FL_RTCA_TIME_MARK_DAY + * @arg @ref FL_RTCA_TIME_MARK_ALARM + * @arg @ref FL_RTCA_TIME_MARK_32_SEC + * @arg @ref FL_RTCA_TIME_MARK_SECOND_REVERSE + * @arg @ref FL_RTCA_TIME_MARK_MINUTE_REVERSE + * @arg @ref FL_RTCA_TIME_MARK_HOUR_REVERSE + * @arg @ref FL_RTCA_TIME_MARK_DAY_REVERSE + * @arg @ref FL_RTCA_TIME_MARK_ALARM_REVERSE + * @arg @ref FL_RTCA_TIME_MARK_SEC + */ +__STATIC_INLINE uint32_t FL_RTCA_GetTimeMarkOutput(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->TMSEL, RTCA_TMSEL_TMSEL_Msk)); +} + +/** + * @brief Get RTCA Adjust Value + * @rmtoll ADJUST FL_RTCA_ReadAdjustValue + * @param RTCAx RTCA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RTCA_ReadAdjustValue(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ADJUST, (0x1ffU << 0U)) >> 0U); +} + +/** + * @brief Set RTCA Adjust Value + * @rmtoll ADJUST FL_RTCA_WriteAdjustValue + * @param RTCAx RTCA instance + * @param adjustValue + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteAdjustValue(RTCA_Type *RTCAx, uint32_t adjustValue) +{ + MODIFY_REG(RTCAx->ADJUST, (0x1ffU << 0U), (adjustValue << 0U)); +} + +/** + * @brief Set RTCA Adjust Direction + * @rmtoll ADJUST ADSIGN FL_RTCA_SetAdjustDirection + * @param RTCAx RTCA instance + * @param adjustDir This parameter can be one of the following values: + * @arg @ref FL_RTCA_ADJUST_DIR_INCREASE + * @arg @ref FL_RTCA_ADJUST_DIR_DECREASE + * @retval None + */ +__STATIC_INLINE void FL_RTCA_SetAdjustDirection(RTCA_Type *RTCAx, uint32_t adjustDir) +{ + MODIFY_REG(RTCAx->ADJUST, RTCA_ADJUST_ADSIGN_Msk, adjustDir); +} + +/** + * @brief Get RTCA Adjust Direction + * @rmtoll ADJUST ADSIGN FL_RTCA_GetAdjustDirection + * @param RTCAx RTCA instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_RTCA_ADJUST_DIR_INCREASE + * @arg @ref FL_RTCA_ADJUST_DIR_DECREASE + */ +__STATIC_INLINE uint32_t FL_RTCA_GetAdjustDirection(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->ADJUST, RTCA_ADJUST_ADSIGN_Msk)); +} + +/** + * @brief Get RTCA MilliSecond Counter Value + * @rmtoll SBSCNT FL_RTCA_ReadMilliSecondCounter + * @param RTCAx RTCA instance + * @retval + */ +__STATIC_INLINE uint32_t FL_RTCA_ReadMilliSecondCounter(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->SBSCNT, (0xffU << 0U)) >> 0U); +} + +/** + * @brief Set RTCA MilliSecond Counter Value + * @rmtoll SBSCNT FL_RTCA_WriteMilliSecondCounter + * @param RTCAx RTCA instance + * @param milliSecondCount + * @retval None + */ +__STATIC_INLINE void FL_RTCA_WriteMilliSecondCounter(RTCA_Type *RTCAx, uint32_t milliSecondCount) +{ + MODIFY_REG(RTCAx->SBSCNT, (0xffU << 0U), (milliSecondCount << 0U)); +} + +/** + * @brief RTCA enable + * @rmtoll CR EN FL_RTCA_Enable + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_Enable(RTCA_Type *RTCAx) +{ + SET_BIT(RTCAx->CR, RTCA_CR_EN_Msk); +} + +/** + * @brief Get RTCA enable status + * @rmtoll CR EN FL_RTCA_IsEnabled + * @param RTCAx RTCA instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_RTCA_IsEnabled(RTCA_Type *RTCAx) +{ + return (uint32_t)(READ_BIT(RTCAx->CR, RTCA_CR_EN_Msk) == RTCA_CR_EN_Msk); +} + +/** + * @brief RTCA disable + * @rmtoll CR EN FL_RTCA_Disable + * @param RTCAx RTCA instance + * @retval None + */ +__STATIC_INLINE void FL_RTCA_Disable(RTCA_Type *RTCAx) +{ + CLEAR_BIT(RTCAx->CR, RTCA_CR_EN_Msk); +} + +/** + * @} + */ + +/** @defgroup RTCA_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_RTCA_DeInit(RTCA_Type *RTCAx); +void FL_RTCA_StructInit(FL_RTCA_InitTypeDef *initStruct); +FL_ErrorStatus FL_RTCA_GetTime(RTCA_Type *RTCAx, FL_RTCA_InitTypeDef *initStruct); +FL_ErrorStatus FL_RTCA_Init(RTCA_Type *RTCAx, FL_RTCA_InitTypeDef *initStruct); +FL_ErrorStatus FL_RTCA_ConfigTime(RTCA_Type *RTCAx, FL_RTCA_InitTypeDef *initStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_RTCA_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-14*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_spi.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_spi.h new file mode 100644 index 0000000..473a659 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_spi.h @@ -0,0 +1,1251 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_spi.h + * @author FMSH Application Team + * @brief Head file of SPI FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_SPI_H +#define __FM33LG0XX_FL_SPI_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup SPI SPI + * @brief SPI FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup SPI_FL_ES_INIT SPI Exported Init structures + * @{ + */ + +/** + * @brief FL SPI Init Sturcture definition + */ +typedef struct +{ + /*! 传输模式 单双工 */ + uint32_t transferMode; + /*! 主从模式 */ + uint32_t mode; + /*! 数据位宽 */ + uint32_t dataWidth; + /*! 时钟极性 */ + uint32_t clockPolarity; + /*! 时钟相位 */ + uint32_t clockPhase; + /*! NSS 脚使能软件控制 */ + uint32_t softControl; + /*! 通讯速率 */ + uint32_t baudRate; + /*! Bit方向 */ + uint32_t bitOrder; + +} FL_SPI_InitTypeDef; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup SPI_FL_Exported_Constants SPI Exported Constants + * @{ + */ + +#define SPI_CR1_IOSWAP_Pos (11U) +#define SPI_CR1_IOSWAP_Msk (0x1U << SPI_CR1_IOSWAP_Pos) +#define SPI_CR1_IOSWAP SPI_CR1_IOSWAP_Msk + +#define SPI_CR1_MSPA_Pos (10U) +#define SPI_CR1_MSPA_Msk (0x1U << SPI_CR1_MSPA_Pos) +#define SPI_CR1_MSPA SPI_CR1_MSPA_Msk + +#define SPI_CR1_SSPA_Pos (9U) +#define SPI_CR1_SSPA_Msk (0x1U << SPI_CR1_SSPA_Pos) +#define SPI_CR1_SSPA SPI_CR1_SSPA_Msk + +#define SPI_CR1_MM_Pos (8U) +#define SPI_CR1_MM_Msk (0x1U << SPI_CR1_MM_Pos) +#define SPI_CR1_MM SPI_CR1_MM_Msk + +#define SPI_CR1_WAIT_Pos (6U) +#define SPI_CR1_WAIT_Msk (0x3U << SPI_CR1_WAIT_Pos) +#define SPI_CR1_WAIT SPI_CR1_WAIT_Msk + +#define SPI_CR1_BAUD_Pos (3U) +#define SPI_CR1_BAUD_Msk (0x7U << SPI_CR1_BAUD_Pos) +#define SPI_CR1_BAUD SPI_CR1_BAUD_Msk + +#define SPI_CR1_LSBF_Pos (2U) +#define SPI_CR1_LSBF_Msk (0x1U << SPI_CR1_LSBF_Pos) +#define SPI_CR1_LSBF SPI_CR1_LSBF_Msk + +#define SPI_CR1_CPOL_Pos (1U) +#define SPI_CR1_CPOL_Msk (0x1U << SPI_CR1_CPOL_Pos) +#define SPI_CR1_CPOL SPI_CR1_CPOL_Msk + +#define SPI_CR1_CPHA_Pos (0U) +#define SPI_CR1_CPHA_Msk (0x1U << SPI_CR1_CPHA_Pos) +#define SPI_CR1_CPHA SPI_CR1_CPHA_Msk + +#define SPI_CR2_DUMMY_EN_Pos (15U) +#define SPI_CR2_DUMMY_EN_Msk (0x1U << SPI_CR2_DUMMY_EN_Pos) +#define SPI_CR2_DUMMY_EN SPI_CR2_DUMMY_EN_Msk + +#define SPI_CR2_RXO_Pos (11U) +#define SPI_CR2_RXO_Msk (0x1U << SPI_CR2_RXO_Pos) +#define SPI_CR2_RXO SPI_CR2_RXO_Msk + +#define SPI_CR2_DLEN_Pos (9U) +#define SPI_CR2_DLEN_Msk (0x3U << SPI_CR2_DLEN_Pos) +#define SPI_CR2_DLEN SPI_CR2_DLEN_Msk + +#define SPI_CR2_HALFDUPLEX_Pos (8U) +#define SPI_CR2_HALFDUPLEX_Msk (0x1U << SPI_CR2_HALFDUPLEX_Pos) +#define SPI_CR2_HALFDUPLEX SPI_CR2_HALFDUPLEX_Msk + +#define SPI_CR2_HD_RW_Pos (7U) +#define SPI_CR2_HD_RW_Msk (0x1U << SPI_CR2_HD_RW_Pos) +#define SPI_CR2_HD_RW SPI_CR2_HD_RW_Msk + +#define SPI_CR2_CMD8B_Pos (6U) +#define SPI_CR2_CMD8B_Msk (0x1U << SPI_CR2_CMD8B_Pos) +#define SPI_CR2_CMD8B SPI_CR2_CMD8B_Msk + +#define SPI_CR2_SSNM_Pos (5U) +#define SPI_CR2_SSNM_Msk (0x1U << SPI_CR2_SSNM_Pos) +#define SPI_CR2_SSNM SPI_CR2_SSNM_Msk + +#define SPI_CR2_TXO_AC_Pos (4U) +#define SPI_CR2_TXO_AC_Msk (0x1U << SPI_CR2_TXO_AC_Pos) +#define SPI_CR2_TXO_AC SPI_CR2_TXO_AC_Msk + +#define SPI_CR2_TXO_Pos (3U) +#define SPI_CR2_TXO_Msk (0x1U << SPI_CR2_TXO_Pos) +#define SPI_CR2_TXO SPI_CR2_TXO_Msk + +#define SPI_CR2_SSN_Pos (2U) +#define SPI_CR2_SSN_Msk (0x1U << SPI_CR2_SSN_Pos) +#define SPI_CR2_SSN SPI_CR2_SSN_Msk + +#define SPI_CR2_SSNSEN_Pos (1U) +#define SPI_CR2_SSNSEN_Msk (0x1U << SPI_CR2_SSNSEN_Pos) +#define SPI_CR2_SSNSEN SPI_CR2_SSNSEN_Msk + +#define SPI_CR2_SPIEN_Pos (0U) +#define SPI_CR2_SPIEN_Msk (0x1U << SPI_CR2_SPIEN_Pos) +#define SPI_CR2_SPIEN SPI_CR2_SPIEN_Msk + +#define SPI_CR3_TXBFC_Pos (3U) +#define SPI_CR3_TXBFC_Msk (0x1U << SPI_CR3_TXBFC_Pos) +#define SPI_CR3_TXBFC SPI_CR3_TXBFC_Msk + +#define SPI_CR3_RXBFC_Pos (2U) +#define SPI_CR3_RXBFC_Msk (0x1U << SPI_CR3_RXBFC_Pos) +#define SPI_CR3_RXBFC SPI_CR3_RXBFC_Msk + +#define SPI_CR3_MERRC_Pos (1U) +#define SPI_CR3_MERRC_Msk (0x1U << SPI_CR3_MERRC_Pos) +#define SPI_CR3_MERRC SPI_CR3_MERRC_Msk + +#define SPI_CR3_SERRC_Pos (0U) +#define SPI_CR3_SERRC_Msk (0x1U << SPI_CR3_SERRC_Pos) +#define SPI_CR3_SERRC SPI_CR3_SERRC_Msk + +#define SPI_IER_ERRIE_Pos (2U) +#define SPI_IER_ERRIE_Msk (0x1U << SPI_IER_ERRIE_Pos) +#define SPI_IER_ERRIE SPI_IER_ERRIE_Msk + +#define SPI_IER_TXIE_Pos (1U) +#define SPI_IER_TXIE_Msk (0x1U << SPI_IER_TXIE_Pos) +#define SPI_IER_TXIE SPI_IER_TXIE_Msk + +#define SPI_IER_RXIE_Pos (0U) +#define SPI_IER_RXIE_Msk (0x1U << SPI_IER_RXIE_Pos) +#define SPI_IER_RXIE SPI_IER_RXIE_Msk + +#define SPI_ISR_DCN_TX_Pos (12U) +#define SPI_ISR_DCN_TX_Msk (0x1U << SPI_ISR_DCN_TX_Pos) +#define SPI_ISR_DCN_TX SPI_ISR_DCN_TX_Msk + +#define SPI_ISR_RXCOL_Pos (10U) +#define SPI_ISR_RXCOL_Msk (0x1U << SPI_ISR_RXCOL_Pos) +#define SPI_ISR_RXCOL SPI_ISR_RXCOL_Msk + +#define SPI_ISR_TXCOL_Pos (9U) +#define SPI_ISR_TXCOL_Msk (0x1U << SPI_ISR_TXCOL_Pos) +#define SPI_ISR_TXCOL SPI_ISR_TXCOL_Msk + +#define SPI_ISR_BUSY_Pos (8U) +#define SPI_ISR_BUSY_Msk (0x1U << SPI_ISR_BUSY_Pos) +#define SPI_ISR_BUSY SPI_ISR_BUSY_Msk + +#define SPI_ISR_MERR_Pos (6U) +#define SPI_ISR_MERR_Msk (0x1U << SPI_ISR_MERR_Pos) +#define SPI_ISR_MERR SPI_ISR_MERR_Msk + +#define SPI_ISR_SERR_Pos (5U) +#define SPI_ISR_SERR_Msk (0x1U << SPI_ISR_SERR_Pos) +#define SPI_ISR_SERR SPI_ISR_SERR_Msk + +#define SPI_ISR_TXBE_Pos (1U) +#define SPI_ISR_TXBE_Msk (0x1U << SPI_ISR_TXBE_Pos) +#define SPI_ISR_TXBE SPI_ISR_TXBE_Msk + +#define SPI_ISR_RXBF_Pos (0U) +#define SPI_ISR_RXBF_Msk (0x1U << SPI_ISR_RXBF_Pos) +#define SPI_ISR_RXBF SPI_ISR_RXBF_Msk + + + + + + +#define FL_SPI_MASTER_SAMPLING_NORMAL (0x0U << SPI_CR1_MSPA_Pos) +#define FL_SPI_MASTER_SAMPLING_DELAY_HALFCLK (0x1U << SPI_CR1_MSPA_Pos) + + +#define FL_SPI_SLAVE_SAMPLING_NORMAL (0x0U << SPI_CR1_SSPA_Pos) +#define FL_SPI_SLAVE_SAMPLING_ADVANCE_HALFCLK (0x1U << SPI_CR1_SSPA_Pos) + + +#define FL_SPI_WORK_MODE_SLAVE (0x0U << SPI_CR1_MM_Pos) +#define FL_SPI_WORK_MODE_MASTER (0x1U << SPI_CR1_MM_Pos) + + +#define FL_SPI_SEND_WAIT_1 (0x0U << SPI_CR1_WAIT_Pos) +#define FL_SPI_SEND_WAIT_2 (0x1U << SPI_CR1_WAIT_Pos) +#define FL_SPI_SEND_WAIT_3 (0x2U << SPI_CR1_WAIT_Pos) +#define FL_SPI_SEND_WAIT_4 (0x3U << SPI_CR1_WAIT_Pos) + + +#define FL_SPI_CLK_DIV2 (0x0U << SPI_CR1_BAUD_Pos) +#define FL_SPI_CLK_DIV4 (0x1U << SPI_CR1_BAUD_Pos) +#define FL_SPI_CLK_DIV8 (0x2U << SPI_CR1_BAUD_Pos) +#define FL_SPI_CLK_DIV16 (0x3U << SPI_CR1_BAUD_Pos) +#define FL_SPI_CLK_DIV32 (0x4U << SPI_CR1_BAUD_Pos) +#define FL_SPI_CLK_DIV64 (0x5U << SPI_CR1_BAUD_Pos) +#define FL_SPI_CLK_DIV128 (0x6U << SPI_CR1_BAUD_Pos) +#define FL_SPI_CLK_DIV256 (0x7U << SPI_CR1_BAUD_Pos) + +#define FL_SPI_BAUDRATE_DIV2 (0x0U << SPI_CR1_BAUD_Pos) +#define FL_SPI_BAUDRATE_DIV4 (0x1U << SPI_CR1_BAUD_Pos) +#define FL_SPI_BAUDRATE_DIV8 (0x2U << SPI_CR1_BAUD_Pos) +#define FL_SPI_BAUDRATE_DIV16 (0x3U << SPI_CR1_BAUD_Pos) +#define FL_SPI_BAUDRATE_DIV32 (0x4U << SPI_CR1_BAUD_Pos) +#define FL_SPI_BAUDRATE_DIV64 (0x5U << SPI_CR1_BAUD_Pos) +#define FL_SPI_BAUDRATE_DIV128 (0x6U << SPI_CR1_BAUD_Pos) +#define FL_SPI_BAUDRATE_DIV256 (0x7U << SPI_CR1_BAUD_Pos) + +#define FL_SPI_BIT_ORDER_MSB_FIRST (0x0U << SPI_CR1_LSBF_Pos) +#define FL_SPI_BIT_ORDER_LSB_FIRST (0x1U << SPI_CR1_LSBF_Pos) + + +#define FL_SPI_POLARITY_NORMAL (0x0U << SPI_CR1_CPOL_Pos) +#define FL_SPI_POLARITY_INVERT (0x1U << SPI_CR1_CPOL_Pos) + + +#define FL_SPI_PHASE_EDGE1 (0x0U << SPI_CR1_CPHA_Pos) +#define FL_SPI_PHASE_EDGE2 (0x1U << SPI_CR1_CPHA_Pos) + + +#define FL_SPI_DATA_WIDTH_8B (0x0U << SPI_CR2_DLEN_Pos) +#define FL_SPI_DATA_WIDTH_16B (0x1U << SPI_CR2_DLEN_Pos) +#define FL_SPI_DATA_WIDTH_24B (0x2U << SPI_CR2_DLEN_Pos) +#define FL_SPI_DATA_WIDTH_32B (0x3U << SPI_CR2_DLEN_Pos) + + +#define FL_SPI_TRANSFER_MODE_FULL_DUPLEX (0x0U << SPI_CR2_HALFDUPLEX_Pos) +#define FL_SPI_TRANSFER_MODE_HALF_DUPLEX (0x1U << SPI_CR2_HALFDUPLEX_Pos) + + +#define FL_SPI_HALF_DUPLEX_TX (0x0U << SPI_CR2_HD_RW_Pos) +#define FL_SPI_HALF_DUPLEX_RX (0x1U << SPI_CR2_HD_RW_Pos) + + +#define FL_SPI_HALF_DUPLEX_CMDLEN_DLEN (0x0U << SPI_CR2_CMD8B_Pos) +#define FL_SPI_HALF_DUPLEX_CMDLEN_8B (0x1U << SPI_CR2_CMD8B_Pos) + +#define FL_SPI_HALFDUPLEX_CMDLEN_DLEN (0x0U << SPI_CR2_CMD8B_Pos) +#define FL_SPI_HALFDUPLEX_CMDLEN_8B (0x1U << SPI_CR2_CMD8B_Pos) + +#define FL_SPI_HARDWARE_SSN_AUTO_HIGH (0x0U << SPI_CR2_SSNM_Pos) +#define FL_SPI_HARDWARE_SSN_KEEP_LOW (0x1U << SPI_CR2_SSNM_Pos) + + +#define FL_SPI_SSN_LOW (0x0U << SPI_CR2_SSN_Pos) +#define FL_SPI_SSN_HIGH (0x1U << SPI_CR2_SSN_Pos) + + +#define FL_SPI_FRAME_MODE_CMD (0x0U << SPI_ISR_DCN_TX_Pos) +#define FL_SPI_FRAME_MODE_DATA (0x1U << SPI_ISR_DCN_TX_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup SPI_FL_Exported_Functions SPI Exported Functions + * @{ + */ + +/** + * @brief Enable SPI IO Pin Swap + * @rmtoll CR1 IOSWAP FL_SPI_EnablePinSwap + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_EnablePinSwap(SPI_Type *SPIx) +{ + SET_BIT(SPIx->CR1, SPI_CR1_IOSWAP_Msk); +} + +/** + * @brief Get SPI IO Pin Swap State + * @rmtoll CR1 IOSWAP FL_SPI_IsEnabledPinSwap + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsEnabledPinSwap(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_IOSWAP_Msk) == SPI_CR1_IOSWAP_Msk); +} + +/** + * @brief Disable SPI IO Pin Swap + * @rmtoll CR1 IOSWAP FL_SPI_DisablePinSwap + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_DisablePinSwap(SPI_Type *SPIx) +{ + CLEAR_BIT(SPIx->CR1, SPI_CR1_IOSWAP_Msk); +} + +/** + * @brief Set Master Sampling Position Adjustment + * @rmtoll CR1 MSPA FL_SPI_SetMasterSamplingAdjust + * @param SPIx SPI instance + * @param adjust This parameter can be one of the following values: + * @arg @ref FL_SPI_MASTER_SAMPLING_NORMAL + * @arg @ref FL_SPI_MASTER_SAMPLING_DELAY_HALFCLK + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetMasterSamplingAdjust(SPI_Type *SPIx, uint32_t adjust) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_MSPA_Msk, adjust); +} + +/** + * @brief Get Master Sampling Position Adjustment + * @rmtoll CR1 MSPA FL_SPI_GetMasterSamplingAdjust + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_MASTER_SAMPLING_NORMAL + * @arg @ref FL_SPI_MASTER_SAMPLING_DELAY_HALFCLK + */ +__STATIC_INLINE uint32_t FL_SPI_GetMasterSamplingAdjust(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_MSPA_Msk)); +} + +/** + * @brief Set Slave Sending Position Adjustment + * @rmtoll CR1 SSPA FL_SPI_SetSlaveSamplingAdjust + * @param SPIx SPI instance + * @param adjust This parameter can be one of the following values: + * @arg @ref FL_SPI_SLAVE_SAMPLING_NORMAL + * @arg @ref FL_SPI_SLAVE_SAMPLING_ADVANCE_HALFCLK + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetSlaveSamplingAdjust(SPI_Type *SPIx, uint32_t adjust) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_SSPA_Msk, adjust); +} + +/** + * @brief Get Slave Sending Position Adjustment + * @rmtoll CR1 SSPA FL_SPI_GetSlaveSamplingAdjust + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_SLAVE_SAMPLING_NORMAL + * @arg @ref FL_SPI_SLAVE_SAMPLING_ADVANCE_HALFCLK + */ +__STATIC_INLINE uint32_t FL_SPI_GetSlaveSamplingAdjust(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_SSPA_Msk)); +} + +/** + * @brief Set SPI Working Mode + * @rmtoll CR1 MM FL_SPI_SetWorkMode + * @param SPIx SPI instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_SPI_WORK_MODE_SLAVE + * @arg @ref FL_SPI_WORK_MODE_MASTER + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetWorkMode(SPI_Type *SPIx, uint32_t mode) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_MM_Msk, mode); +} + +/** + * @brief Get SPI Working Mode + * @rmtoll CR1 MM FL_SPI_GetWorkMode + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_WORK_MODE_SLAVE + * @arg @ref FL_SPI_WORK_MODE_MASTER + */ +__STATIC_INLINE uint32_t FL_SPI_GetWorkMode(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_MM_Msk)); +} + +/** + * @brief Set SPI Send Wait Cycle Length in Master Mode + * @rmtoll CR1 WAIT FL_SPI_SetSendWait + * @param SPIx SPI instance + * @param wait This parameter can be one of the following values: + * @arg @ref FL_SPI_SEND_WAIT_1 + * @arg @ref FL_SPI_SEND_WAIT_2 + * @arg @ref FL_SPI_SEND_WAIT_3 + * @arg @ref FL_SPI_SEND_WAIT_4 + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetSendWait(SPI_Type *SPIx, uint32_t wait) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_WAIT_Msk, wait); +} + +/** + * @brief Get SPI Send Wait Cycle Length in Master Mode + * @rmtoll CR1 WAIT FL_SPI_GetSendWait + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_SPI_GetSendWait(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_WAIT_Msk)); +} + +/** + * @brief Set SPI Baudrate in Master Mode + * @rmtoll CR1 BAUD FL_SPI_SetClockDivision + * @param SPIx SPI instance + * @param clock This parameter can be one of the following values: + * @arg @ref FL_SPI_CLK_DIV2 + * @arg @ref FL_SPI_CLK_DIV4 + * @arg @ref FL_SPI_CLK_DIV8 + * @arg @ref FL_SPI_CLK_DIV16 + * @arg @ref FL_SPI_CLK_DIV32 + * @arg @ref FL_SPI_CLK_DIV64 + * @arg @ref FL_SPI_CLK_DIV128 + * @arg @ref FL_SPI_CLK_DIV256 + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetClockDivision(SPI_Type *SPIx, uint32_t clock) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_BAUD_Msk, clock); +} + +/** + * @brief Get SPI Baudrate in Master Mode + * @rmtoll CR1 BAUD FL_SPI_GetClockDivision + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_BAUDRATE_DIV2 + * @arg @ref FL_SPI_BAUDRATE_DIV4 + * @arg @ref FL_SPI_BAUDRATE_DIV8 + * @arg @ref FL_SPI_BAUDRATE_DIV16 + * @arg @ref FL_SPI_BAUDRATE_DIV32 + * @arg @ref FL_SPI_BAUDRATE_DIV64 + * @arg @ref FL_SPI_BAUDRATE_DIV128 + * @arg @ref FL_SPI_BAUDRATE_DIV256 + */ +__STATIC_INLINE uint32_t FL_SPI_GetClockDivision(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_BAUD_Msk)); +} + +/** + * @brief Set SPI Bit Order + * @rmtoll CR1 LSBF FL_SPI_SetBitOrder + * @param SPIx SPI instance + * @param bitOrder This parameter can be one of the following values: + * @arg @ref FL_SPI_BIT_ORDER_MSB_FIRST + * @arg @ref FL_SPI_BIT_ORDER_LSB_FIRST + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetBitOrder(SPI_Type *SPIx, uint32_t bitOrder) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_LSBF_Msk, bitOrder); +} + +/** + * @brief Get SPI Bit Order + * @rmtoll CR1 LSBF FL_SPI_GetBitOrder + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_BIT_ORDER_MSB_FIRST + * @arg @ref FL_SPI_BIT_ORDER_LSB_FIRST + */ +__STATIC_INLINE uint32_t FL_SPI_GetBitOrder(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_LSBF_Msk)); +} + +/** + * @brief Set SPI Clock Polarity + * @rmtoll CR1 CPOL FL_SPI_SetClockPolarity + * @param SPIx SPI instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_SPI_POLARITY_NORMAL + * @arg @ref FL_SPI_POLARITY_INVERT + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetClockPolarity(SPI_Type *SPIx, uint32_t polarity) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_CPOL_Msk, polarity); +} + +/** + * @brief Get SPI Clock Polarity + * @rmtoll CR1 CPOL FL_SPI_GetClockPolarity + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_POLARITY_NORMAL + * @arg @ref FL_SPI_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_SPI_GetClockPolarity(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPOL_Msk)); +} + +/** + * @brief Set SPI Clock Phase + * @rmtoll CR1 CPHA FL_SPI_SetClockPhase + * @param SPIx SPI instance + * @param phase This parameter can be one of the following values: + * @arg @ref FL_SPI_PHASE_EDGE1 + * @arg @ref FL_SPI_PHASE_EDGE2 + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetClockPhase(SPI_Type *SPIx, uint32_t phase) +{ + MODIFY_REG(SPIx->CR1, SPI_CR1_CPHA_Msk, phase); +} + +/** + * @brief Get SPI Clock Phase + * @rmtoll CR1 CPHA FL_SPI_GetClockPhase + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_PHASE_EDGE1 + * @arg @ref FL_SPI_PHASE_EDGE2 + */ +__STATIC_INLINE uint32_t FL_SPI_GetClockPhase(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR1, SPI_CR1_CPHA_Msk)); +} + +/** + * @brief Enable SPI Dummy Cycle Setting Under 4-lines Half Duplex Mode + * @rmtoll CR2 DUMMY_EN FL_SPI_EnableDummyCycle + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_EnableDummyCycle(SPI_Type *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_DUMMY_EN_Msk); +} + +/** + * @brief Disable SPI Dummy Cycle Setting Under 4-lines Half Duplex Mode + * @rmtoll CR2 DUMMY_EN FL_SPI_DisableDummyCycle + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_DisableDummyCycle(SPI_Type *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_DUMMY_EN_Msk); +} + +/** + * @brief Get SPI Dummy Cycle Mode Setting + * @rmtoll CR2 DUMMY_EN FL_SPI_IsEnabledDummyCycle + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsEnabledDummyCycle(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_DUMMY_EN_Msk) == SPI_CR2_DUMMY_EN_Msk); +} + +/** + * @brief Enable SPI Receive Only Mode + * @rmtoll CR2 RXO FL_SPI_EnableRXOnlyMode + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_EnableRXOnlyMode(SPI_Type *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_RXO_Msk); +} + +/** + * @brief Disable SPI Receive Only Mode Setting + * @rmtoll CR2 RXO FL_SPI_DisableRXOnlyMode + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_DisableRXOnlyMode(SPI_Type *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_RXO_Msk); +} + +/** + * @brief Get SPI Receive Only Mode state + * @rmtoll CR2 RXO FL_SPI_IsEnabledRXOnlyMode + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsEnabledRXOnlyMode(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_RXO_Msk) == SPI_CR2_RXO_Msk); +} + +/** + * @brief Set SPI Data Width + * @rmtoll CR2 DLEN FL_SPI_SetDataWidth + * @param SPIx SPI instance + * @param width This parameter can be one of the following values: + * @arg @ref FL_SPI_DATA_WIDTH_8B + * @arg @ref FL_SPI_DATA_WIDTH_16B + * @arg @ref FL_SPI_DATA_WIDTH_24B + * @arg @ref FL_SPI_DATA_WIDTH_32B + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetDataWidth(SPI_Type *SPIx, uint32_t width) +{ + MODIFY_REG(SPIx->CR2, SPI_CR2_DLEN_Msk, width); +} + +/** + * @brief Get SPI Data Width + * @rmtoll CR2 DLEN FL_SPI_GetDataWidth + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_DATA_WIDTH_8B + * @arg @ref FL_SPI_DATA_WIDTH_16B + * @arg @ref FL_SPI_DATA_WIDTH_24B + * @arg @ref FL_SPI_DATA_WIDTH_32B + */ +__STATIC_INLINE uint32_t FL_SPI_GetDataWidth(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_DLEN_Msk)); +} + +/** + * @brief Set SPI Transfer Mode + * @rmtoll CR2 HALFDUPLEX FL_SPI_SetTransferMode + * @param SPIx SPI instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_SPI_TRANSFER_MODE_FULL_DUPLEX + * @arg @ref FL_SPI_TRANSFER_MODE_HALF_DUPLEX + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetTransferMode(SPI_Type *SPIx, uint32_t mode) +{ + MODIFY_REG(SPIx->CR2, SPI_CR2_HALFDUPLEX_Msk, mode); +} + +/** + * @brief Get SPI Transfer Mode + * @rmtoll CR2 HALFDUPLEX FL_SPI_GetTransferMode + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_TRANSFER_MODE_FULL_DUPLEX + * @arg @ref FL_SPI_TRANSFER_MODE_HALF_DUPLEX + */ +__STATIC_INLINE uint32_t FL_SPI_GetTransferMode(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_HALFDUPLEX_Msk)); +} + +/** + * @brief Set SPI Transfer Direction Under Half-Duplex Mode + * @rmtoll CR2 HD_RW FL_SPI_SetTransferDirection + * @param SPIx SPI instance + * @param direction This parameter can be one of the following values: + * @arg @ref FL_SPI_HALF_DUPLEX_TX + * @arg @ref FL_SPI_HALF_DUPLEX_RX + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetTransferDirection(SPI_Type *SPIx, uint32_t direction) +{ + MODIFY_REG(SPIx->CR2, SPI_CR2_HD_RW_Msk, direction); +} + +/** + * @brief Get SPI Transfer Direction Under Half-Duplex Mode + * @rmtoll CR2 HD_RW FL_SPI_GetTransferDirection + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_HALF_DUPLEX_TX + * @arg @ref FL_SPI_HALF_DUPLEX_RX + */ +__STATIC_INLINE uint32_t FL_SPI_GetTransferDirection(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_HD_RW_Msk)); +} + +/** + * @brief Set Command Frame Length Under Half-Duplex Mode + * @rmtoll CR2 CMD8B FL_SPI_SetHalfDuplexCommandLength + * @param SPIx SPI instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_SPI_HALF_DUPLEX_CMDLEN_DLEN + * @arg @ref FL_SPI_HALF_DUPLEX_CMDLEN_8B + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetHalfDuplexCommandLength(SPI_Type *SPIx, uint32_t mode) +{ + MODIFY_REG(SPIx->CR2, SPI_CR2_CMD8B_Msk, mode); +} + +/** + * @brief Get Command Frame Length Under Half-Duplex Mode + * @rmtoll CR2 CMD8B FL_SPI_GetHalfDuplexCommandLength + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_HALFDUPLEX_CMDLEN_DLEN + * @arg @ref FL_SPI_HALFDUPLEX_CMDLEN_8B + */ +__STATIC_INLINE uint32_t FL_SPI_GetHalfDuplexCommandLength(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_CMD8B_Msk)); +} + +/** + * @brief Set SPI SSN Hard Pin Mode + * @rmtoll CR2 SSNM FL_SPI_SetHardwareSSNMode + * @param SPIx SPI instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_SPI_HARDWARE_SSN_AUTO_HIGH + * @arg @ref FL_SPI_HARDWARE_SSN_KEEP_LOW + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetHardwareSSNMode(SPI_Type *SPIx, uint32_t mode) +{ + MODIFY_REG(SPIx->CR2, SPI_CR2_SSNM_Msk, mode); +} + +/** + * @brief Get SPI SSN Hard Pin Mode + * @rmtoll CR2 SSNM FL_SPI_GetHardwareSSNMode + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_HARDWARE_SSN_AUTO_HIGH + * @arg @ref FL_SPI_HARDWARE_SSN_KEEP_LOW + */ +__STATIC_INLINE uint32_t FL_SPI_GetHardwareSSNMode(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_SSNM_Msk)); +} + +/** + * @brief Enabel TX Only Mode Auto Disable + * @rmtoll CR2 TXO_AC FL_SPI_EnableTXOnlyModeAutoDisable + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_EnableTXOnlyModeAutoDisable(SPI_Type *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_TXO_AC_Msk); +} + +/** + * @brief Disable TX Only Mode Auto Disable + * @rmtoll CR2 TXO_AC FL_SPI_DisableTXOnlyModeAutoDisable + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_DisableTXOnlyModeAutoDisable(SPI_Type *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_TXO_AC_Msk); +} + +/** + * @brief Get TX Only Mode Auto Disable Setting + * @rmtoll CR2 TXO_AC FL_SPI_IsEnabledTXOnlyModeAutoDisable + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsEnabledTXOnlyModeAutoDisable(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_TXO_AC_Msk) == SPI_CR2_TXO_AC_Msk); +} + +/** + * @brief EnableSPI TX Only Mode + * @rmtoll CR2 TXO FL_SPI_EnableTXOnlyMode + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_EnableTXOnlyMode(SPI_Type *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_TXO_Msk); +} + +/** + * @brief Get SPI TX Only Mode Setting State + * @rmtoll CR2 TXO FL_SPI_IsEnabledTXOnlyMode + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsEnabledTXOnlyMode(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_TXO_Msk) == SPI_CR2_TXO_Msk); +} + +/** + * @brief Set SSN Pin + * @rmtoll CR2 SSN FL_SPI_SetSSNPin + * @param SPIx SPI instance + * @param state This parameter can be one of the following values: + * @arg @ref FL_SPI_SSN_LOW + * @arg @ref FL_SPI_SSN_HIGH + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetSSNPin(SPI_Type *SPIx, uint32_t state) +{ + MODIFY_REG(SPIx->CR2, SPI_CR2_SSN_Msk, state); +} + +/** + * @brief Reset SSN Pin + * @rmtoll CR2 SSN FL_SPI_GetSSNPin + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_SSN_LOW + * @arg @ref FL_SPI_SSN_HIGH + */ +__STATIC_INLINE uint32_t FL_SPI_GetSSNPin(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_SSN_Msk)); +} + +/** + * @brief Enable SNN Sofe Control Under Master Mode + * @rmtoll CR2 SSNSEN FL_SPI_EnableSSNSoftControl + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_EnableSSNSoftControl(SPI_Type *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_SSNSEN_Msk); +} + +/** + * @brief Get SNN Sofe Control State Under Master Mode + * @rmtoll CR2 SSNSEN FL_SPI_IsEnabledSSNSoftControl + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsEnabledSSNSoftControl(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_SSNSEN_Msk) == SPI_CR2_SSNSEN_Msk); +} + +/** + * @brief Disable SNN Sofe Control Under Master Mode + * @rmtoll CR2 SSNSEN FL_SPI_DisableSSNSoftControl + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_DisableSSNSoftControl(SPI_Type *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_SSNSEN_Msk); +} + +/** + * @brief Enable SPI + * @rmtoll CR2 SPIEN FL_SPI_Enable + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_Enable(SPI_Type *SPIx) +{ + SET_BIT(SPIx->CR2, SPI_CR2_SPIEN_Msk); +} + +/** + * @brief Get SPI Enable Status + * @rmtoll CR2 SPIEN FL_SPI_IsEnabled + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsEnabled(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->CR2, SPI_CR2_SPIEN_Msk) == SPI_CR2_SPIEN_Msk); +} + +/** + * @brief Disable SPI + * @rmtoll CR2 SPIEN FL_SPI_Disable + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_Disable(SPI_Type *SPIx) +{ + CLEAR_BIT(SPIx->CR2, SPI_CR2_SPIEN_Msk); +} + +/** + * @brief Clear SPI TX Buffer + * @rmtoll CR3 TXBFC FL_SPI_ClearTXBuff + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_ClearTXBuff(SPI_Type *SPIx) +{ + WRITE_REG(SPIx->CR3, SPI_CR3_TXBFC_Msk); +} + +/** + * @brief Clear SPI RX Buffer + * @rmtoll CR3 RXBFC FL_SPI_ClearRXBuff + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_ClearRXBuff(SPI_Type *SPIx) +{ + WRITE_REG(SPIx->CR3, SPI_CR3_RXBFC_Msk); +} + +/** + * @brief Clear SPI Master Error Flag + * @rmtoll CR3 MERRC FL_SPI_ClearFlag_MasterError + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_ClearFlag_MasterError(SPI_Type *SPIx) +{ + WRITE_REG(SPIx->CR3, SPI_CR3_MERRC_Msk); +} + +/** + * @brief Clear SPI Slave Error Flag + * @rmtoll CR3 SERRC FL_SPI_ClearFlag_SlaveError + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_ClearFlag_SlaveError(SPI_Type *SPIx) +{ + WRITE_REG(SPIx->CR3, SPI_CR3_SERRC_Msk); +} + +/** + * @brief Disable SPI Error Interrupt + * @rmtoll IER ERRIE FL_SPI_DisableIT_Error + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_DisableIT_Error(SPI_Type *SPIx) +{ + CLEAR_BIT(SPIx->IER, SPI_IER_ERRIE_Msk); +} + +/** + * @brief Enable SPI Error Interrupt + * @rmtoll IER ERRIE FL_SPI_EnableIT_Error + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_EnableIT_Error(SPI_Type *SPIx) +{ + SET_BIT(SPIx->IER, SPI_IER_ERRIE_Msk); +} + +/** + * @brief Get SPI Error Interrupt Enable Status + * @rmtoll IER ERRIE FL_SPI_IsEnabledIT_Error + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsEnabledIT_Error(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->IER, SPI_IER_ERRIE_Msk) == SPI_IER_ERRIE_Msk); +} + +/** + * @brief Disable SPI Transmit Complete Interrupt + * @rmtoll IER TXIE FL_SPI_DisableIT_TXComplete + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_DisableIT_TXComplete(SPI_Type *SPIx) +{ + CLEAR_BIT(SPIx->IER, SPI_IER_TXIE_Msk); +} + +/** + * @brief Enable SPI Transmit Complete Interrupt + * @rmtoll IER TXIE FL_SPI_EnableIT_TXComplete + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_EnableIT_TXComplete(SPI_Type *SPIx) +{ + SET_BIT(SPIx->IER, SPI_IER_TXIE_Msk); +} + +/** + * @brief Get SPI Transmit Complete Interrupt Enable Status + * @rmtoll IER TXIE FL_SPI_IsEnabledIT_TXComplete + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsEnabledIT_TXComplete(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->IER, SPI_IER_TXIE_Msk) == SPI_IER_TXIE_Msk); +} + +/** + * @brief Disable SPI Receive Complete Interrupt + * @rmtoll IER RXIE FL_SPI_DisableIT_RXComplete + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_DisableIT_RXComplete(SPI_Type *SPIx) +{ + CLEAR_BIT(SPIx->IER, SPI_IER_RXIE_Msk); +} + +/** + * @brief Enable SPI Receive Complete Interrupt + * @rmtoll IER RXIE FL_SPI_EnableIT_RXComplete + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_EnableIT_RXComplete(SPI_Type *SPIx) +{ + SET_BIT(SPIx->IER, SPI_IER_RXIE_Msk); +} + +/** + * @brief Get SPI Receive Complete Interrupt Enable Status + * @rmtoll IER RXIE FL_SPI_IsEnabledIT_RXComplete + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsEnabledIT_RXComplete(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->IER, SPI_IER_RXIE_Msk) == SPI_IER_RXIE_Msk); +} + +/** + * @brief Set SPI Output Data/Command Under Half-Duplex Mode + * @rmtoll ISR DCN_TX FL_SPI_SetFrameMode + * @param SPIx SPI instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_SPI_FRAME_MODE_CMD + * @arg @ref FL_SPI_FRAME_MODE_DATA + * @retval None + */ +__STATIC_INLINE void FL_SPI_SetFrameMode(SPI_Type *SPIx, uint32_t mode) +{ + MODIFY_REG(SPIx->ISR, SPI_ISR_DCN_TX_Msk, mode); +} + +/** + * @brief Get SPI Output Data/Command Under Half-Duplex Mode Setting + * @rmtoll ISR DCN_TX FL_SPI_GetFrameMode + * @param SPIx SPI instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SPI_FRAME_MODE_CMD + * @arg @ref FL_SPI_FRAME_MODE_DATA + */ +__STATIC_INLINE uint32_t FL_SPI_GetFrameMode(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->ISR, SPI_ISR_DCN_TX_Msk)); +} + +/** + * @brief Get SPI Receive Collision Flag + * @rmtoll ISR RXCOL FL_SPI_IsActiveFlag_RXBuffOverflow + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsActiveFlag_RXBuffOverflow(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->ISR, SPI_ISR_RXCOL_Msk) == (SPI_ISR_RXCOL_Msk)); +} + +/** + * @brief Clear SPI Receive Collision Flag + * @rmtoll ISR RXCOL FL_SPI_ClearFlag_RXBuffOverflow + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_ClearFlag_RXBuffOverflow(SPI_Type *SPIx) +{ + WRITE_REG(SPIx->ISR, SPI_ISR_RXCOL_Msk); +} + +/** + * @brief Get SPI Transmit Collision Flag + * @rmtoll ISR TXCOL FL_SPI_IsActiveFlag_TXBuffOverflow + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsActiveFlag_TXBuffOverflow(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->ISR, SPI_ISR_TXCOL_Msk) == (SPI_ISR_TXCOL_Msk)); +} + +/** + * @brief Clear SPI Transmit Collision Flag + * @rmtoll ISR TXCOL FL_SPI_ClearFlag_TXBuffOverflow + * @param SPIx SPI instance + * @retval None + */ +__STATIC_INLINE void FL_SPI_ClearFlag_TXBuffOverflow(SPI_Type *SPIx) +{ + WRITE_REG(SPIx->ISR, SPI_ISR_TXCOL_Msk); +} + +/** + * @brief Get SPI Busy Flag + * @rmtoll ISR BUSY FL_SPI_IsActiveFlag_Busy + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsActiveFlag_Busy(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->ISR, SPI_ISR_BUSY_Msk) == (SPI_ISR_BUSY_Msk)); +} + +/** + * @brief Get SPI Master Error Flag + * @rmtoll ISR MERR FL_SPI_IsActiveFlag_MasterError + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsActiveFlag_MasterError(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->ISR, SPI_ISR_MERR_Msk) == (SPI_ISR_MERR_Msk)); +} + +/** + * @brief Get SPI Slave Error Flag + * @rmtoll ISR SERR FL_SPI_IsActiveFlag_SlaveError + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsActiveFlag_SlaveError(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->ISR, SPI_ISR_SERR_Msk) == (SPI_ISR_SERR_Msk)); +} + +/** + * @brief Get SPI TX Buffer Empty Flag + * @rmtoll ISR TXBE FL_SPI_IsActiveFlag_TXBuffEmpty + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsActiveFlag_TXBuffEmpty(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->ISR, SPI_ISR_TXBE_Msk) == (SPI_ISR_TXBE_Msk)); +} + +/** + * @brief Get SPI RX Buffer Full Flag + * @rmtoll ISR RXBF FL_SPI_IsActiveFlag_RXBuffFull + * @param SPIx SPI instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SPI_IsActiveFlag_RXBuffFull(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->ISR, SPI_ISR_RXBF_Msk) == (SPI_ISR_RXBF_Msk)); +} + +/** + * @brief Write SPI TX Buffer + * @rmtoll TXBUF FL_SPI_WriteTXBuff + * @param SPIx SPI instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_SPI_WriteTXBuff(SPI_Type *SPIx, uint32_t data) +{ + MODIFY_REG(SPIx->TXBUF, (0xffffffffU << 0U), (data << 0U)); +} + +/** + * @brief Read SPI TX Buffer + * @rmtoll RXBUF FL_SPI_ReadRXBuff + * @param SPIx SPI instance + * @retval + */ +__STATIC_INLINE uint32_t FL_SPI_ReadRXBuff(SPI_Type *SPIx) +{ + return (uint32_t)(READ_BIT(SPIx->RXBUF, (0xffffffffU << 0U)) >> 0U); +} + +/** + * @} + */ + +/** @defgroup SPI_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_SPI_DeInit(SPI_Type *SPIx); +FL_ErrorStatus FL_SPI_Init(SPI_Type *SPIx, FL_SPI_InitTypeDef *initStruct); +void FL_SPI_StructInit(FL_SPI_InitTypeDef *initStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_SPI_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.1 @ 2020-10-20*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_svd.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_svd.h new file mode 100644 index 0000000..624caca --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_svd.h @@ -0,0 +1,606 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_svd.h + * @author FMSH Application Team + * @brief Head file of SVD FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_SVD_H +#define __FM33LG0XX_FL_SVD_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup SVD SVD + * @brief SVD FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup SVD_FL_ES_INIT SVD Exported Init structures + * @{ + */ + +/** + * @brief FL SVD Init Sturcture definition + */ + +typedef struct +{ + /* 参考电压 */ + uint32_t referenceVoltage; + + /* 报警阈值 */ + uint32_t warningThreshold; + + /* 数字滤波 */ + uint32_t digitalFilter; + + /* 工作模式 */ + uint32_t workMode; + + /* 间歇使能间隔 */ + uint32_t enablePeriod; + + /* SVS通道选择 */ + uint32_t SVSChannel; + +} FL_SVD_InitTypeDef; + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup SVD_FL_Exported_Constants SVD Exported Constants + * @{ + */ + +#define SVD_CFGR_LVL_Pos (4U) +#define SVD_CFGR_LVL_Msk (0xfU << SVD_CFGR_LVL_Pos) +#define SVD_CFGR_LVL SVD_CFGR_LVL_Msk + +#define SVD_CFGR_DFEN_Pos (3U) +#define SVD_CFGR_DFEN_Msk (0x1U << SVD_CFGR_DFEN_Pos) +#define SVD_CFGR_DFEN SVD_CFGR_DFEN_Msk + +#define SVD_CFGR_MOD_Pos (2U) +#define SVD_CFGR_MOD_Msk (0x1U << SVD_CFGR_MOD_Pos) +#define SVD_CFGR_MOD SVD_CFGR_MOD_Msk + +#define SVD_CFGR_ITVL_Pos (0U) +#define SVD_CFGR_ITVL_Msk (0x3U << SVD_CFGR_ITVL_Pos) +#define SVD_CFGR_ITVL SVD_CFGR_ITVL_Msk + +#define SVD_CR_SVS0EN_Pos (1U) +#define SVD_CR_SVS0EN_Msk (0x1U << SVD_CR_SVS0EN_Pos) +#define SVD_CR_SVS0EN SVD_CR_SVS0EN_Msk + +#define SVD_CR_EN_Pos (0U) +#define SVD_CR_EN_Msk (0x1U << SVD_CR_EN_Pos) +#define SVD_CR_EN SVD_CR_EN_Msk + +#define SVD_IER_PFIE_Pos (1U) +#define SVD_IER_PFIE_Msk (0x1U << SVD_IER_PFIE_Pos) +#define SVD_IER_PFIE SVD_IER_PFIE_Msk + +#define SVD_IER_PRIE_Pos (0U) +#define SVD_IER_PRIE_Msk (0x1U << SVD_IER_PRIE_Pos) +#define SVD_IER_PRIE SVD_IER_PRIE_Msk + +#define SVD_ISR_SVDO_Pos (8U) +#define SVD_ISR_SVDO_Msk (0x1U << SVD_ISR_SVDO_Pos) +#define SVD_ISR_SVDO SVD_ISR_SVDO_Msk + +#define SVD_ISR_SVDR_Pos (7U) +#define SVD_ISR_SVDR_Msk (0x1U << SVD_ISR_SVDR_Pos) +#define SVD_ISR_SVDR SVD_ISR_SVDR_Msk + +#define SVD_ISR_PFF_Pos (1U) +#define SVD_ISR_PFF_Msk (0x1U << SVD_ISR_PFF_Pos) +#define SVD_ISR_PFF SVD_ISR_PFF_Msk + +#define SVD_ISR_PRF_Pos (0U) +#define SVD_ISR_PRF_Msk (0x1U << SVD_ISR_PRF_Pos) +#define SVD_ISR_PRF SVD_ISR_PRF_Msk + +#define SVD_VSR_EN_Pos (0U) +#define SVD_VSR_EN_Msk (0x7U << SVD_VSR_EN_Pos) +#define SVD_VSR_EN SVD_VSR_EN_Msk + + + +#define FL_SVD_REFERENCE_1P0V (0x1U << 2U) +#define FL_SVD_REFERENCE_0P95V (0x1U << 1U) +#define FL_SVD_REFERENCE_0P9V (0x1U << 0U) + + + +#define FL_SVD_WARNING_THRESHOLD_GROUP0 (0x0U << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP1 (0x1U << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP2 (0x2U << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP3 (0x3U << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP4 (0x4U << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP5 (0x5U << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP6 (0x6U << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP7 (0x7U << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP8 (0x8U << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP9 (0x9U << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP10 (0xaU << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP11 (0xbU << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP12 (0xcU << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP13 (0xdU << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP14 (0xeU << SVD_CFGR_LVL_Pos) +#define FL_SVD_WARNING_THRESHOLD_GROUP15 (0xfU << SVD_CFGR_LVL_Pos) + + +#define FL_SVD_WORK_MODE_CONTINUOUS (0x0U << SVD_CFGR_MOD_Pos) +#define FL_SVD_WORK_MODE_PERIODIC (0x1U << SVD_CFGR_MOD_Pos) + + +#define FL_SVD_ENABLE_PERIOD_62P5MS (0x0U << SVD_CFGR_ITVL_Pos) +#define FL_SVD_ENABLE_PERIOD_256MS (0x1U << SVD_CFGR_ITVL_Pos) +#define FL_SVD_ENABLE_PERIOD_1000MS (0x2U << SVD_CFGR_ITVL_Pos) +#define FL_SVD_ENABLE_PERIOD_4000MS (0x3U << SVD_CFGR_ITVL_Pos) + + +#define FL_SVD_POWER_STATUS_FALLING (0x0U << SVD_ISR_SVDO_Pos) +#define FL_SVD_POWER_STATUS_RISING (0x1U << SVD_ISR_SVDO_Pos) + +#define FL_SVD_LATCHED_POWER_STATUS_FALLING (0x0U << SVD_ISR_SVDR_Pos) +#define FL_SVD_LATCHED_POWER_STATUS_RISING (0x1U << SVD_ISR_SVDR_Pos) + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup SVD_FL_Exported_Functions SVD Exported Functions + * @{ + */ + +/** + * @brief Set SVD Threshold Warning Level + * @rmtoll CFGR LVL FL_SVD_SetWarningThreshold + * @param SVDx SVD instance + * @param level This parameter can be one of the following values: + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP0 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP1 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP2 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP3 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP4 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP5 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP6 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP7 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP8 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP9 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP10 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP11 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP12 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP13 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP14 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP15 + * @retval None + */ +__STATIC_INLINE void FL_SVD_SetWarningThreshold(SVD_Type *SVDx, uint32_t level) +{ + MODIFY_REG(SVDx->CFGR, SVD_CFGR_LVL_Msk, level); +} + +/** + * @brief Get SVD Warning Threshold Level + * @rmtoll CFGR LVL FL_SVD_GetWarningThreshold + * @param SVDx SVD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP0 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP1 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP2 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP3 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP4 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP5 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP6 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP7 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP8 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP9 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP10 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP11 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP12 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP13 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP14 + * @arg @ref FL_SVD_WARNING_THRESHOLD_GROUP15 + */ +__STATIC_INLINE uint32_t FL_SVD_GetWarningThreshold(SVD_Type *SVDx) +{ + return (uint32_t)(READ_BIT(SVDx->CFGR, SVD_CFGR_LVL_Msk)); +} + +/** + * @brief Enable SVD Digital Filter + * @rmtoll CFGR DFEN FL_SVD_EnableDigitalFilter + * @param SVDx SVD instance + * @retval None + */ +__STATIC_INLINE void FL_SVD_EnableDigitalFilter(SVD_Type *SVDx) +{ + SET_BIT(SVDx->CFGR, SVD_CFGR_DFEN_Msk); +} + +/** + * @brief Get SVD Digital Filter Enable Status + * @rmtoll CFGR DFEN FL_SVD_IsEnabledDigitalFilter + * @param SVDx SVD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SVD_IsEnabledDigitalFilter(SVD_Type *SVDx) +{ + return (uint32_t)(READ_BIT(SVDx->CFGR, SVD_CFGR_DFEN_Msk) == SVD_CFGR_DFEN_Msk); +} + +/** + * @brief Disable SVD Digital Filter + * @rmtoll CFGR DFEN FL_SVD_DisableDigitalFilter + * @param SVDx SVD instance + * @retval None + */ +__STATIC_INLINE void FL_SVD_DisableDigitalFilter(SVD_Type *SVDx) +{ + CLEAR_BIT(SVDx->CFGR, SVD_CFGR_DFEN_Msk); +} + +/** + * @brief Set SVD Work Mode + * @rmtoll CFGR MOD FL_SVD_SetWorkMode + * @param SVDx SVD instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_SVD_WORK_MODE_CONTINUOUS + * @arg @ref FL_SVD_WORK_MODE_PERIODIC + * @retval None + */ +__STATIC_INLINE void FL_SVD_SetWorkMode(SVD_Type *SVDx, uint32_t mode) +{ + MODIFY_REG(SVDx->CFGR, SVD_CFGR_MOD_Msk, mode); +} + +/** + * @brief Get SVD Work Mode + * @rmtoll CFGR MOD FL_SVD_GetWorkMode + * @param SVDx SVD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SVD_WORK_MODE_CONTINUOUS + * @arg @ref FL_SVD_WORK_MODE_PERIODIC + */ +__STATIC_INLINE uint32_t FL_SVD_GetWorkMode(SVD_Type *SVDx) +{ + return (uint32_t)(READ_BIT(SVDx->CFGR, SVD_CFGR_MOD_Msk)); +} + +/** + * @brief Set SVD Enable Period + * @rmtoll CFGR ITVL FL_SVD_SetEnablePeriod + * @param SVDx SVD instance + * @param period This parameter can be one of the following values: + * @arg @ref FL_SVD_ENABLE_PERIOD_62P5MS + * @arg @ref FL_SVD_ENABLE_PERIOD_256MS + * @arg @ref FL_SVD_ENABLE_PERIOD_1000MS + * @arg @ref FL_SVD_ENABLE_PERIOD_4000MS + * @retval None + */ +__STATIC_INLINE void FL_SVD_SetEnablePeriod(SVD_Type *SVDx, uint32_t period) +{ + MODIFY_REG(SVDx->CFGR, SVD_CFGR_ITVL_Msk, period); +} + +/** + * @brief Get SVD Work Interval + * @rmtoll CFGR ITVL FL_SVD_GetEnablePeriod + * @param SVDx SVD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SVD_ENABLE_PERIOD_62P5MS + * @arg @ref FL_SVD_ENABLE_PERIOD_256MS + * @arg @ref FL_SVD_ENABLE_PERIOD_1000MS + * @arg @ref FL_SVD_ENABLE_PERIOD_4000MS + */ +__STATIC_INLINE uint32_t FL_SVD_GetEnablePeriod(SVD_Type *SVDx) +{ + return (uint32_t)(READ_BIT(SVDx->CFGR, SVD_CFGR_ITVL_Msk)); +} + +/** + * @brief Enable External SVS Channel + * @rmtoll CR SVS0EN FL_SVD_EnableSVSChannel + * @param SVDx SVD instance + * @retval None + */ +__STATIC_INLINE void FL_SVD_EnableSVSChannel(SVD_Type *SVDx) +{ + SET_BIT(SVDx->CR, SVD_CR_SVS0EN_Msk); +} + +/** + * @brief Get External SVS Channel Enable Status + * @rmtoll CR SVS0EN FL_SVD_IsEnabledSVSChannel + * @param SVDx SVD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SVD_IsEnabledSVSChannel(SVD_Type *SVDx) +{ + return (uint32_t)(READ_BIT(SVDx->CR, SVD_CR_SVS0EN_Msk) == SVD_CR_SVS0EN_Msk); +} + +/** + * @brief Disable External SVS Channel + * @rmtoll CR SVS0EN FL_SVD_DisableSVSChannel + * @param SVDx SVD instance + * @retval None + */ +__STATIC_INLINE void FL_SVD_DisableSVSChannel(SVD_Type *SVDx) +{ + CLEAR_BIT(SVDx->CR, SVD_CR_SVS0EN_Msk); +} + +/** + * @brief Enable SVD + * @rmtoll CR EN FL_SVD_Enable + * @param SVDx SVD instance + * @retval None + */ +__STATIC_INLINE void FL_SVD_Enable(SVD_Type *SVDx) +{ + SET_BIT(SVDx->CR, SVD_CR_EN_Msk); +} + +/** + * @brief Get SVD Enable Status + * @rmtoll CR EN FL_SVD_IsEnabled + * @param SVDx SVD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SVD_IsEnabled(SVD_Type *SVDx) +{ + return (uint32_t)(READ_BIT(SVDx->CR, SVD_CR_EN_Msk) == SVD_CR_EN_Msk); +} + +/** + * @brief Disable SVD + * @rmtoll CR EN FL_SVD_Disable + * @param SVDx SVD instance + * @retval None + */ +__STATIC_INLINE void FL_SVD_Disable(SVD_Type *SVDx) +{ + CLEAR_BIT(SVDx->CR, SVD_CR_EN_Msk); +} + +/** + * @brief Enable Power Fall Interrupt + * @rmtoll IER PFIE FL_SVD_EnableIT_PowerFall + * @param SVDx SVD instance + * @retval None + */ +__STATIC_INLINE void FL_SVD_EnableIT_PowerFall(SVD_Type *SVDx) +{ + SET_BIT(SVDx->IER, SVD_IER_PFIE_Msk); +} + +/** + * @brief Get Power Fall Interrupt Status + * @rmtoll IER PFIE FL_SVD_IsEnabledIT_PowerFall + * @param SVDx SVD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SVD_IsEnabledIT_PowerFall(SVD_Type *SVDx) +{ + return (uint32_t)(READ_BIT(SVDx->IER, SVD_IER_PFIE_Msk) == SVD_IER_PFIE_Msk); +} + +/** + * @brief Disable Power Fall Interrupt + * @rmtoll IER PFIE FL_SVD_DisableIT_PowerFall + * @param SVDx SVD instance + * @retval None + */ +__STATIC_INLINE void FL_SVD_DisableIT_PowerFall(SVD_Type *SVDx) +{ + CLEAR_BIT(SVDx->IER, SVD_IER_PFIE_Msk); +} + +/** + * @brief Enable Power Rise Interrupt + * @rmtoll IER PRIE FL_SVD_EnableIT_PowerRise + * @param SVDx SVD instance + * @retval None + */ +__STATIC_INLINE void FL_SVD_EnableIT_PowerRise(SVD_Type *SVDx) +{ + SET_BIT(SVDx->IER, SVD_IER_PRIE_Msk); +} + +/** + * @brief Get Power Rise Interrupt Status + * @rmtoll IER PRIE FL_SVD_IsEnabledIT_PowerRise + * @param SVDx SVD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SVD_IsEnabledIT_PowerRise(SVD_Type *SVDx) +{ + return (uint32_t)(READ_BIT(SVDx->IER, SVD_IER_PRIE_Msk) == SVD_IER_PRIE_Msk); +} + +/** + * @brief Disable Power Rise Interrupt + * @rmtoll IER PRIE FL_SVD_DisableIT_PowerRise + * @param SVDx SVD instance + * @retval None + */ +__STATIC_INLINE void FL_SVD_DisableIT_PowerRise(SVD_Type *SVDx) +{ + CLEAR_BIT(SVDx->IER, SVD_IER_PRIE_Msk); +} + +/** + * @brief Get SVD Current Power Status + * @rmtoll ISR SVDO FL_SVD_GetCurrentPowerStatus + * @param SVDx SVD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SVD_POWER_STATUS_FALLING + * @arg @ref FL_SVD_POWER_STATUS_RISING + */ +__STATIC_INLINE uint32_t FL_SVD_GetCurrentPowerStatus(SVD_Type *SVDx) +{ + return (uint32_t)(READ_BIT(SVDx->ISR, SVD_ISR_SVDO_Msk)); +} + +/** + * @brief Get SVD Latched Power Status + * @rmtoll ISR SVDR FL_SVD_GetLatchedPowerStatus + * @param SVDx SVD instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_SVD_LATCHED_POWER_STATUS_FALLING + * @arg @ref FL_SVD_LATCHED_POWER_STATUS_RISING + */ +__STATIC_INLINE uint32_t FL_SVD_GetLatchedPowerStatus(SVD_Type *SVDx) +{ + return (uint32_t)(READ_BIT(SVDx->ISR, SVD_ISR_SVDR_Msk)); +} + +/** + * @brief Get SVD Power Fall Flag + * @rmtoll ISR PFF FL_SVD_IsActiveFlag_PowerFall + * @param SVDx SVD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SVD_IsActiveFlag_PowerFall(SVD_Type *SVDx) +{ + return (uint32_t)(READ_BIT(SVDx->ISR, SVD_ISR_PFF_Msk) == (SVD_ISR_PFF_Msk)); +} + +/** + * @brief Clear SVD Power Fall Flag + * @rmtoll ISR PFF FL_SVD_ClearFlag_PowerFall + * @param SVDx SVD instance + * @retval None + */ +__STATIC_INLINE void FL_SVD_ClearFlag_PowerFall(SVD_Type *SVDx) +{ + WRITE_REG(SVDx->ISR, SVD_ISR_PFF_Msk); +} + +/** + * @brief Get SVD Power Rise Flag + * @rmtoll ISR PRF FL_SVD_IsActiveFlag_PowerRise + * @param SVDx SVD instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SVD_IsActiveFlag_PowerRise(SVD_Type *SVDx) +{ + return (uint32_t)(READ_BIT(SVDx->ISR, SVD_ISR_PRF_Msk) == (SVD_ISR_PRF_Msk)); +} + +/** + * @brief Clear SVD Power Rise Flag + * @rmtoll ISR PRF FL_SVD_ClearFlag_PowerRise + * @param SVDx SVD instance + * @retval None + */ +__STATIC_INLINE void FL_SVD_ClearFlag_PowerRise(SVD_Type *SVDx) +{ + WRITE_REG(SVDx->ISR, SVD_ISR_PRF_Msk); +} + +/** + * @brief Enable SVD Reference + * @rmtoll VSR EN FL_SVD_EnableReference + * @param SVDx SVD instance + * @param ref This parameter can be one of the following values: + * @arg @ref FL_SVD_REFERENCE_1P0V + * @arg @ref FL_SVD_REFERENCE_0P95V + * @arg @ref FL_SVD_REFERENCE_0P9V + * @retval None + */ +__STATIC_INLINE void FL_SVD_EnableReference(SVD_Type *SVDx, uint32_t ref) +{ + WRITE_REG(SVDx->VSR, ((ref & 0x7) << 0x0U)); +} + +/** + * @brief Get SVD Reference Enable Status + * @rmtoll VSR EN FL_SVD_IsEnabledReference + * @param SVDx SVD instance + * @param ref This parameter can be one of the following values: + * @arg @ref FL_SVD_REFERENCE_1P0V + * @arg @ref FL_SVD_REFERENCE_0P95V + * @arg @ref FL_SVD_REFERENCE_0P9V + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_SVD_IsEnabledReference(SVD_Type *SVDx, uint32_t ref) +{ + return (uint32_t)(READ_BIT(SVDx->VSR, ((ref & 0x7) << 0x0U)) == ((ref & 0x7) << 0x0U)); +} + +/** + * @brief Disable SVD Reference + * @rmtoll VSR EN FL_SVD_DisableReference + * @param SVDx SVD instance + * @param ref This parameter can be one of the following values: + * @arg @ref FL_SVD_REFERENCE_1P0V + * @arg @ref FL_SVD_REFERENCE_0P95V + * @arg @ref FL_SVD_REFERENCE_0P9V + * @retval None + */ +__STATIC_INLINE void FL_SVD_DisableReference(SVD_Type *SVDx, uint32_t ref) +{ + CLEAR_BIT(SVDx->VSR, ((ref & 0x7) << 0x0U)); +} + +/** + * @} + */ + +/** @defgroup SVD_FL_EF_Init Initialization and de-initialization functions + * @{ + */ + +FL_ErrorStatus FL_SVD_DeInit(SVD_Type *SVDx); +FL_ErrorStatus FL_SVD_Init(SVD_Type *SVDx, FL_SVD_InitTypeDef *init); +void FL_SVD_StructInit(FL_SVD_InitTypeDef *init); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_SVD_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-22*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_uart.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_uart.h new file mode 100644 index 0000000..7b4db2d --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_uart.h @@ -0,0 +1,1291 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_uart.h + * @author FMSH Application Team + * @brief Head file of UART FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_UART_H +#define __FM33LG0XX_FL_UART_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup UART UART + * @brief UART FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup UART_FL_ES_INIT UART Exported Init structures + * @{ + */ + +/** + * @brief FL UART Init Sturcture definition + */ +typedef struct +{ + /*! 时钟源选择 */ + uint32_t clockSrc; + /*! 通信波特率 */ + uint32_t baudRate; + /*! 数据宽度 */ + uint32_t dataWidth; + /*! 停止位 */ + uint32_t stopBits; + /*! 奇偶校验位 */ + uint32_t parity; + /*! 传输反向 */ + uint32_t transferDirection; + +} FL_UART_InitTypeDef; + +typedef struct +{ + /*! 调制极性默认bit1调制 */ + uint32_t polarity; + /*! 红外调制占空比 */ + uint32_t modulationDuty; + /*! 红外调制频率*/ + uint32_t modulationFrequency; + +} FL_UART_InfraRed_InitTypeDef; + +#define FL_UART_DIRECTION_NONE 0x00000000U +#define FL_UART_DIRECTION_RX UART_CSR_RXEN +#define FL_UART_DIRECTION_TX UART_CSR_TXEN +#define FL_UART_DIRECTION_TX_RX (UART_CSR_RXEN | UART_CSR_TXEN) +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup UART_FL_Exported_Constants UART Exported Constants + * @{ + */ + +#define UART_IRCR_IRFLAG_Pos (15U) +#define UART_IRCR_IRFLAG_Msk (0x1U << UART_IRCR_IRFLAG_Pos) +#define UART_IRCR_IRFLAG UART_IRCR_IRFLAG_Msk + +#define UART_IRCR_TH_Pos (11U) +#define UART_IRCR_TH_Msk (0xfU << UART_IRCR_TH_Pos) +#define UART_IRCR_TH UART_IRCR_TH_Msk + +#define UART_IRCR_TZBRG_Pos (0U) +#define UART_IRCR_TZBRG_Msk (0x7ffU << UART_IRCR_TZBRG_Pos) +#define UART_IRCR_TZBRG UART_IRCR_TZBRG_Msk + +#define UART_CSR_BUSY_Pos (24U) +#define UART_CSR_BUSY_Msk (0x1U << UART_CSR_BUSY_Pos) +#define UART_CSR_BUSY UART_CSR_BUSY_Msk + +#define UART_CSR_TXIREN_Pos (17U) +#define UART_CSR_TXIREN_Msk (0x1U << UART_CSR_TXIREN_Pos) +#define UART_CSR_TXIREN UART_CSR_TXIREN_Msk + +#define UART_CSR_RXTOEN_Pos (16U) +#define UART_CSR_RXTOEN_Msk (0x1U << UART_CSR_RXTOEN_Pos) +#define UART_CSR_RXTOEN UART_CSR_RXTOEN_Msk + +#define UART_CSR_OVSM_Pos (13U) +#define UART_CSR_OVSM_Msk (0x1U << UART_CSR_OVSM_Pos) +#define UART_CSR_OVSM UART_CSR_OVSM_Msk + +#define UART_CSR_IOSWAP_Pos (12U) +#define UART_CSR_IOSWAP_Msk (0x1U << UART_CSR_IOSWAP_Pos) +#define UART_CSR_IOSWAP UART_CSR_IOSWAP_Msk + +#define UART_CSR_NEWUP_Pos (11U) +#define UART_CSR_NEWUP_Msk (0x1U << UART_CSR_NEWUP_Pos) +#define UART_CSR_NEWUP UART_CSR_NEWUP_Msk + +#define UART_CSR_DMATXIFCFG_Pos (10U) +#define UART_CSR_DMATXIFCFG_Msk (0x1U << UART_CSR_DMATXIFCFG_Pos) +#define UART_CSR_DMATXIFCFG UART_CSR_DMATXIFCFG_Msk + +#define UART_CSR_BITORD_Pos (9U) +#define UART_CSR_BITORD_Msk (0x1U << UART_CSR_BITORD_Pos) +#define UART_CSR_BITORD UART_CSR_BITORD_Msk + +#define UART_CSR_STOPCFG_Pos (8U) +#define UART_CSR_STOPCFG_Msk (0x1U << UART_CSR_STOPCFG_Pos) +#define UART_CSR_STOPCFG UART_CSR_STOPCFG_Msk + +#define UART_CSR_PDSEL_Pos (6U) +#define UART_CSR_PDSEL_Msk (0x3U << UART_CSR_PDSEL_Pos) +#define UART_CSR_PDSEL UART_CSR_PDSEL_Msk + +#define UART_CSR_PARITY_Pos (4U) +#define UART_CSR_PARITY_Msk (0x3U << UART_CSR_PARITY_Pos) +#define UART_CSR_PARITY UART_CSR_PARITY_Msk + +#define UART_CSR_RXPOL_Pos (3U) +#define UART_CSR_RXPOL_Msk (0x1U << UART_CSR_RXPOL_Pos) +#define UART_CSR_RXPOL UART_CSR_RXPOL_Msk + +#define UART_CSR_TXPOL_Pos (2U) +#define UART_CSR_TXPOL_Msk (0x1U << UART_CSR_TXPOL_Pos) +#define UART_CSR_TXPOL UART_CSR_TXPOL_Msk + +#define UART_CSR_RXEN_Pos (1U) +#define UART_CSR_RXEN_Msk (0x1U << UART_CSR_RXEN_Pos) +#define UART_CSR_RXEN UART_CSR_RXEN_Msk + +#define UART_CSR_TXEN_Pos (0U) +#define UART_CSR_TXEN_Msk (0x1U << UART_CSR_TXEN_Pos) +#define UART_CSR_TXEN UART_CSR_TXEN_Msk + +#define UART_IER_RXTOIE_Pos (11U) +#define UART_IER_RXTOIE_Msk (0x1U << UART_IER_RXTOIE_Pos) +#define UART_IER_RXTOIE UART_IER_RXTOIE_Msk + +#define UART_IER_RXERRIE_Pos (10U) +#define UART_IER_RXERRIE_Msk (0x1U << UART_IER_RXERRIE_Pos) +#define UART_IER_RXERRIE UART_IER_RXERRIE_Msk + +#define UART_IER_RXBFIE_Pos (8U) +#define UART_IER_RXBFIE_Msk (0x1U << UART_IER_RXBFIE_Pos) +#define UART_IER_RXBFIE UART_IER_RXBFIE_Msk + +#define UART_IER_NEWUPIE_Pos (7U) +#define UART_IER_NEWUPIE_Msk (0x1U << UART_IER_NEWUPIE_Pos) +#define UART_IER_NEWUPIE UART_IER_NEWUPIE_Msk + +#define UART_IER_TXBEIE_Pos (1U) +#define UART_IER_TXBEIE_Msk (0x1U << UART_IER_TXBEIE_Pos) +#define UART_IER_TXBEIE UART_IER_TXBEIE_Msk + +#define UART_IER_TXSEIE_Pos (0U) +#define UART_IER_TXSEIE_Msk (0x1U << UART_IER_TXSEIE_Pos) +#define UART_IER_TXSEIE UART_IER_TXSEIE_Msk + +#define UART_ISR_PERR_Pos (18U) +#define UART_ISR_PERR_Msk (0x1U << UART_ISR_PERR_Pos) +#define UART_ISR_PERR UART_ISR_PERR_Msk + +#define UART_ISR_FERR_Pos (17U) +#define UART_ISR_FERR_Msk (0x1U << UART_ISR_FERR_Pos) +#define UART_ISR_FERR UART_ISR_FERR_Msk + +#define UART_ISR_OERR_Pos (16U) +#define UART_ISR_OERR_Msk (0x1U << UART_ISR_OERR_Pos) +#define UART_ISR_OERR UART_ISR_OERR_Msk + +#define UART_ISR_RXTO_Pos (11U) +#define UART_ISR_RXTO_Msk (0x1U << UART_ISR_RXTO_Pos) +#define UART_ISR_RXTO UART_ISR_RXTO_Msk + +#define UART_ISR_RXBF_Pos (8U) +#define UART_ISR_RXBF_Msk (0x1U << UART_ISR_RXBF_Pos) +#define UART_ISR_RXBF UART_ISR_RXBF_Msk + +#define UART_ISR_NEWKF_Pos (7U) +#define UART_ISR_NEWKF_Msk (0x1U << UART_ISR_NEWKF_Pos) +#define UART_ISR_NEWKF UART_ISR_NEWKF_Msk + +#define UART_ISR_TXOERR_Pos (2U) +#define UART_ISR_TXOERR_Msk (0x1U << UART_ISR_TXOERR_Pos) +#define UART_ISR_TXOERR UART_ISR_TXOERR_Msk + +#define UART_ISR_TXBE_Pos (1U) +#define UART_ISR_TXBE_Msk (0x1U << UART_ISR_TXBE_Pos) +#define UART_ISR_TXBE UART_ISR_TXBE_Msk + +#define UART_ISR_TXSE_Pos (0U) +#define UART_ISR_TXSE_Msk (0x1U << UART_ISR_TXSE_Pos) +#define UART_ISR_TXSE UART_ISR_TXSE_Msk + +#define UART_TODR_TXDLY_LEN_Pos (8U) +#define UART_TODR_TXDLY_LEN_Msk (0xffU << UART_TODR_TXDLY_LEN_Pos) +#define UART_TODR_TXDLY_LEN UART_TODR_TXDLY_LEN_Msk + +#define UART_TODR_RXTO_LEN_Pos (0U) +#define UART_TODR_RXTO_LEN_Msk (0xffU << UART_TODR_RXTO_LEN_Pos) +#define UART_TODR_RXTO_LEN UART_TODR_RXTO_LEN_Msk + + +#define FL_UART_INFRARED_POLARITY_NORMAL (0x0U << UART_IRCR_IRFLAG_Pos) +#define FL_UART_INFRARED_POLARITY_INVERT (0x1U << UART_IRCR_IRFLAG_Pos) + + +#define FL_UART_OVERSAMPLING_16 (0x0U << UART_CSR_OVSM_Pos) +#define FL_UART_OVERSAMPLING_8 (0x1U << UART_CSR_OVSM_Pos) + + +#define FL_UART_TXIF_MODE_ALWAYS (0x0U << UART_CSR_DMATXIFCFG_Pos) +#define FL_UART_TXIF_MODE_AFTER_DMA (0x1U << UART_CSR_DMATXIFCFG_Pos) + + +#define FL_UART_BIT_ORDER_LSB_FIRST (0x0U << UART_CSR_BITORD_Pos) +#define FL_UART_BIT_ORDER_MSB_FIRST (0x1U << UART_CSR_BITORD_Pos) + + +#define FL_UART_STOP_BIT_WIDTH_1B (0x0U << UART_CSR_STOPCFG_Pos) +#define FL_UART_STOP_BIT_WIDTH_2B (0x1U << UART_CSR_STOPCFG_Pos) + + +#define FL_UART_DATA_WIDTH_7B (0x0U << UART_CSR_PDSEL_Pos) +#define FL_UART_DATA_WIDTH_8B (0x1U << UART_CSR_PDSEL_Pos) +#define FL_UART_DATA_WIDTH_9B (0x2U << UART_CSR_PDSEL_Pos) +#define FL_UART_DATA_WIDTH_6B (0x3U << UART_CSR_PDSEL_Pos) + + +#define FL_UART_PARITY_NONE (0x0U << UART_CSR_PARITY_Pos) +#define FL_UART_PARITY_EVEN (0x1U << UART_CSR_PARITY_Pos) +#define FL_UART_PARITY_ODD (0x2U << UART_CSR_PARITY_Pos) + + +#define FL_UART_RX_POLARITY_NORMAL (0x0U << UART_CSR_RXPOL_Pos) +#define FL_UART_RX_POLARITY_INVERT (0x1U << UART_CSR_RXPOL_Pos) + + +#define FL_UART_TX_POLARITY_NORMAL (0x0U << UART_CSR_TXPOL_Pos) +#define FL_UART_TX_POLARITY_INVERT (0x1U << UART_CSR_TXPOL_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup UART_FL_Exported_Functions UART Exported Functions + * @{ + */ + +/** + * @brief Set Infrared Polarity + * @rmtoll IRCR IRFLAG FL_UART_SetIRPolarity + * @param UART_Common UART_Common instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_UART_INFRARED_POLARITY_NORMAL + * @arg @ref FL_UART_INFRARED_POLARITY_INVERT + * @retval None + */ +__STATIC_INLINE void FL_UART_SetIRPolarity(UART_COMMON_Type *UART_Common, uint32_t polarity) +{ + MODIFY_REG(UART_Common->IRCR, UART_IRCR_IRFLAG_Msk, polarity); +} + +/** + * @brief Get Infrared Polarity + * @rmtoll IRCR IRFLAG FL_UART_GetIRPolarity + * @param UART_Common UART_Common instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_UART_INFRARED_POLARITY_NORMAL + * @arg @ref FL_UART_INFRARED_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_UART_GetIRPolarity(UART_COMMON_Type *UART_Common) +{ + return (uint32_t)(READ_BIT(UART_Common->IRCR, UART_IRCR_IRFLAG_Msk)); +} + +/** + * @brief Set Infrared Modulation Duty + * @rmtoll IRCR TH FL_UART_WriteIRModulationDuty + * @param UART_Common UART_Common instance + * @param duty + * @retval None + */ +__STATIC_INLINE void FL_UART_WriteIRModulationDuty(UART_COMMON_Type *UART_Common, uint32_t duty) +{ + MODIFY_REG(UART_Common->IRCR, (0xfU << 11U), (duty << 11U)); +} + +/** + * @brief Get Infrared Modulation Duty + * @rmtoll IRCR TH FL_UART_ReadIRModulationDuty + * @param UART_Common UART_Common instance + * @retval + */ +__STATIC_INLINE uint32_t FL_UART_ReadIRModulationDuty(UART_COMMON_Type *UART_Common) +{ + return (uint32_t)(READ_BIT(UART_Common->IRCR, (0xfU << 11U)) >> 11U); +} + +/** + * @brief Set Infrared Modulation Frequency + * @rmtoll IRCR TZBRG FL_UART_WriteIRModulationFrequency + * @param UART_Common UART_Common instance + * @param freq + * @retval None + */ +__STATIC_INLINE void FL_UART_WriteIRModulationFrequency(UART_COMMON_Type *UART_Common, uint32_t freq) +{ + MODIFY_REG(UART_Common->IRCR, (0x7ffU << 0U), (freq << 0U)); +} + +/** + * @brief Get Infrared Modulation Frequency + * @rmtoll IRCR TZBRG FL_UART_ReadIRModulationFrequency + * @param UART_Common UART_Common instance + * @retval + */ +__STATIC_INLINE uint32_t FL_UART_ReadIRModulationFrequency(UART_COMMON_Type *UART_Common) +{ + return (uint32_t)(READ_BIT(UART_Common->IRCR, (0x7ffU << 0U)) >> 0U); +} + +/** + * @brief Get UART Busy Flag + * @rmtoll CSR BUSY FL_UART_IsActiveFlag_Busy + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsActiveFlag_Busy(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_BUSY_Msk) == (UART_CSR_BUSY_Msk)); +} + +/** + * @brief Enable UART Infrared Modulation + * @rmtoll CSR TXIREN FL_UART_EnableIRModulation + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_EnableIRModulation(UART_Type *UARTx) +{ + SET_BIT(UARTx->CSR, UART_CSR_TXIREN_Msk); +} + +/** + * @brief Disable UART Infrared Modulation + * @rmtoll CSR TXIREN FL_UART_DisableIRModulation + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_DisableIRModulation(UART_Type *UARTx) +{ + CLEAR_BIT(UARTx->CSR, UART_CSR_TXIREN_Msk); +} + +/** + * @brief Get UART Infrared Modulation Enable Status + * @rmtoll CSR TXIREN FL_UART_IsEnabledIRModulation + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsEnabledIRModulation(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_TXIREN_Msk) == UART_CSR_TXIREN_Msk); +} + +/** + * @brief Enable UART Receive Time-Out Function + * @rmtoll CSR RXTOEN FL_UART_EnableRXTimeout + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_EnableRXTimeout(UART_Type *UARTx) +{ + SET_BIT(UARTx->CSR, UART_CSR_RXTOEN_Msk); +} + +/** + * @brief Disable UART Receive Time-Out Function + * @rmtoll CSR RXTOEN FL_UART_DisableRXTimeout + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_DisableRXTimeout(UART_Type *UARTx) +{ + CLEAR_BIT(UARTx->CSR, UART_CSR_RXTOEN_Msk); +} + +/** + * @brief Get UART Receive Time-Out Function Enable Status + * @rmtoll CSR RXTOEN FL_UART_IsEnabledRXTimeout + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsEnabledRXTimeout(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_RXTOEN_Msk) == UART_CSR_RXTOEN_Msk); +} + +/** + * @brief Set Oversampling Mode + * @rmtoll CSR OVSM FL_UART_SetOverSampling + * @param UARTx UART instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_UART_OVERSAMPLING_16 + * @arg @ref FL_UART_OVERSAMPLING_8 + * @retval None + */ +__STATIC_INLINE void FL_UART_SetOverSampling(UART_Type *UARTx, uint32_t mode) +{ + MODIFY_REG(UARTx->CSR, UART_CSR_OVSM_Msk, mode); +} + +/** + * @brief Get Oversampling Mode + * @rmtoll CSR OVSM FL_UART_GetOverSampling + * @param UARTx UART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_UART_OVERSAMPLING_16 + * @arg @ref FL_UART_OVERSAMPLING_8 + */ +__STATIC_INLINE uint32_t FL_UART_GetOverSampling(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_OVSM_Msk)); +} + +/** + * @brief Enable UART Pin Swap Between UART TX Pin and RX Pin + * @rmtoll CSR IOSWAP FL_UART_EnablePinSwap + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_EnablePinSwap(UART_Type *UARTx) +{ + SET_BIT(UARTx->CSR, UART_CSR_IOSWAP_Msk); +} + +/** + * @brief Disable UART Pin Swap Between UART TX Pin and RX Pin + * @rmtoll CSR IOSWAP FL_UART_DisablePinSwap + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_DisablePinSwap(UART_Type *UARTx) +{ + CLEAR_BIT(UARTx->CSR, UART_CSR_IOSWAP_Msk); +} + +/** + * @brief Get UART Pin Swap Enable Status Between UART TX Pin and RX Pin + * @rmtoll CSR IOSWAP FL_UART_IsEnabledPinSwap + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsEnabledPinSwap(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_IOSWAP_Msk) == UART_CSR_IOSWAP_Msk); +} + +/** + * @brief Enable UART Negtive Edge Wakeup Function + * @rmtoll CSR NEWUP FL_UART_EnableFallingEdgeWakeup + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_EnableFallingEdgeWakeup(UART_Type *UARTx) +{ + SET_BIT(UARTx->CSR, UART_CSR_NEWUP_Msk); +} + +/** + * @brief Disable UART Negtive Edge Wakeup Function + * @rmtoll CSR NEWUP FL_UART_DisableFallingEdgeWakeup + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_DisableFallingEdgeWakeup(UART_Type *UARTx) +{ + CLEAR_BIT(UARTx->CSR, UART_CSR_NEWUP_Msk); +} + +/** + * @brief Get UART Negtive Edge Wakeup Function Enable Status + * @rmtoll CSR NEWUP FL_UART_IsEnabledFallingEdgeWakeup + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsEnabledFallingEdgeWakeup(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_NEWUP_Msk) == UART_CSR_NEWUP_Msk); +} + +/** + * @brief Enable UART DMA Transmit Finish Interrupt + * @rmtoll CSR DMATXIFCFG FL_UART_SetTXIFMode + * @param UARTx UART instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_UART_TXIF_MODE_ALWAYS + * @arg @ref FL_UART_TXIF_MODE_AFTER_DMA + * @retval None + */ +__STATIC_INLINE void FL_UART_SetTXIFMode(UART_Type *UARTx, uint32_t mode) +{ + MODIFY_REG(UARTx->CSR, UART_CSR_DMATXIFCFG_Msk, mode); +} + +/** + * @brief Disable UART DMA Transmit Finish Interrupt + * @rmtoll CSR DMATXIFCFG FL_UART_GetTXIFMode + * @param UARTx UART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_UART_TXIF_MODE_ALWAYS + * @arg @ref FL_UART_TXIF_MODE_AFTER_DMA + */ +__STATIC_INLINE uint32_t FL_UART_GetTXIFMode(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_DMATXIFCFG_Msk)); +} + +/** + * @brief Set UART Transfer Bit Order + * @rmtoll CSR BITORD FL_UART_SetBitOrder + * @param UARTx UART instance + * @param order This parameter can be one of the following values: + * @arg @ref FL_UART_BIT_ORDER_LSB_FIRST + * @arg @ref FL_UART_BIT_ORDER_MSB_FIRST + * @retval None + */ +__STATIC_INLINE void FL_UART_SetBitOrder(UART_Type *UARTx, uint32_t order) +{ + MODIFY_REG(UARTx->CSR, UART_CSR_BITORD_Msk, order); +} + +/** + * @brief Get UART Transfer Bit Order + * @rmtoll CSR BITORD FL_UART_GetBitOrder + * @param UARTx UART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_UART_BIT_ORDER_LSB_FIRST + * @arg @ref FL_UART_BIT_ORDER_MSB_FIRST + */ +__STATIC_INLINE uint32_t FL_UART_GetBitOrder(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_BITORD_Msk)); +} + +/** + * @brief Set UART Stop Bits Length + * @rmtoll CSR STOPCFG FL_UART_SetStopBitsWidth + * @param UARTx UART instance + * @param length This parameter can be one of the following values: + * @arg @ref FL_UART_STOP_BIT_WIDTH_1B + * @arg @ref FL_UART_STOP_BIT_WIDTH_2B + * @retval None + */ +__STATIC_INLINE void FL_UART_SetStopBitsWidth(UART_Type *UARTx, uint32_t length) +{ + MODIFY_REG(UARTx->CSR, UART_CSR_STOPCFG_Msk, length); +} + +/** + * @brief Get UART Stop Bits Length + * @rmtoll CSR STOPCFG FL_UART_GetStopBitsWidth + * @param UARTx UART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_UART_STOP_BIT_WIDTH_1B + * @arg @ref FL_UART_STOP_BIT_WIDTH_2B + */ +__STATIC_INLINE uint32_t FL_UART_GetStopBitsWidth(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_STOPCFG_Msk)); +} + +/** + * @brief Set UART Data Width + * @rmtoll CSR PDSEL FL_UART_SetDataWidth + * @param UARTx UART instance + * @param dataWidth This parameter can be one of the following values: + * @arg @ref FL_UART_DATA_WIDTH_7B + * @arg @ref FL_UART_DATA_WIDTH_8B + * @arg @ref FL_UART_DATA_WIDTH_9B + * @arg @ref FL_UART_DATA_WIDTH_6B + * @retval None + */ +__STATIC_INLINE void FL_UART_SetDataWidth(UART_Type *UARTx, uint32_t dataWidth) +{ + MODIFY_REG(UARTx->CSR, UART_CSR_PDSEL_Msk, dataWidth); +} + +/** + * @brief Get UART Data Width + * @rmtoll CSR PDSEL FL_UART_GetDataWidth + * @param UARTx UART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_UART_DATA_WIDTH_7B + * @arg @ref FL_UART_DATA_WIDTH_8B + * @arg @ref FL_UART_DATA_WIDTH_9B + * @arg @ref FL_UART_DATA_WIDTH_6B + */ +__STATIC_INLINE uint32_t FL_UART_GetDataWidth(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_PDSEL_Msk)); +} + +/** + * @brief Set UART Parity + * @rmtoll CSR PARITY FL_UART_SetParity + * @param UARTx UART instance + * @param parity This parameter can be one of the following values: + * @arg @ref FL_UART_PARITY_NONE + * @arg @ref FL_UART_PARITY_EVEN + * @arg @ref FL_UART_PARITY_ODD + * @retval None + */ +__STATIC_INLINE void FL_UART_SetParity(UART_Type *UARTx, uint32_t parity) +{ + MODIFY_REG(UARTx->CSR, UART_CSR_PARITY_Msk, parity); +} + +/** + * @brief Get UART Parity + * @rmtoll CSR PARITY FL_UART_GetParity + * @param UARTx UART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_UART_PARITY_NONE + * @arg @ref FL_UART_PARITY_EVEN + * @arg @ref FL_UART_PARITY_ODD + */ +__STATIC_INLINE uint32_t FL_UART_GetParity(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_PARITY_Msk)); +} + +/** + * @brief Set UART Receive Polarity + * @rmtoll CSR RXPOL FL_UART_SetRXPolarity + * @param UARTx UART instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_UART_RX_POLARITY_NORMAL + * @arg @ref FL_UART_RX_POLARITY_INVERT + * @retval None + */ +__STATIC_INLINE void FL_UART_SetRXPolarity(UART_Type *UARTx, uint32_t polarity) +{ + MODIFY_REG(UARTx->CSR, UART_CSR_RXPOL_Msk, polarity); +} + +/** + * @brief Get UART Receive Polarity + * @rmtoll CSR RXPOL FL_UART_GetRXPolarity + * @param UARTx UART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_UART_RX_POLARITY_NORMAL + * @arg @ref FL_UART_RX_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_UART_GetRXPolarity(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_RXPOL_Msk)); +} + +/** + * @brief Set UART Transmit Polarity + * @rmtoll CSR TXPOL FL_UART_SetTXPolarity + * @param UARTx UART instance + * @param polarity This parameter can be one of the following values: + * @arg @ref FL_UART_TX_POLARITY_NORMAL + * @arg @ref FL_UART_TX_POLARITY_INVERT + * @retval None + */ +__STATIC_INLINE void FL_UART_SetTXPolarity(UART_Type *UARTx, uint32_t polarity) +{ + MODIFY_REG(UARTx->CSR, UART_CSR_TXPOL_Msk, polarity); +} + +/** + * @brief Get UART Transmit Polarity + * @rmtoll CSR TXPOL FL_UART_GetTXPolarity + * @param UARTx UART instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_UART_TX_POLARITY_NORMAL + * @arg @ref FL_UART_TX_POLARITY_INVERT + */ +__STATIC_INLINE uint32_t FL_UART_GetTXPolarity(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_TXPOL_Msk)); +} + +/** + * @brief Enable UART Receive + * @rmtoll CSR RXEN FL_UART_EnableRX + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_EnableRX(UART_Type *UARTx) +{ + SET_BIT(UARTx->CSR, UART_CSR_RXEN_Msk); +} + +/** + * @brief Disable UART Receive + * @rmtoll CSR RXEN FL_UART_DisableRX + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_DisableRX(UART_Type *UARTx) +{ + CLEAR_BIT(UARTx->CSR, UART_CSR_RXEN_Msk); +} + +/** + * @brief Get UART Receive Enable Status + * @rmtoll CSR RXEN FL_UART_IsEnabledRX + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsEnabledRX(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_RXEN_Msk) == UART_CSR_RXEN_Msk); +} + +/** + * @brief Enable UART Transmit + * @rmtoll CSR TXEN FL_UART_EnableTX + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_EnableTX(UART_Type *UARTx) +{ + SET_BIT(UARTx->CSR, UART_CSR_TXEN_Msk); +} + +/** + * @brief Disable UART Receive + * @rmtoll CSR TXEN FL_UART_DisableTX + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_DisableTX(UART_Type *UARTx) +{ + CLEAR_BIT(UARTx->CSR, UART_CSR_TXEN_Msk); +} + +/** + * @brief Get UART Receive Enable Status + * @rmtoll CSR TXEN FL_UART_IsEnabledTX + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsEnabledTX(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->CSR, UART_CSR_TXEN_Msk) == UART_CSR_TXEN_Msk); +} + +/** + * @brief Enable UART Receive Time-Out Interrupt + * @rmtoll IER RXTOIE FL_UART_EnableIT_RXTimeout + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_EnableIT_RXTimeout(UART_Type *UARTx) +{ + SET_BIT(UARTx->IER, UART_IER_RXTOIE_Msk); +} + +/** + * @brief Disable UART Receive Time-Out Interrupt + * @rmtoll IER RXTOIE FL_UART_DisableIT_RXTimeout + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_DisableIT_RXTimeout(UART_Type *UARTx) +{ + CLEAR_BIT(UARTx->IER, UART_IER_RXTOIE_Msk); +} + +/** + * @brief Get UART Receive Time-Out Interrupt Enable Status + * @rmtoll IER RXTOIE FL_UART_IsEnabledIT_RXTimeout + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsEnabledIT_RXTimeout(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->IER, UART_IER_RXTOIE_Msk) == UART_IER_RXTOIE_Msk); +} + +/** + * @brief Enable UART Receive Error Interrupt + * @rmtoll IER RXERRIE FL_UART_EnableIT_RXError + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_EnableIT_RXError(UART_Type *UARTx) +{ + SET_BIT(UARTx->IER, UART_IER_RXERRIE_Msk); +} + +/** + * @brief Disable UART Receive Error Interrupt + * @rmtoll IER RXERRIE FL_UART_DisableIT_RXError + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_DisableIT_RXError(UART_Type *UARTx) +{ + CLEAR_BIT(UARTx->IER, UART_IER_RXERRIE_Msk); +} + +/** + * @brief Get UART Receive Error Interrupt Enable Status + * @rmtoll IER RXERRIE FL_UART_IsEnabledIT_RXError + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsEnabledIT_RXError(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->IER, UART_IER_RXERRIE_Msk) == UART_IER_RXERRIE_Msk); +} + +/** + * @brief Enable UART Receive Buffer Full Interrupt + * @rmtoll IER RXBFIE FL_UART_EnableIT_RXBuffFull + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_EnableIT_RXBuffFull(UART_Type *UARTx) +{ + SET_BIT(UARTx->IER, UART_IER_RXBFIE_Msk); +} + +/** + * @brief Disable UART Receive Buffer Full Interrupt + * @rmtoll IER RXBFIE FL_UART_DisableIT_RXBuffFull + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_DisableIT_RXBuffFull(UART_Type *UARTx) +{ + CLEAR_BIT(UARTx->IER, UART_IER_RXBFIE_Msk); +} + +/** + * @brief Get UART Receive Buffer Full Interrupt Enable Status + * @rmtoll IER RXBFIE FL_UART_IsEnabledIT_RXBuffFull + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsEnabledIT_RXBuffFull(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->IER, UART_IER_RXBFIE_Msk) == UART_IER_RXBFIE_Msk); +} + +/** + * @brief Enable UART Negedge Wakeup Interrupt + * @rmtoll IER NEWUPIE FL_UART_EnableIT_FallingEdgeWakeup + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_EnableIT_FallingEdgeWakeup(UART_Type *UARTx) +{ + SET_BIT(UARTx->IER, UART_IER_NEWUPIE_Msk); +} + +/** + * @brief Disable UART Negedge Wakeup Interrupt + * @rmtoll IER NEWUPIE FL_UART_DisableIT_FallingEdgeWakeup + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_DisableIT_FallingEdgeWakeup(UART_Type *UARTx) +{ + CLEAR_BIT(UARTx->IER, UART_IER_NEWUPIE_Msk); +} + +/** + * @brief Get UART Negedge Wakeup Interrupt Enable Status + * @rmtoll IER NEWUPIE FL_UART_IsEnabledIT_FallingEdgeWakeup + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsEnabledIT_FallingEdgeWakeup(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->IER, UART_IER_NEWUPIE_Msk) == UART_IER_NEWUPIE_Msk); +} + +/** + * @brief Enable UART Transmit Buffer Empty Interrupt + * @rmtoll IER TXBEIE FL_UART_EnableIT_TXBuffEmpty + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_EnableIT_TXBuffEmpty(UART_Type *UARTx) +{ + SET_BIT(UARTx->IER, UART_IER_TXBEIE_Msk); +} + +/** + * @brief Disable UART Transmit Buffer Empty Interrupt + * @rmtoll IER TXBEIE FL_UART_DisableIT_TXBuffEmpty + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_DisableIT_TXBuffEmpty(UART_Type *UARTx) +{ + CLEAR_BIT(UARTx->IER, UART_IER_TXBEIE_Msk); +} + +/** + * @brief Get UART Transmit Buffer Empty Interrupt Enable Status + * @rmtoll IER TXBEIE FL_UART_IsEnabledIT_TXBuffEmpty + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsEnabledIT_TXBuffEmpty(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->IER, UART_IER_TXBEIE_Msk) == UART_IER_TXBEIE_Msk); +} + +/** + * @brief Enable UART Transmit Shift Register Empty Interrupt + * @rmtoll IER TXSEIE FL_UART_EnableIT_TXShiftBuffEmpty + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_EnableIT_TXShiftBuffEmpty(UART_Type *UARTx) +{ + SET_BIT(UARTx->IER, UART_IER_TXSEIE_Msk); +} + +/** + * @brief Disable UART Transmit Shift Register Empty Interrupt + * @rmtoll IER TXSEIE FL_UART_DisableIT_TXShiftBuffEmpty + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_DisableIT_TXShiftBuffEmpty(UART_Type *UARTx) +{ + CLEAR_BIT(UARTx->IER, UART_IER_TXSEIE_Msk); +} + +/** + * @brief Get UART Transmit Shift Register Empty Interrupt Enable Status + * @rmtoll IER TXSEIE FL_UART_IsEnabledIT_TXShiftBuffEmpty + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsEnabledIT_TXShiftBuffEmpty(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->IER, UART_IER_TXSEIE_Msk) == UART_IER_TXSEIE_Msk); +} + +/** + * @brief Get UART Parity Error Flag + * @rmtoll ISR PERR FL_UART_IsActiveFlag_ParityError + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsActiveFlag_ParityError(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->ISR, UART_ISR_PERR_Msk) == (UART_ISR_PERR_Msk)); +} + +/** + * @brief Clear UART Parity Error Flag + * @rmtoll ISR PERR FL_UART_ClearFlag_ParityError + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_ClearFlag_ParityError(UART_Type *UARTx) +{ + WRITE_REG(UARTx->ISR, UART_ISR_PERR_Msk); +} + +/** + * @brief Get UART Frame Error Flag + * @rmtoll ISR FERR FL_UART_IsActiveFlag_FrameError + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsActiveFlag_FrameError(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->ISR, UART_ISR_FERR_Msk) == (UART_ISR_FERR_Msk)); +} + +/** + * @brief Clear UART Frame Error Flag + * @rmtoll ISR FERR FL_UART_ClearFlag_FrameError + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_ClearFlag_FrameError(UART_Type *UARTx) +{ + WRITE_REG(UARTx->ISR, UART_ISR_FERR_Msk); +} + +/** + * @brief Get UART RX buffer Overflow Error Flag + * @rmtoll ISR OERR FL_UART_IsActiveFlag_RXBuffOverflowError + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsActiveFlag_RXBuffOverflowError(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->ISR, UART_ISR_OERR_Msk) == (UART_ISR_OERR_Msk)); +} + +/** + * @brief Clear UART RX buffer Overflow Error Flag + * @rmtoll ISR OERR FL_UART_ClearFlag_RXBuffOverflowError + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_ClearFlag_RXBuffOverflowError(UART_Type *UARTx) +{ + WRITE_REG(UARTx->ISR, UART_ISR_OERR_Msk); +} + +/** + * @brief Get UART Receive Time-Out Flag + * @rmtoll ISR RXTO FL_UART_IsActiveFlag_RXBuffTimeout + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsActiveFlag_RXBuffTimeout(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->ISR, UART_ISR_RXTO_Msk) == (UART_ISR_RXTO_Msk)); +} + +/** + * @brief Clear UART Receive Time-Out Flag + * @rmtoll ISR RXTO FL_UART_ClearFlag_RXBuffTimeout + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_ClearFlag_RXBuffTimeout(UART_Type *UARTx) +{ + WRITE_REG(UARTx->ISR, UART_ISR_RXTO_Msk); +} + +/** + * @brief Get UART Receive Buffer Full Flag + * @rmtoll ISR RXBF FL_UART_IsActiveFlag_RXBuffFull + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsActiveFlag_RXBuffFull(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->ISR, UART_ISR_RXBF_Msk) == (UART_ISR_RXBF_Msk)); +} + +/** + * @brief Clear UART Receive Buffer Full Flag + * @rmtoll ISR RXBF FL_UART_ClearFlag_RXBuffFull + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_ClearFlag_RXBuffFull(UART_Type *UARTx) +{ + WRITE_REG(UARTx->ISR, UART_ISR_RXBF_Msk); +} + +/** + * @brief Get UART Negedge Wakeup Flag + * @rmtoll ISR NEWKF FL_UART_IsActiveFlag_FallingEdgeWakeup + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsActiveFlag_FallingEdgeWakeup(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->ISR, UART_ISR_NEWKF_Msk) == (UART_ISR_NEWKF_Msk)); +} + +/** + * @brief Clear UART Negedge Wakeup Flag + * @rmtoll ISR NEWKF FL_UART_ClearFlag_FallingEdgeWakeup + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_ClearFlag_FallingEdgeWakeup(UART_Type *UARTx) +{ + WRITE_REG(UARTx->ISR, UART_ISR_NEWKF_Msk); +} + +/** + * @brief Get UART TX Overflow Error Flag + * @rmtoll ISR TXOERR FL_UART_IsActiveFlag_TXBuffOverflow + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsActiveFlag_TXBuffOverflow(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->ISR, UART_ISR_TXOERR_Msk) == (UART_ISR_TXOERR_Msk)); +} + +/** + * @brief Clear UART TX Overflow Error Flag + * @rmtoll ISR TXOERR FL_UART_ClearFlag_TXBuffOverflow + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_ClearFlag_TXBuffOverflow(UART_Type *UARTx) +{ + WRITE_REG(UARTx->ISR, UART_ISR_TXOERR_Msk); +} + +/** + * @brief Get UART Transmit Buffer Empty Flag + * @rmtoll ISR TXBE FL_UART_IsActiveFlag_TXBuffEmpty + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsActiveFlag_TXBuffEmpty(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->ISR, UART_ISR_TXBE_Msk) == (UART_ISR_TXBE_Msk)); +} + +/** + * @brief Get UART Transmit Shift register Empty Flag + * @rmtoll ISR TXSE FL_UART_IsActiveFlag_TXShiftBuffEmpty + * @param UARTx UART instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_UART_IsActiveFlag_TXShiftBuffEmpty(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->ISR, UART_ISR_TXSE_Msk) == (UART_ISR_TXSE_Msk)); +} + +/** + * @brief Clear UART Transmit Shift register Empty Flag + * @rmtoll ISR TXSE FL_UART_ClearFlag_TXShiftBuffEmpty + * @param UARTx UART instance + * @retval None + */ +__STATIC_INLINE void FL_UART_ClearFlag_TXShiftBuffEmpty(UART_Type *UARTx) +{ + WRITE_REG(UARTx->ISR, UART_ISR_TXSE_Msk); +} + +/** + * @brief Set UART Transmit Delay Length + * @rmtoll TODR TXDLY_LEN FL_UART_WriteTXDelay + * @param UARTx UART instance + * @param time + * @retval None + */ +__STATIC_INLINE void FL_UART_WriteTXDelay(UART_Type *UARTx, uint32_t time) +{ + MODIFY_REG(UARTx->TODR, (0xffU << 8U), (time << 8U)); +} + +/** + * @brief Get UART Transmit Delay Length + * @rmtoll TODR TXDLY_LEN FL_UART_ReadTXDelay + * @param UARTx UART instance + * @retval + */ +__STATIC_INLINE uint32_t FL_UART_ReadTXDelay(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->TODR, (0xffU << 8U)) >> 8U); +} + +/** + * @brief Set UART Receive Time-Out Length + * @rmtoll TODR RXTO_LEN FL_UART_WriteRXTimeout + * @param UARTx UART instance + * @param time + * @retval None + */ +__STATIC_INLINE void FL_UART_WriteRXTimeout(UART_Type *UARTx, uint32_t time) +{ + MODIFY_REG(UARTx->TODR, (0xffU << 0U), (time << 0U)); +} + +/** + * @brief Get UART Receive Time-Out Length + * @rmtoll TODR RXTO_LEN FL_UART_ReadRXTimeout + * @param UARTx UART instance + * @retval + */ +__STATIC_INLINE uint32_t FL_UART_ReadRXTimeout(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->TODR, (0xffU << 0U)) >> 0U); +} + +/** + * @brief UART Receive 1 byte of data + * @rmtoll RXBUF FL_UART_ReadRXBuff + * @param UARTx UART instance + * @retval + */ +__STATIC_INLINE uint32_t FL_UART_ReadRXBuff(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->RXBUF, 0x1ffU)); +} + +/** + * @brief UART Transmit 1 byte of data + * @rmtoll TXBUF FL_UART_WriteTXBuff + * @param UARTx UART instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_UART_WriteTXBuff(UART_Type *UARTx, uint32_t data) +{ + MODIFY_REG(UARTx->TXBUF, 0x1ffU, data); +} + +/** + * @brief Set UART BaudRate + * @rmtoll BGR FL_UART_WriteBaudRate + * @param UARTx UART instance + * @param baudRate + * @retval None + */ +__STATIC_INLINE void FL_UART_WriteBaudRate(UART_Type *UARTx, uint32_t baudRate) +{ + MODIFY_REG(UARTx->BGR, (0xffffU << 0U), (baudRate << 0U)); +} + +/** + * @brief Get UART BaudRate + * @rmtoll BGR FL_UART_ReadBaudRate + * @param UARTx UART instance + * @retval + */ +__STATIC_INLINE uint32_t FL_UART_ReadBaudRate(UART_Type *UARTx) +{ + return (uint32_t)(READ_BIT(UARTx->BGR, (0xffffU << 0U)) >> 0U); +} + +/** + * @} + */ + +/** @defgroup UART_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_UART_DeInit(UART_Type *UARTx); +FL_ErrorStatus FL_UART_Init(UART_Type *UARTx, FL_UART_InitTypeDef *initStruct); +FL_ErrorStatus FL_UART_InfraRed_Init(UART_Type *UARTx, FL_UART_InfraRed_InitTypeDef *initStruct); +void FL_UART_InfraRed_StructInit(FL_UART_InfraRed_InitTypeDef *initStruct); +void FL_UART_StructInit(FL_UART_InitTypeDef *initStruct); + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_UART_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-22*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_vao.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_vao.h new file mode 100644 index 0000000..4c5862e --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_vao.h @@ -0,0 +1,645 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_vao.h + * @author FMSH Application Team + * @brief Head file of VAO FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_VAO_H +#define __FM33LG0XX_FL_VAO_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup VAO VAO + * @brief VAO FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup VAO_FL_ES_INIT VAO Exported Init structures + * @{ + */ + +/** + * @brief FL VAO Init Sturcture definition + */ + +/** +* @brief FL VAO Init Sturcture definition +*/ +typedef struct +{ + /*! PH15输入使能 */ + uint32_t input; + /*! PH15上拉使能 */ + uint32_t pullup; + /*! PH15开漏输出使能 */ + uint32_t opendrainOutput; + /*! PH15功能选择 */ + uint32_t mode; + +} FL_VAO_IO_InitTypeDef; +typedef struct +{ + /*! 驱动能力配置 */ + uint32_t driveMode; + /*! 工作电流大小*/ + uint32_t workingCurrentMode; + +} FL_VAO_XTLF_InitTypeDef; +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup VAO_FL_Exported_Constants VAO Exported Constants + * @{ + */ + +#define VAO_RSTCR_VBAT_RST_Pos (0U) +#define VAO_RSTCR_VBAT_RST_Msk (0x1U << VAO_RSTCR_VBAT_RST_Pos) +#define VAO_RSTCR_VBAT_RST VAO_RSTCR_VBAT_RST_Msk + +#define VAO_XTLFCR_XTLFEN_Pos (0U) +#define VAO_XTLFCR_XTLFEN_Msk (0xfU << VAO_XTLFCR_XTLFEN_Pos) +#define VAO_XTLFCR_XTLFEN VAO_XTLFCR_XTLFEN_Msk + +#define VAO_XTLFPR_DRVCFG_Pos (4U) +#define VAO_XTLFPR_DRVCFG_Msk (0x7U << VAO_XTLFPR_DRVCFG_Pos) +#define VAO_XTLFPR_DRVCFG VAO_XTLFPR_DRVCFG_Msk + +#define VAO_XTLFPR_XTLFIPW_Pos (0U) +#define VAO_XTLFPR_XTLFIPW_Msk (0xfU << VAO_XTLFPR_XTLFIPW_Pos) +#define VAO_XTLFPR_XTLFIPW VAO_XTLFPR_XTLFIPW_Msk + +#define VAO_FDIER_LFDET_IE_Pos (0U) +#define VAO_FDIER_LFDET_IE_Msk (0x1U << VAO_FDIER_LFDET_IE_Pos) +#define VAO_FDIER_LFDET_IE VAO_FDIER_LFDET_IE_Msk + +#define VAO_FDISR_LFDETO_Pos (1U) +#define VAO_FDISR_LFDETO_Msk (0x1U << VAO_FDISR_LFDETO_Pos) +#define VAO_FDISR_LFDETO VAO_FDISR_LFDETO_Msk + +#define VAO_FDISR_LFDETIF_Pos (0U) +#define VAO_FDISR_LFDETIF_Msk (0x1U << VAO_FDISR_LFDETIF_Pos) +#define VAO_FDISR_LFDETIF VAO_FDISR_LFDETIF_Msk + +#define VAO_INEN_PHINEN_Pos (15U) +#define VAO_INEN_PHINEN_Msk (0x1U << VAO_INEN_PHINEN_Pos) +#define VAO_INEN_PHINEN VAO_INEN_PHINEN_Msk + +#define VAO_PUEN_PHPUEN_Pos (15U) +#define VAO_PUEN_PHPUEN_Msk (0x1U << VAO_PUEN_PHPUEN_Pos) +#define VAO_PUEN_PHPUEN VAO_PUEN_PHPUEN_Msk + +#define VAO_ODEN_PHODEN_Pos (15U) +#define VAO_ODEN_PHODEN_Msk (0x1U << VAO_ODEN_PHODEN_Pos) +#define VAO_ODEN_PHODEN VAO_ODEN_PHODEN_Msk + +#define VAO_FCR_PH15FCR_Pos (30U) +#define VAO_FCR_PH15FCR_Msk (0x3U << VAO_FCR_PH15FCR_Pos) +#define VAO_FCR_PH15FCR VAO_FCR_PH15FCR_Msk + +#define VAO_DOR_PHDO_Pos (15U) +#define VAO_DOR_PHDO_Msk (0x1U << VAO_DOR_PHDO_Pos) +#define VAO_DOR_PHDO VAO_DOR_PHDO_Msk + +#define VAO_DIR_PHDIN_Pos (15U) +#define VAO_DIR_PHDIN_Msk (0x1U << VAO_DIR_PHDIN_Pos) +#define VAO_DIR_PHDIN VAO_DIR_PHDIN_Msk + +#define VAO_VILR_PHVIL15_Pos (15U) +#define VAO_VILR_PHVIL15_Msk (0x1U << VAO_VILR_PHVIL15_Pos) +#define VAO_VILR_PHVIL15 VAO_VILR_PHVIL15_Msk + + + + + + +#define FL_VAO_XTLF_ENABLE (0x5U << VAO_XTLFCR_XTLFEN_Pos) +#define FL_VAO_XTLF_DISABLE (0xaU << VAO_XTLFCR_XTLFEN_Pos) + +#define FL_VAO_XTLF_DRIVE_LEVEL_NONE (0x0U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_DRIVE_LEVEL_1 (0x1U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_DRIVE_LEVEL_2 (0x2U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_DRIVE_LEVEL_3 (0x3U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_DRIVE_LEVEL_4 (0x4U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_DRIVE_LEVEL_5 (0x5U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_DRIVE_LEVEL_6 (0x6U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_DRIVE_LEVEL_7 (0x7U << VAO_XTLFPR_DRVCFG_Pos) + +#define FL_VAO_XTLF_OUTPUT_LEVEL_NONE (0x0U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_OUTPUT_LEVEL_1 (0x1U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_OUTPUT_LEVEL_2 (0x2U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_OUTPUT_LEVEL_3 (0x3U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_OUTPUT_LEVEL_4 (0x4U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_OUTPUT_LEVEL_5 (0x5U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_OUTPUT_LEVEL_6 (0x6U << VAO_XTLFPR_DRVCFG_Pos) +#define FL_VAO_XTLF_OUTPUT_LEVEL_7 (0x7U << VAO_XTLFPR_DRVCFG_Pos) + +#define FL_VAO_XTLF_WORK_CURRENT_850NA (0x0U << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_800NA (0x1U << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_750NA (0x2U << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_700NA (0x3U << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_650NA (0x4U << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_600NA (0x5U << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_550NA (0x6U << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_500NA (0x7U << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_450NA (0x8U << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_400NA (0x9U << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_350NA (0xaU << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_300NA (0xbU << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_250NA (0xcU << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_200NA (0xdU << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_150NA (0xeU << VAO_XTLFPR_XTLFIPW_Pos) +#define FL_VAO_XTLF_WORK_CURRENT_100NA (0xfU << VAO_XTLFPR_XTLFIPW_Pos) + + +#define FL_VAO_PH15_MODE_INPUT (0x0U << VAO_FCR_PH15FCR_Pos) +#define FL_VAO_PH15_MODE_OUTPUT (0x1U << VAO_FCR_PH15FCR_Pos) +#define FL_VAO_PH15_MODE_RTCOUT (0x2U << VAO_FCR_PH15FCR_Pos) + + +#define FL_VAO_PH15_THRESHOLD_NORMAL (0x0U << VAO_VILR_PHVIL15_Pos) +#define FL_VAO_PH15_THRESHOLD_LOW (0x1U << VAO_VILR_PHVIL15_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup VAO_FL_Exported_Functions VAO Exported Functions + * @{ + */ + +/** + * @brief VBAT电源域寄存器复位使能 + * @rmtoll RSTCR VBAT_RST FL_VAO_EnableReset + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_EnableReset(VAO_Type *VAOx) +{ + SET_BIT(VAOx->RSTCR, VAO_RSTCR_VBAT_RST_Msk); +} + +/** + * @brief 获取VBAT电源域寄存器复位控制状态 + * @rmtoll RSTCR VBAT_RST FL_VAO_IsEnabledReset + * @param VAOx VAO instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VAO_IsEnabledReset(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->RSTCR, VAO_RSTCR_VBAT_RST_Msk) == VAO_RSTCR_VBAT_RST_Msk); +} + +/** + * @brief VBAT电源域寄存器复位撤销 + * @rmtoll RSTCR VBAT_RST FL_VAO_DisableReset + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_DisableReset(VAO_Type *VAOx) +{ + CLEAR_BIT(VAOx->RSTCR, VAO_RSTCR_VBAT_RST_Msk); +} + +/** + * @brief 使能XTLF + * @rmtoll XTLFCR XTLFEN FL_VAO_XTLF_Enable + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_XTLF_Enable(VAO_Type *VAOx) +{ + WRITE_REG(VAOx->XTLFCR, FL_VAO_XTLF_ENABLE); +} + +/** + * @brief 获取XTLF状态 + * @rmtoll XTLFCR XTLFEN FL_VAO_XTLF_IsEnabled + * @param VAOx VAO instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VAO_XTLF_IsEnabled(VAO_Type *VAOx) +{ + return (uint32_t)(READ_REG(VAOx->XTLFCR)); +} + +/** + * @brief 禁止XTLF + * @rmtoll XTLFCR XTLFEN FL_VAO_XTLF_Disable + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_XTLF_Disable(VAO_Type *VAOx) +{ + WRITE_REG(VAOx->XTLFCR, FL_VAO_XTLF_DISABLE); +} + +/** + * @brief 设置输出级驱动等级 + * @rmtoll XTLFPR DRVCFG FL_VAO_XTLF_SetDriveLevel + * @param VAOx VAO instance + * @param level This parameter can be one of the following values: + * @arg @ref FL_VAO_XTLF_DRIVE_LEVEL_NONE + * @arg @ref FL_VAO_XTLF_DRIVE_LEVEL_1 + * @arg @ref FL_VAO_XTLF_DRIVE_LEVEL_2 + * @arg @ref FL_VAO_XTLF_DRIVE_LEVEL_3 + * @arg @ref FL_VAO_XTLF_DRIVE_LEVEL_4 + * @arg @ref FL_VAO_XTLF_DRIVE_LEVEL_5 + * @arg @ref FL_VAO_XTLF_DRIVE_LEVEL_6 + * @arg @ref FL_VAO_XTLF_DRIVE_LEVEL_7 + * @retval None + */ +__STATIC_INLINE void FL_VAO_XTLF_SetDriveLevel(VAO_Type *VAOx, uint32_t level) +{ + MODIFY_REG(VAOx->XTLFPR, VAO_XTLFPR_DRVCFG_Msk, level); +} + +/** + * @brief Get output drive Level + * @rmtoll XTLFPR DRVCFG FL_VAO_XTLF_GetDriveLevel + * @param VAOx VAO instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_VAO_XTLF_OUTPUT_LEVEL_NONE + * @arg @ref FL_VAO_XTLF_OUTPUT_LEVEL_1 + * @arg @ref FL_VAO_XTLF_OUTPUT_LEVEL_2 + * @arg @ref FL_VAO_XTLF_OUTPUT_LEVEL_3 + * @arg @ref FL_VAO_XTLF_OUTPUT_LEVEL_4 + * @arg @ref FL_VAO_XTLF_OUTPUT_LEVEL_5 + * @arg @ref FL_VAO_XTLF_OUTPUT_LEVEL_6 + * @arg @ref FL_VAO_XTLF_OUTPUT_LEVEL_7 + */ +__STATIC_INLINE uint32_t FL_VAO_XTLF_GetDriveLevel(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->XTLFPR, VAO_XTLFPR_DRVCFG_Msk)); +} + +/** + * @brief Set XTLF working current + * @rmtoll XTLFPR XTLFIPW FL_VAO_XTLF_SetWorkCurrent + * @param VAOx VAO instance + * @param current This parameter can be one of the following values: + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_850NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_800NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_750NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_700NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_650NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_600NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_550NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_500NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_450NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_400NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_350NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_300NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_250NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_200NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_150NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_100NA + * @retval None + */ +__STATIC_INLINE void FL_VAO_XTLF_SetWorkCurrent(VAO_Type *VAOx, uint32_t current) +{ + MODIFY_REG(VAOx->XTLFPR, VAO_XTLFPR_XTLFIPW_Msk, current); +} + +/** + * @brief Get XTLF working current + * @rmtoll XTLFPR XTLFIPW FL_VAO_XTLF_GetWorkCurrent + * @param VAOx VAO instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_850NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_800NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_750NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_700NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_650NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_600NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_550NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_500NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_450NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_400NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_350NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_300NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_250NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_200NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_150NA + * @arg @ref FL_VAO_XTLF_WORK_CURRENT_100NA + */ +__STATIC_INLINE uint32_t FL_VAO_XTLF_GetWorkCurrent(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->XTLFPR, VAO_XTLFPR_XTLFIPW_Msk)); +} + +/** + * @brief XTLF detect interrupt enable + * @rmtoll FDIER LFDET_IE FL_VAO_EnableIT_XTLFFail + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_EnableIT_XTLFFail(VAO_Type *VAOx) +{ + SET_BIT(VAOx->FDIER, VAO_FDIER_LFDET_IE_Msk); +} + +/** + * @brief Get XTLF detect interrupt enable status + * @rmtoll FDIER LFDET_IE FL_VAO_IsEnabledIT_XTLFFail + * @param VAOx VAO instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VAO_IsEnabledIT_XTLFFail(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->FDIER, VAO_FDIER_LFDET_IE_Msk) == VAO_FDIER_LFDET_IE_Msk); +} + +/** + * @brief XTLF detect interrupt disable + * @rmtoll FDIER LFDET_IE FL_VAO_DisableIT_XTLFFail + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_DisableIT_XTLFFail(VAO_Type *VAOx) +{ + CLEAR_BIT(VAOx->FDIER, VAO_FDIER_LFDET_IE_Msk); +} + +/** + * @brief Get XTLF detect output + * @rmtoll FDISR LFDETO FL_VAO_GetXTLFFailOutput + * @param VAOx VAO instance + * @retval Returned value can be one of the following values: + */ +__STATIC_INLINE uint32_t FL_VAO_GetXTLFFailOutput(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->FDISR, VAO_FDISR_LFDETO_Msk) >> VAO_FDISR_LFDETO_Pos); +} + +/** + * @brief Get XTLF detect interrupt flag + * @rmtoll FDISR LFDETIF FL_VAO_IsActiveFlag_XTLFFail + * @param VAOx VAO instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VAO_IsActiveFlag_XTLFFail(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->FDISR, VAO_FDISR_LFDETIF_Msk) == (VAO_FDISR_LFDETIF_Msk)); +} + +/** + * @brief Clear XTLF detect interrupt flag + * @rmtoll FDISR LFDETIF FL_VAO_ClearFlag_XTLFFail + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_ClearFlag_XTLFFail(VAO_Type *VAOx) +{ + WRITE_REG(VAOx->FDISR, VAO_FDISR_LFDETIF_Msk); +} + +/** + * @brief PH15 input enable + * @rmtoll INEN PHINEN FL_VAO_GPIO_EnablePH15Input + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_GPIO_EnablePH15Input(VAO_Type *VAOx) +{ + SET_BIT(VAOx->INEN, VAO_INEN_PHINEN_Msk); +} + +/** + * @brief Get PH15 input enable status + * @rmtoll INEN PHINEN FL_VAO_GPIO_IsEnabledPH15Input + * @param VAOx VAO instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VAO_GPIO_IsEnabledPH15Input(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->INEN, VAO_INEN_PHINEN_Msk) == VAO_INEN_PHINEN_Msk); +} + +/** + * @brief PH15 input disable + * @rmtoll INEN PHINEN FL_VAO_GPIO_DisablePH15Input + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_GPIO_DisablePH15Input(VAO_Type *VAOx) +{ + CLEAR_BIT(VAOx->INEN, VAO_INEN_PHINEN_Msk); +} + +/** + * @brief PH15 pullup enable + * @rmtoll PUEN PHPUEN FL_VAO_GPIO_EnablePH15Pullup + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_GPIO_EnablePH15Pullup(VAO_Type *VAOx) +{ + SET_BIT(VAOx->PUEN, VAO_PUEN_PHPUEN_Msk); +} + +/** + * @brief Get PH15 pullup enable status + * @rmtoll PUEN PHPUEN FL_VAO_GPIO_IsEnabledPH15Pullup + * @param VAOx VAO instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VAO_GPIO_IsEnabledPH15Pullup(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->PUEN, VAO_PUEN_PHPUEN_Msk) == VAO_PUEN_PHPUEN_Msk); +} + +/** + * @brief PH15 pullup disable + * @rmtoll PUEN PHPUEN FL_VAO_GPIO_DisablePH15Pullup + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_GPIO_DisablePH15Pullup(VAO_Type *VAOx) +{ + CLEAR_BIT(VAOx->PUEN, VAO_PUEN_PHPUEN_Msk); +} + +/** + * @brief PH15 pullup enable + * @rmtoll ODEN PHODEN FL_VAO_GPIO_EnablePH15OpenDrain + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_GPIO_EnablePH15OpenDrain(VAO_Type *VAOx) +{ + SET_BIT(VAOx->ODEN, VAO_ODEN_PHODEN_Msk); +} + +/** + * @brief Get PH15 pullup enable status + * @rmtoll ODEN PHODEN FL_VAO_GPIO_IsEnabledPH15OpenDrain + * @param VAOx VAO instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VAO_GPIO_IsEnabledPH15OpenDrain(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->ODEN, VAO_ODEN_PHODEN_Msk) == VAO_ODEN_PHODEN_Msk); +} + +/** + * @brief PH15 pullup disable + * @rmtoll ODEN PHODEN FL_VAO_GPIO_DisablePH15OpenDrain + * @param VAOx VAO instance + * @retval None + */ +__STATIC_INLINE void FL_VAO_GPIO_DisablePH15OpenDrain(VAO_Type *VAOx) +{ + CLEAR_BIT(VAOx->ODEN, VAO_ODEN_PHODEN_Msk); +} + +/** + * @brief Set PH15 mode + * @rmtoll FCR PH15FCR FL_VAO_GPIO_SetPH15Mode + * @param VAOx VAO instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_VAO_PH15_MODE_INPUT + * @arg @ref FL_VAO_PH15_MODE_OUTPUT + * @arg @ref FL_VAO_PH15_MODE_RTCOUT + * @retval None + */ +__STATIC_INLINE void FL_VAO_GPIO_SetPH15Mode(VAO_Type *VAOx, uint32_t mode) +{ + MODIFY_REG(VAOx->FCR, VAO_FCR_PH15FCR_Msk, mode); +} + +/** + * @brief Get PH15 mode + * @rmtoll FCR PH15FCR FL_VAO_GPIO_GetPH15Mode + * @param VAOx VAO instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_VAO_PH15_MODE_INPUT + * @arg @ref FL_VAO_PH15_MODE_OUTPUT + * @arg @ref FL_VAO_PH15_MODE_RTCOUT + */ +__STATIC_INLINE uint32_t FL_VAO_GPIO_GetPH15Mode(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->FCR, VAO_FCR_PH15FCR_Msk)); +} + +/** + * @brief Set PH15 output data register + * @rmtoll DOR PHDO FL_VAO_GPIO_WritePH15Output + * @param VAOx VAO instance + * @param data + * @retval None + */ +__STATIC_INLINE void FL_VAO_GPIO_WritePH15Output(VAO_Type *VAOx, uint32_t data) +{ + MODIFY_REG(VAOx->DOR, (0x1U << 15U), (data << 15U)); +} + +/** + * @brief Get PH15 output data + * @rmtoll DOR PHDO FL_VAO_GPIO_ReadPH15Output + * @param VAOx VAO instance + * @retval + */ +__STATIC_INLINE uint32_t FL_VAO_GPIO_ReadPH15Output(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->DOR, (0x1U << 15U)) >> 15U); +} + +/** + * @brief Get PH15 input data + * @rmtoll DIR PHDIN FL_VAO_GPIO_ReadPH15Input + * @param VAOx VAO instance + * @retval + */ +__STATIC_INLINE uint32_t FL_VAO_GPIO_ReadPH15Input(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->DIR, (0x1U << 15U)) >> 15U); +} + +/** + * @brief Set PH15 input low threshold value + * @rmtoll VILR PHVIL15 FL_VAO_GPIO_SetPH15Threshold + * @param VAOx VAO instance + * @param value This parameter can be one of the following values: + * @arg @ref FL_VAO_PH15_THRESHOLD_NORMAL + * @arg @ref FL_VAO_PH15_THRESHOLD_LOW + * @retval None + */ +__STATIC_INLINE void FL_VAO_GPIO_SetPH15Threshold(VAO_Type *VAOx, uint32_t value) +{ + MODIFY_REG(VAOx->VILR, VAO_VILR_PHVIL15_Msk, value); +} + +/** + * @brief Get PH15 input low threshold value + * @rmtoll VILR PHVIL15 FL_VAO_GPIO_GetPH15Threshold + * @param VAOx VAO instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_VAO_PH15_THRESHOLD_NORMAL + * @arg @ref FL_VAO_PH15_THRESHOLD_LOW + */ +__STATIC_INLINE uint32_t FL_VAO_GPIO_GetPH15Threshold(VAO_Type *VAOx) +{ + return (uint32_t)(READ_BIT(VAOx->VILR, VAO_VILR_PHVIL15_Msk)); +} + +/** + * @} + */ + +/** @defgroup VAO_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +//#warning "PLEASE ANNOUCE THE INIT AND DEINIT FUNCTIONS HERE!!!" +FL_ErrorStatus FL_VAO_DeInit(VAO_Type *VAOx); +FL_ErrorStatus FL_VAO_IO_Init(VAO_Type *VAOx, FL_VAO_IO_InitTypeDef *VAO_InitStruct); +FL_ErrorStatus FL_VAO_XTLF_Init(VAO_Type *VAOx, FL_VAO_XTLF_InitTypeDef *VAO_XTLF_InitStruct); +void FL_VAO_IO_StructInit(FL_VAO_IO_InitTypeDef *VAO_InitStruct); +void FL_VAO_XTLF_StructInit(FL_VAO_XTLF_InitTypeDef *VAO_XTLF_InitStruct); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_VAO_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-14*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_vref.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_vref.h new file mode 100644 index 0000000..8189359 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_vref.h @@ -0,0 +1,488 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_vref.h + * @author FMSH Application Team + * @brief Head file of VREF FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_VREF_H +#define __FM33LG0XX_FL_VREF_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup VREF VREF + * @brief VREF FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup VREF_FL_ES_INIT VREF Exported Init structures + * @{ + */ + +/** + * @brief FL VREF Init Sturcture definition + */ + +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup VREF_FL_Exported_Constants VREF Exported Constants + * @{ + */ + +#define VREF_CR_VREF_EN_Pos (0U) +#define VREF_CR_VREF_EN_Msk (0x1U << VREF_CR_VREF_EN_Pos) +#define VREF_CR_VREF_EN VREF_CR_VREF_EN_Msk + +#define VREF_CR_PTAT_EN_Pos (1U) +#define VREF_CR_PTAT_EN_Msk (0x1U << VREF_CR_PTAT_EN_Pos) +#define VREF_CR_PTAT_EN VREF_CR_PTAT_EN_Msk + +#define VREF_ISR_FLAG_Pos (8U) +#define VREF_ISR_FLAG_Msk (0x1U << VREF_ISR_FLAG_Pos) +#define VREF_ISR_FLAG VREF_ISR_FLAG_Msk + +#define VREF_ISR_RDY_Pos (1U) +#define VREF_ISR_RDY_Msk (0x1U << VREF_ISR_RDY_Pos) +#define VREF_ISR_RDY VREF_ISR_RDY_Msk + +#define VREF_ISR_IF_Pos (0U) +#define VREF_ISR_IF_Msk (0x1U << VREF_ISR_IF_Pos) +#define VREF_ISR_IF VREF_ISR_IF_Msk + +#define VREF_IER_IE_Pos (0U) +#define VREF_IER_IE_Msk (0x1U << VREF_IER_IE_Pos) +#define VREF_IER_IE VREF_IER_IE_Msk + +#define VREF_BUFCR_AVREFBUF_OUTEN_Pos (5U) +#define VREF_BUFCR_AVREFBUF_OUTEN_Msk (0x1U << VREF_BUFCR_AVREFBUF_OUTEN_Pos) +#define VREF_BUFCR_AVREFBUF_OUTEN VREF_BUFCR_AVREFBUF_OUTEN_Msk + +#define VREF_BUFCR_AVREFBUF_EN_Pos (4U) +#define VREF_BUFCR_AVREFBUF_EN_Msk (0x1U << VREF_BUFCR_AVREFBUF_EN_Pos) +#define VREF_BUFCR_AVREFBUF_EN VREF_BUFCR_AVREFBUF_EN_Msk + +#define VREF_BUFCR_VPTATBUFFER_OUTEN_Pos (3U) +#define VREF_BUFCR_VPTATBUFFER_OUTEN_Msk (0x1U << VREF_BUFCR_VPTATBUFFER_OUTEN_Pos) +#define VREF_BUFCR_VPTATBUFFER_OUTEN VREF_BUFCR_VPTATBUFFER_OUTEN_Msk + +#define VREF_BUFCR_VPTATBUFFER_EN_Pos (2U) +#define VREF_BUFCR_VPTATBUFFER_EN_Msk (0x1U << VREF_BUFCR_VPTATBUFFER_EN_Pos) +#define VREF_BUFCR_VPTATBUFFER_EN VREF_BUFCR_VPTATBUFFER_EN_Msk + +#define VREF_BUFCR_VREFBUFFER_OUTEN_Pos (1U) +#define VREF_BUFCR_VREFBUFFER_OUTEN_Msk (0x1U << VREF_BUFCR_VREFBUFFER_OUTEN_Pos) +#define VREF_BUFCR_VREFBUFFER_OUTEN VREF_BUFCR_VREFBUFFER_OUTEN_Msk + +#define VREF_BUFCR_VREFBUFFER_EN_Pos (0U) +#define VREF_BUFCR_VREFBUFFER_EN_Msk (0x1U << VREF_BUFCR_VREFBUFFER_EN_Pos) +#define VREF_BUFCR_VREFBUFFER_EN VREF_BUFCR_VREFBUFFER_EN_Msk + + + + + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup VREF_FL_Exported_Functions VREF Exported Functions + * @{ + */ + +/** + * @brief Enable VREF + * @rmtoll CR VREF_EN FL_VREF_Enable + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_Enable(VREF_Type *VREFx) +{ + SET_BIT(VREFx->CR, VREF_CR_VREF_EN_Msk); +} + +/** + * @brief Get VREF Enable Status + * @rmtoll CR VREF_EN FL_VREF_IsEnabled + * @param VREFx VREF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREF_IsEnabled(VREF_Type *VREFx) +{ + return (uint32_t)(READ_BIT(VREFx->CR, VREF_CR_VREF_EN_Msk) == VREF_CR_VREF_EN_Msk); +} + +/** + * @brief Disable VREF + * @rmtoll CR VREF_EN FL_VREF_Disable + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_Disable(VREF_Type *VREFx) +{ + CLEAR_BIT(VREFx->CR, VREF_CR_VREF_EN_Msk); +} + +/** + * @brief Enable Temperatue Sensor + * @rmtoll CR PTAT_EN FL_VREF_EnableTemperatureSensor + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_EnableTemperatureSensor(VREF_Type *VREFx) +{ + SET_BIT(VREFx->CR, VREF_CR_PTAT_EN_Msk); +} + +/** + * @brief Get Temperatue Sensor Enable Status + * @rmtoll CR PTAT_EN FL_VREF_IsEnabledTemperatureSensor + * @param VREFx VREF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREF_IsEnabledTemperatureSensor(VREF_Type *VREFx) +{ + return (uint32_t)(READ_BIT(VREFx->CR, VREF_CR_PTAT_EN_Msk) == VREF_CR_PTAT_EN_Msk); +} + +/** + * @brief Disable Temperatue Sensor + * @rmtoll CR PTAT_EN FL_VREF_DisableTemperatureSensor + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_DisableTemperatureSensor(VREF_Type *VREFx) +{ + CLEAR_BIT(VREFx->CR, VREF_CR_PTAT_EN_Msk); +} + +/** + * @brief Get VREF Setable Flag From Analog + * @rmtoll ISR FLAG FL_VREF_IsActiveFlag_AnalogReady + * @param VREFx VREF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREF_IsActiveFlag_AnalogReady(VREF_Type *VREFx) +{ + return (uint32_t)(READ_BIT(VREFx->ISR, VREF_ISR_FLAG_Msk) == (VREF_ISR_FLAG_Msk)); +} + +/** + * @brief Get VREF Ready Flag + * @rmtoll ISR RDY FL_VREF_IsActiveFlag_DigitalReady + * @param VREFx VREF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREF_IsActiveFlag_DigitalReady(VREF_Type *VREFx) +{ + return (uint32_t)(READ_BIT(VREFx->ISR, VREF_ISR_RDY_Msk) == (VREF_ISR_RDY_Msk)); +} + +/** + * @brief Get VREF Ready Interrupt Flag + * @rmtoll ISR IF FL_VREF_IsActiveFlag_Ready + * @param VREFx VREF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREF_IsActiveFlag_Ready(VREF_Type *VREFx) +{ + return (uint32_t)(READ_BIT(VREFx->ISR, VREF_ISR_IF_Msk) == (VREF_ISR_IF_Msk)); +} + +/** + * @brief Clear VREF Ready Interrupt Flag + * @rmtoll ISR IF FL_VREF_ClearFlag_Ready + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_ClearFlag_Ready(VREF_Type *VREFx) +{ + WRITE_REG(VREFx->ISR, VREF_ISR_IF_Msk); +} + +/** + * @brief Enable VREF Ready Interrupt + * @rmtoll IER IE FL_VREF_EnableIT_Ready + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_EnableIT_Ready(VREF_Type *VREFx) +{ + SET_BIT(VREFx->IER, VREF_IER_IE_Msk); +} + +/** + * @brief Get VREF Ready Interrupt Enable Status + * @rmtoll IER IE FL_VREF_IsEnabledIT_Ready + * @param VREFx VREF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREF_IsEnabledIT_Ready(VREF_Type *VREFx) +{ + return (uint32_t)(READ_BIT(VREFx->IER, VREF_IER_IE_Msk) == VREF_IER_IE_Msk); +} + +/** + * @brief Disable VREF Ready Interrupt + * @rmtoll IER IE FL_VREF_DisableIT_Ready + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_DisableIT_Ready(VREF_Type *VREFx) +{ + CLEAR_BIT(VREFx->IER, VREF_IER_IE_Msk); +} + +/** + * @brief Enable AVREF Buffer Output + * @rmtoll BUFCR AVREFBUF_OUTEN FL_VREF_EnableAVREFBufferOutput + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_EnableAVREFBufferOutput(VREF_Type *VREFx) +{ + SET_BIT(VREFx->BUFCR, VREF_BUFCR_AVREFBUF_OUTEN_Msk); +} + +/** + * @brief Get AVREF Buffer Output Enable Status + * @rmtoll BUFCR AVREFBUF_OUTEN FL_VREF_IsEnabledAVREFBufferOutput + * @param VREFx VREF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREF_IsEnabledAVREFBufferOutput(VREF_Type *VREFx) +{ + return (uint32_t)(READ_BIT(VREFx->BUFCR, VREF_BUFCR_AVREFBUF_OUTEN_Msk) == VREF_BUFCR_AVREFBUF_OUTEN_Msk); +} + +/** + * @brief Disable AVREF Buffer Output + * @rmtoll BUFCR AVREFBUF_OUTEN FL_VREF_DisableAVREFBufferOutput + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_DisableAVREFBufferOutput(VREF_Type *VREFx) +{ + CLEAR_BIT(VREFx->BUFCR, VREF_BUFCR_AVREFBUF_OUTEN_Msk); +} + +/** + * @brief Enable AVREF Buffer + * @rmtoll BUFCR AVREFBUF_EN FL_VREF_EnableAVREFBuffer + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_EnableAVREFBuffer(VREF_Type *VREFx) +{ + SET_BIT(VREFx->BUFCR, VREF_BUFCR_AVREFBUF_EN_Msk); +} + +/** + * @brief Get AVREF Buffer Enable Status + * @rmtoll BUFCR AVREFBUF_EN FL_VREF_IsEnabledAVREFBuffer + * @param VREFx VREF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREF_IsEnabledAVREFBuffer(VREF_Type *VREFx) +{ + return (uint32_t)(READ_BIT(VREFx->BUFCR, VREF_BUFCR_AVREFBUF_EN_Msk) == VREF_BUFCR_AVREFBUF_EN_Msk); +} + +/** + * @brief Disable AVREF Buffer + * @rmtoll BUFCR AVREFBUF_EN FL_VREF_DisableAVREFBuffer + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_DisableAVREFBuffer(VREF_Type *VREFx) +{ + CLEAR_BIT(VREFx->BUFCR, VREF_BUFCR_AVREFBUF_EN_Msk); +} + +/** + * @brief Enable VPTAT Buffer Output + * @rmtoll BUFCR VPTATBUFFER_OUTEN FL_VREF_EnableVPTATBufferOutput + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_EnableVPTATBufferOutput(VREF_Type *VREFx) +{ + SET_BIT(VREFx->BUFCR, VREF_BUFCR_VPTATBUFFER_OUTEN_Msk); +} + +/** + * @brief Get VPTAT Buffer Output Enable Status + * @rmtoll BUFCR VPTATBUFFER_OUTEN FL_VREF_IsEnabledVPTATBufferOutput + * @param VREFx VREF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREF_IsEnabledVPTATBufferOutput(VREF_Type *VREFx) +{ + return (uint32_t)(READ_BIT(VREFx->BUFCR, VREF_BUFCR_VPTATBUFFER_OUTEN_Msk) == VREF_BUFCR_VPTATBUFFER_OUTEN_Msk); +} + +/** + * @brief Disable VPTAT Buffer Output + * @rmtoll BUFCR VPTATBUFFER_OUTEN FL_VREF_DisableVPTATBufferOutput + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_DisableVPTATBufferOutput(VREF_Type *VREFx) +{ + CLEAR_BIT(VREFx->BUFCR, VREF_BUFCR_VPTATBUFFER_OUTEN_Msk); +} + +/** + * @brief Enable VPTAT Buffer + * @rmtoll BUFCR VPTATBUFFER_EN FL_VREF_EnableVPTATBuffer + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_EnableVPTATBuffer(VREF_Type *VREFx) +{ + SET_BIT(VREFx->BUFCR, VREF_BUFCR_VPTATBUFFER_EN_Msk); +} + +/** + * @brief Get VPTAT Buffer Enable Status + * @rmtoll BUFCR VPTATBUFFER_EN FL_VREF_IsEnabledVPTATBuffer + * @param VREFx VREF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREF_IsEnabledVPTATBuffer(VREF_Type *VREFx) +{ + return (uint32_t)(READ_BIT(VREFx->BUFCR, VREF_BUFCR_VPTATBUFFER_EN_Msk) == VREF_BUFCR_VPTATBUFFER_EN_Msk); +} + +/** + * @brief Disable VPTAT Buffer + * @rmtoll BUFCR VPTATBUFFER_EN FL_VREF_DisableVPTATBuffer + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_DisableVPTATBuffer(VREF_Type *VREFx) +{ + CLEAR_BIT(VREFx->BUFCR, VREF_BUFCR_VPTATBUFFER_EN_Msk); +} + +/** + * @brief Enable VREF Buffer Output + * @rmtoll BUFCR VREFBUFFER_OUTEN FL_VREF_EnableVREFBufferOutput + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_EnableVREFBufferOutput(VREF_Type *VREFx) +{ + SET_BIT(VREFx->BUFCR, VREF_BUFCR_VREFBUFFER_OUTEN_Msk); +} + +/** + * @brief Get VREF Buffer Output Enable Status + * @rmtoll BUFCR VREFBUFFER_OUTEN FL_VREF_IsEnabledVREFBufferOutput + * @param VREFx VREF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREF_IsEnabledVREFBufferOutput(VREF_Type *VREFx) +{ + return (uint32_t)(READ_BIT(VREFx->BUFCR, VREF_BUFCR_VREFBUFFER_OUTEN_Msk) == VREF_BUFCR_VREFBUFFER_OUTEN_Msk); +} + +/** + * @brief Disable VREF Buffer Output + * @rmtoll BUFCR VREFBUFFER_OUTEN FL_VREF_DisableVREFBufferOutput + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_DisableVREFBufferOutput(VREF_Type *VREFx) +{ + CLEAR_BIT(VREFx->BUFCR, VREF_BUFCR_VREFBUFFER_OUTEN_Msk); +} + +/** + * @brief Enable VREF Buffer + * @rmtoll BUFCR VREFBUFFER_EN FL_VREF_EnableVREFBuffer + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_EnableVREFBuffer(VREF_Type *VREFx) +{ + SET_BIT(VREFx->BUFCR, VREF_BUFCR_VREFBUFFER_EN_Msk); +} + +/** + * @brief Get VREF Buffer Enable Status + * @rmtoll BUFCR VREFBUFFER_EN FL_VREF_IsEnabledVREFBuffer + * @param VREFx VREF instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREF_IsEnabledVREFBuffer(VREF_Type *VREFx) +{ + return (uint32_t)(READ_BIT(VREFx->BUFCR, VREF_BUFCR_VREFBUFFER_EN_Msk) == VREF_BUFCR_VREFBUFFER_EN_Msk); +} + +/** + * @brief Disable VREF Buffer + * @rmtoll BUFCR VREFBUFFER_EN FL_VREF_DisableVREFBuffer + * @param VREFx VREF instance + * @retval None + */ +__STATIC_INLINE void FL_VREF_DisableVREFBuffer(VREF_Type *VREFx) +{ + CLEAR_BIT(VREFx->BUFCR, VREF_BUFCR_VREFBUFFER_EN_Msk); +} + +/** + * @} + */ + +/** @defgroup VREF_FL_EF_Init Initialization and de-initialization functions + * @{ + */ + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_VREF_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-12*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_vrefp.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_vrefp.h new file mode 100644 index 0000000..68350bf --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_vrefp.h @@ -0,0 +1,521 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_vrefp.h + * @author FMSH Application Team + * @brief Head file of VREFP FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_VREFP_H +#define __FM33LG0XX_FL_VREFP_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup VREFP VREFP + * @brief VREFP FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup VREFP_FL_ES_INIT VREFP Exported Init structures + * @{ + */ + +/** + * @brief FL VREFP Init Sturcture definition + */ +typedef struct +{ + /* 输出电压的TRIM值 */ + uint32_t voltageTrim; + /* 输出电压值 */ + uint32_t outputVoltage; + /* VREFP输出模式 */ + uint32_t mode; + /* 间歇模式下单次驱动时间 */ + uint32_t timeOfDriving; + /* 间歇模式下使能周期 */ + uint32_t timeOfPeriod; + +} FL_VREFP_InitTypeDef; +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup VREFP_FL_Exported_Constants VREFP Exported Constants + * @{ + */ + +#define VREFP_CR_DENDIE_Pos (2U) +#define VREFP_CR_DENDIE_Msk (0x1U << VREFP_CR_DENDIE_Pos) +#define VREFP_CR_DENDIE VREFP_CR_DENDIE_Msk + +#define VREFP_CR_POVIE_Pos (1U) +#define VREFP_CR_POVIE_Msk (0x1U << VREFP_CR_POVIE_Pos) +#define VREFP_CR_POVIE VREFP_CR_POVIE_Msk + +#define VREFP_CR_EN_Pos (0U) +#define VREFP_CR_EN_Msk (0x1U << VREFP_CR_EN_Pos) +#define VREFP_CR_EN VREFP_CR_EN_Msk + +#define VREFP_CFGR_VRS_Pos (8U) +#define VREFP_CFGR_VRS_Msk (0x7U << VREFP_CFGR_VRS_Pos) +#define VREFP_CFGR_VRS VREFP_CFGR_VRS_Msk + +#define VREFP_CFGR_TPERIOD_Pos (5U) +#define VREFP_CFGR_TPERIOD_Msk (0x7U << VREFP_CFGR_TPERIOD_Pos) +#define VREFP_CFGR_TPERIOD VREFP_CFGR_TPERIOD_Msk + +#define VREFP_CFGR_TDRV_Pos (2U) +#define VREFP_CFGR_TDRV_Msk (0x7U << VREFP_CFGR_TDRV_Pos) +#define VREFP_CFGR_TDRV VREFP_CFGR_TDRV_Msk + +#define VREFP_CFGR_LPM_Pos (1U) +#define VREFP_CFGR_LPM_Msk (0x1U << VREFP_CFGR_LPM_Pos) +#define VREFP_CFGR_LPM VREFP_CFGR_LPM_Msk + +#define VREFP_ISR_BUSY_Pos (2U) +#define VREFP_ISR_BUSY_Msk (0x1U << VREFP_ISR_BUSY_Pos) +#define VREFP_ISR_BUSY VREFP_ISR_BUSY_Msk + +#define VREFP_ISR_DEND_Pos (1U) +#define VREFP_ISR_DEND_Msk (0x1U << VREFP_ISR_DEND_Pos) +#define VREFP_ISR_DEND VREFP_ISR_DEND_Msk + +#define VREFP_ISR_POV_Pos (0U) +#define VREFP_ISR_POV_Msk (0x1U << VREFP_ISR_POV_Pos) +#define VREFP_ISR_POV VREFP_ISR_POV_Msk + + + + + + +#define FL_VREFP_OUTPUT_VOLTAGE_2P0V (0x0U << VREFP_CFGR_VRS_Pos) +#define FL_VREFP_OUTPUT_VOLTAGE_2P5V (0x1U << VREFP_CFGR_VRS_Pos) +#define FL_VREFP_OUTPUT_VOLTAGE_3P0V (0x2U << VREFP_CFGR_VRS_Pos) +#define FL_VREFP_OUTPUT_VOLTAGE_4P5V (0x3U << VREFP_CFGR_VRS_Pos) +#define FL_VREFP_OUTPUT_VOLTAGE_1P5V (0x4U << VREFP_CFGR_VRS_Pos) + + +#define FL_VREFP_ENABLE_PERIOD_1MS (0x0U << VREFP_CFGR_TPERIOD_Pos) +#define FL_VREFP_ENABLE_PERIOD_4MS (0x1U << VREFP_CFGR_TPERIOD_Pos) +#define FL_VREFP_ENABLE_PERIOD_16MS (0x2U << VREFP_CFGR_TPERIOD_Pos) +#define FL_VREFP_ENABLE_PERIOD_32MS (0x3U << VREFP_CFGR_TPERIOD_Pos) +#define FL_VREFP_ENABLE_PERIOD_64MS (0x4U << VREFP_CFGR_TPERIOD_Pos) +#define FL_VREFP_ENABLE_PERIOD_256MS (0x5U << VREFP_CFGR_TPERIOD_Pos) +#define FL_VREFP_ENABLE_PERIOD_1000MS (0x6U << VREFP_CFGR_TPERIOD_Pos) +#define FL_VREFP_ENABLE_PERIOD_4000MS (0x7U << VREFP_CFGR_TPERIOD_Pos) + + +#define FL_VREFP_DRIVING_TIME_4LSCLK (0x0U << VREFP_CFGR_TDRV_Pos) +#define FL_VREFP_DRIVING_TIME_8LSCLK (0x1U << VREFP_CFGR_TDRV_Pos) +#define FL_VREFP_DRIVING_TIME_16LSCLK (0x2U << VREFP_CFGR_TDRV_Pos) +#define FL_VREFP_DRIVING_TIME_32LSCLK (0x3U << VREFP_CFGR_TDRV_Pos) +#define FL_VREFP_DRIVING_TIME_64LSCLK (0x4U << VREFP_CFGR_TDRV_Pos) +#define FL_VREFP_DRIVING_TIME_128LSCLK (0x5U << VREFP_CFGR_TDRV_Pos) +#define FL_VREFP_DRIVING_TIME_256LSCLK (0x6U << VREFP_CFGR_TDRV_Pos) +#define FL_VREFP_DRIVING_TIME_512LSCLK (0x7U << VREFP_CFGR_TDRV_Pos) + + +#define FL_VREFP_WORK_MODE_CONTINUOUS (0x0U << VREFP_CFGR_LPM_Pos) +#define FL_VREFP_WORK_MODE_PERIODIC (0x1U << VREFP_CFGR_LPM_Pos) + + +/* 原始值 */ +#define VREFP_OUTPUT_VOLTAGE_2P0V_TRIM (*(uint32_t*)0x1FFFFA90) +#define VREFP_OUTPUT_VOLTAGE_2P5V_TRIM (*(uint32_t*)0x1FFFFA8C) +#define VREFP_OUTPUT_VOLTAGE_3P0V_TRIM (*(uint32_t*)0x1FFFFA88) +#define VREFP_OUTPUT_VOLTAGE_4P5V_TRIM (*(uint32_t*)0x1FFFFA84) +#define VREFP_OUTPUT_VOLTAGE_1P5V_TRIM (*(uint32_t*)0x1FFFFA94) + +/* 备份值 */ +#define VREFP_OUTPUT_VOLTAGE_2P0V_TRIM_BKP (*(uint16_t*)0x1FFFFBA6) +#define VREFP_OUTPUT_VOLTAGE_2P5V_TRIM_BKP (*(uint16_t*)0x1FFFFBA4) +#define VREFP_OUTPUT_VOLTAGE_3P0V_TRIM_BKP (*(uint16_t*)0x1FFFFBA2) +#define VREFP_OUTPUT_VOLTAGE_4P5V_TRIM_BKP (*(uint16_t*)0x1FFFFBA0) +#define VREFP_OUTPUT_VOLTAGE_1P5V_TRIM_BKP (*(uint16_t*)0x1FFFFBA8) + +/* 最终值 */ +#define FL_VREFP_OUTPUT_VOLTAGE_2P0V_TRIM (LDT_CHECK(VREFP_OUTPUT_VOLTAGE_2P0V_TRIM, VREFP_OUTPUT_VOLTAGE_2P0V_TRIM_BKP) & 0xff) +#define FL_VREFP_OUTPUT_VOLTAGE_2P5V_TRIM (LDT_CHECK(VREFP_OUTPUT_VOLTAGE_2P5V_TRIM, VREFP_OUTPUT_VOLTAGE_2P5V_TRIM_BKP) & 0xff) +#define FL_VREFP_OUTPUT_VOLTAGE_3P0V_TRIM (LDT_CHECK(VREFP_OUTPUT_VOLTAGE_3P0V_TRIM, VREFP_OUTPUT_VOLTAGE_3P0V_TRIM_BKP) & 0xff) +#define FL_VREFP_OUTPUT_VOLTAGE_4P5V_TRIM (LDT_CHECK(VREFP_OUTPUT_VOLTAGE_4P5V_TRIM, VREFP_OUTPUT_VOLTAGE_4P5V_TRIM_BKP) & 0xff) +#define FL_VREFP_OUTPUT_VOLTAGE_1P5V_TRIM (LDT_CHECK(VREFP_OUTPUT_VOLTAGE_1P5V_TRIM, VREFP_OUTPUT_VOLTAGE_1P5V_TRIM_BKP) & 0xff) + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup VREFP_FL_Exported_Functions VREFP Exported Functions + * @{ + */ + +/** + * @brief Driving end interrupt enable + * @rmtoll CR DENDIE FL_VREFP_EnableIT_DrivingEnd + * @param VREFPx VREFP instance + * @retval None + */ +__STATIC_INLINE void FL_VREFP_EnableIT_DrivingEnd(VREFP_Type *VREFPx) +{ + SET_BIT(VREFPx->CR, VREFP_CR_DENDIE_Msk); +} + +/** + * @brief Get Driving end interrupt enable status + * @rmtoll CR DENDIE FL_VREFP_IsEnabledIT_DrivingEnd + * @param VREFPx VREFP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREFP_IsEnabledIT_DrivingEnd(VREFP_Type *VREFPx) +{ + return (uint32_t)(READ_BIT(VREFPx->CR, VREFP_CR_DENDIE_Msk) == VREFP_CR_DENDIE_Msk); +} + +/** + * @brief Driving end interrupt disable + * @rmtoll CR DENDIE FL_VREFP_DisableIT_DrivingEnd + * @param VREFPx VREFP instance + * @retval None + */ +__STATIC_INLINE void FL_VREFP_DisableIT_DrivingEnd(VREFP_Type *VREFPx) +{ + CLEAR_BIT(VREFPx->CR, VREFP_CR_DENDIE_Msk); +} + +/** + * @brief Periodic overflow interrupt enable + * @rmtoll CR POVIE FL_VREFP_EnableIT_EndOfPeriod + * @param VREFPx VREFP instance + * @retval None + */ +__STATIC_INLINE void FL_VREFP_EnableIT_EndOfPeriod(VREFP_Type *VREFPx) +{ + SET_BIT(VREFPx->CR, VREFP_CR_POVIE_Msk); +} + +/** + * @brief Get Periodic overflow interrupt enable status + * @rmtoll CR POVIE FL_VREFP_IsEnabledIT_EndOfPeriod + * @param VREFPx VREFP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREFP_IsEnabledIT_EndOfPeriod(VREFP_Type *VREFPx) +{ + return (uint32_t)(READ_BIT(VREFPx->CR, VREFP_CR_POVIE_Msk) == VREFP_CR_POVIE_Msk); +} + +/** + * @brief Periodic overflow interrupt disable + * @rmtoll CR POVIE FL_VREFP_DisableIT_EndOfPeriod + * @param VREFPx VREFP instance + * @retval None + */ +__STATIC_INLINE void FL_VREFP_DisableIT_EndOfPeriod(VREFP_Type *VREFPx) +{ + CLEAR_BIT(VREFPx->CR, VREFP_CR_POVIE_Msk); +} + +/** + * @brief VREFP_VREG enable + * @rmtoll CR EN FL_VREFP_Enable + * @param VREFPx VREFP instance + * @retval None + */ +__STATIC_INLINE void FL_VREFP_Enable(VREFP_Type *VREFPx) +{ + SET_BIT(VREFPx->CR, VREFP_CR_EN_Msk); +} + +/** + * @brief Get VREFP_VREG enable status + * @rmtoll CR EN FL_VREFP_IsEnabled + * @param VREFPx VREFP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREFP_IsEnabled(VREFP_Type *VREFPx) +{ + return (uint32_t)(READ_BIT(VREFPx->CR, VREFP_CR_EN_Msk) == VREFP_CR_EN_Msk); +} + +/** + * @brief VREFP_VREG disable + * @rmtoll CR EN FL_VREFP_Disable + * @param VREFPx VREFP instance + * @retval None + */ +__STATIC_INLINE void FL_VREFP_Disable(VREFP_Type *VREFPx) +{ + CLEAR_BIT(VREFPx->CR, VREFP_CR_EN_Msk); +} + +/** + * @brief Set output voltage + * @rmtoll CFGR VRS FL_VREFP_SetOutputVoltage + * @param VREFPx VREFP instance + * @param voltage This parameter can be one of the following values: + * @arg @ref FL_VREFP_OUTPUT_VOLTAGE_2P0V + * @arg @ref FL_VREFP_OUTPUT_VOLTAGE_2P5V + * @arg @ref FL_VREFP_OUTPUT_VOLTAGE_3P0V + * @arg @ref FL_VREFP_OUTPUT_VOLTAGE_4P5V + * @arg @ref FL_VREFP_OUTPUT_VOLTAGE_1P5V + * @retval None + */ +__STATIC_INLINE void FL_VREFP_SetOutputVoltage(VREFP_Type *VREFPx, uint32_t voltage) +{ + MODIFY_REG(VREFPx->CFGR, VREFP_CFGR_VRS_Msk, voltage); +} + +/** + * @brief Get output voltage + * @rmtoll CFGR VRS FL_VREFP_GetOutputVoltage + * @param VREFPx VREFP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_VREFP_OUTPUT_VOLTAGE_2P0V + * @arg @ref FL_VREFP_OUTPUT_VOLTAGE_2P5V + * @arg @ref FL_VREFP_OUTPUT_VOLTAGE_3P0V + * @arg @ref FL_VREFP_OUTPUT_VOLTAGE_4P5V + * @arg @ref FL_VREFP_OUTPUT_VOLTAGE_1P5V + */ +__STATIC_INLINE uint32_t FL_VREFP_GetOutputVoltage(VREFP_Type *VREFPx) +{ + return (uint32_t)(READ_BIT(VREFPx->CFGR, VREFP_CFGR_VRS_Msk)); +} + +/** + * @brief Set period time on low power mode + * @rmtoll CFGR TPERIOD FL_VREFP_SetEnablePeriod + * @param VREFPx VREFP instance + * @param period This parameter can be one of the following values: + * @arg @ref FL_VREFP_ENABLE_PERIOD_1MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_4MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_16MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_32MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_64MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_256MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_1000MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_4000MS + * @retval None + */ +__STATIC_INLINE void FL_VREFP_SetEnablePeriod(VREFP_Type *VREFPx, uint32_t period) +{ + MODIFY_REG(VREFPx->CFGR, VREFP_CFGR_TPERIOD_Msk, period); +} + +/** + * @brief Get period time on low power mode + * @rmtoll CFGR TPERIOD FL_VREFP_GetEnablePeriod + * @param VREFPx VREFP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_VREFP_ENABLE_PERIOD_1MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_4MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_16MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_32MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_64MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_256MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_1000MS + * @arg @ref FL_VREFP_ENABLE_PERIOD_4000MS + */ +__STATIC_INLINE uint32_t FL_VREFP_GetEnablePeriod(VREFP_Type *VREFPx) +{ + return (uint32_t)(READ_BIT(VREFPx->CFGR, VREFP_CFGR_TPERIOD_Msk)); +} + +/** + * @brief Set driving time on low power mode + * @rmtoll CFGR TDRV FL_VREFP_SetDrivingTime + * @param VREFPx VREFP instance + * @param time This parameter can be one of the following values: + * @arg @ref FL_VREFP_DRIVING_TIME_4LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_8LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_16LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_32LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_64LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_128LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_256LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_512LSCLK + * @retval None + */ +__STATIC_INLINE void FL_VREFP_SetDrivingTime(VREFP_Type *VREFPx, uint32_t time) +{ + MODIFY_REG(VREFPx->CFGR, VREFP_CFGR_TDRV_Msk, time); +} + +/** + * @brief Get driving time on low power mode + * @rmtoll CFGR TDRV FL_VREFP_GetDrivingTime + * @param VREFPx VREFP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_VREFP_DRIVING_TIME_4LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_8LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_16LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_32LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_64LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_128LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_256LSCLK + * @arg @ref FL_VREFP_DRIVING_TIME_512LSCLK + */ +__STATIC_INLINE uint32_t FL_VREFP_GetDrivingTime(VREFP_Type *VREFPx) +{ + return (uint32_t)(READ_BIT(VREFPx->CFGR, VREFP_CFGR_TDRV_Msk)); +} + +/** + * @brief Low power mode enable + * @rmtoll CFGR LPM FL_VREFP_SetWorkMode + * @param VREFPx VREFP instance + * @param mode This parameter can be one of the following values: + * @arg @ref FL_VREFP_WORK_MODE_CONTINUOUS + * @arg @ref FL_VREFP_WORK_MODE_PERIODIC + * @retval None + */ +__STATIC_INLINE void FL_VREFP_SetWorkMode(VREFP_Type *VREFPx, uint32_t mode) +{ + MODIFY_REG(VREFPx->CFGR, VREFP_CFGR_LPM_Msk, mode); +} + +/** + * @brief Get low power mode enablestatus + * @rmtoll CFGR LPM FL_VREFP_GetWorkMode + * @param VREFPx VREFP instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_VREFP_WORK_MODE_CONTINUOUS + * @arg @ref FL_VREFP_WORK_MODE_PERIODIC + */ +__STATIC_INLINE uint32_t FL_VREFP_GetWorkMode(VREFP_Type *VREFPx) +{ + return (uint32_t)(READ_BIT(VREFPx->CFGR, VREFP_CFGR_LPM_Msk)); +} + +/** + * @brief Get Driving busy flag + * @rmtoll ISR BUSY FL_VREFP_IsActiveFlag_DrivingBusy + * @param VREFPx VREFP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREFP_IsActiveFlag_DrivingBusy(VREFP_Type *VREFPx) +{ + return (uint32_t)(READ_BIT(VREFPx->ISR, VREFP_ISR_BUSY_Msk) == (VREFP_ISR_BUSY_Msk)); +} + +/** + * @brief Get Driving end flag + * @rmtoll ISR DEND FL_VREFP_IsActiveFlag_DrivingEnd + * @param VREFPx VREFP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREFP_IsActiveFlag_DrivingEnd(VREFP_Type *VREFPx) +{ + return (uint32_t)(READ_BIT(VREFPx->ISR, VREFP_ISR_DEND_Msk) == (VREFP_ISR_DEND_Msk)); +} + +/** + * @brief Clear Driving end flag + * @rmtoll ISR DEND FL_VREFP_ClearFlag_DrivingEnd + * @param VREFPx VREFP instance + * @retval None + */ +__STATIC_INLINE void FL_VREFP_ClearFlag_DrivingEnd(VREFP_Type *VREFPx) +{ + WRITE_REG(VREFPx->ISR, VREFP_ISR_DEND_Msk); +} + +/** + * @brief Get periodic overflow flag + * @rmtoll ISR POV FL_VREFP_IsActiveFlag_EndOfPeriod + * @param VREFPx VREFP instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_VREFP_IsActiveFlag_EndOfPeriod(VREFP_Type *VREFPx) +{ + return (uint32_t)(READ_BIT(VREFPx->ISR, VREFP_ISR_POV_Msk) == (VREFP_ISR_POV_Msk)); +} + +/** + * @brief Clear periodic overflow flag + * @rmtoll ISR POV FL_VREFP_ClearFlag_EndOfPeriod + * @param VREFPx VREFP instance + * @retval None + */ +__STATIC_INLINE void FL_VREFP_ClearFlag_EndOfPeriod(VREFP_Type *VREFPx) +{ + WRITE_REG(VREFPx->ISR, VREFP_ISR_POV_Msk); +} + +/** + * @brief Set VREFP output voltage + * @rmtoll TR FL_VREFP_WriteOutputVoltageTrim + * @param VREFPx VREFP instance + * @param voltage + * @retval None + */ +__STATIC_INLINE void FL_VREFP_WriteOutputVoltageTrim(VREFP_Type *VREFPx, uint32_t voltage) +{ + MODIFY_REG(VREFPx->TR, (0xffU << 0U), (voltage << 0U)); +} + +/** + * @brief Get VREFP output voltage + * @rmtoll TR FL_VREFP_ReadOutputVoltageTrim + * @param VREFPx VREFP instance + * @retval + */ +__STATIC_INLINE uint32_t FL_VREFP_ReadOutputVoltageTrim(VREFP_Type *VREFPx) +{ + return (uint32_t)(READ_BIT(VREFPx->TR, (0xffU << 0U)) >> 0U); +} + +/** + * @} + */ + +/** @defgroup VREFP_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_VREFP_Init(VREFP_Type *VREFPx, FL_VREFP_InitTypeDef *VREFP_InitStruct); +void FL_VREFP_StructInit(FL_VREFP_InitTypeDef *VREFP_InitStruct); +FL_ErrorStatus FL_VREFP_DeInit(VREFP_Type *VREFPx); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_VREFP_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.14-0.1 @ 2021-06-25*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_wwdt.h b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_wwdt.h new file mode 100644 index 0000000..fdd4f64 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Inc/fm33lg0xx_fl_wwdt.h @@ -0,0 +1,263 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_wwdt.h + * @author FMSH Application Team + * @brief Head file of WWDT FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + + +/* Define to prevent recursive inclusion---------------------------------------------------------------*/ +#ifndef __FM33LG0XX_FL_WWDT_H +#define __FM33LG0XX_FL_WWDT_H + +#ifdef __cplusplus +extern "C" { +#endif +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl_def.h" +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @defgroup WWDT WWDT + * @brief WWDT FL driver + * @{ + */ + +/* Exported types -------------------------------------------------------------------------------------*/ +/** @defgroup WWDT_FL_ES_INIT WWDT Exported Init structures + * @{ + */ + +/** + * @brief FL WWDT Init Sturcture definition + */ +typedef struct +{ + /* 看门狗溢出周期 */ + uint32_t overflowPeriod; + +} FL_WWDT_InitTypeDef; +/** + * @} + */ +/* Exported constants ---------------------------------------------------------------------------------*/ +/** @defgroup WWDT_FL_Exported_Constants WWDT Exported Constants + * @{ + */ + +#define WWDT_CR_CON_Pos (0U) +#define WWDT_CR_CON_Msk (0xffU << WWDT_CR_CON_Pos) +#define WWDT_CR_CON WWDT_CR_CON_Msk + +#define WWDT_CFGR_CFG_Pos (0U) +#define WWDT_CFGR_CFG_Msk (0x7U << WWDT_CFGR_CFG_Pos) +#define WWDT_CFGR_CFG WWDT_CFGR_CFG_Msk + +#define WWDT_IER_IE_Pos (0U) +#define WWDT_IER_IE_Msk (0x1U << WWDT_IER_IE_Pos) +#define WWDT_IER_IE WWDT_IER_IE_Msk + +#define WWDT_ISR_IF_Pos (0U) +#define WWDT_ISR_IF_Msk (0x1U << WWDT_ISR_IF_Pos) +#define WWDT_ISR_IF WWDT_ISR_IF_Msk + + + + + + +#define FL_WWDT_KEY_ENABLE (0x5AU << WWDT_CR_CON_Pos) + +#define FL_WWDT_RELOAD_ENABLE (0xACU << WWDT_CR_CON_Pos) + +#define FL_WWDT_PERIOD_1CNT (0x0U << WWDT_CFGR_CFG_Pos) +#define FL_WWDT_PERIOD_4CNT (0x1U << WWDT_CFGR_CFG_Pos) +#define FL_WWDT_PERIOD_16CNT (0x2U << WWDT_CFGR_CFG_Pos) +#define FL_WWDT_PERIOD_64CNT (0x3U << WWDT_CFGR_CFG_Pos) +#define FL_WWDT_PERIOD_128CNT (0x4U << WWDT_CFGR_CFG_Pos) +#define FL_WWDT_PERIOD_256CNT (0x5U << WWDT_CFGR_CFG_Pos) +#define FL_WWDT_PERIOD_512CNT (0x6U << WWDT_CFGR_CFG_Pos) +#define FL_WWDT_PERIOD_1024CNT (0x7U << WWDT_CFGR_CFG_Pos) + + +/** + * @} + */ +/* Exported functions ---------------------------------------------------------------------------------*/ +/** @defgroup WWDT_FL_Exported_Functions WWDT Exported Functions + * @{ + */ + +/** + * @brief WWDT enable counter + * @rmtoll CR CON FL_WWDT_Enable + * @param WWDTx WWDT instance + * @retval None + */ +__STATIC_INLINE void FL_WWDT_Enable(WWDT_Type *WWDTx) +{ + WRITE_REG(WWDTx->CR, FL_WWDT_KEY_ENABLE); +} + +/** + * @brief WWDT reset counter + * @rmtoll CR CON FL_WWDT_ReloadCounter + * @param WWDTx WWDT instance + * @retval None + */ +__STATIC_INLINE void FL_WWDT_ReloadCounter(WWDT_Type *WWDTx) +{ + WRITE_REG(WWDTx->CR, FL_WWDT_RELOAD_ENABLE); +} + +/** + * @brief Set WWDT overflow period + * @rmtoll CFGR CFG FL_WWDT_SetPeriod + * @param WWDTx WWDT instance + * @param period This parameter can be one of the following values: + * @arg @ref FL_WWDT_PERIOD_1CNT + * @arg @ref FL_WWDT_PERIOD_4CNT + * @arg @ref FL_WWDT_PERIOD_16CNT + * @arg @ref FL_WWDT_PERIOD_64CNT + * @arg @ref FL_WWDT_PERIOD_128CNT + * @arg @ref FL_WWDT_PERIOD_256CNT + * @arg @ref FL_WWDT_PERIOD_512CNT + * @arg @ref FL_WWDT_PERIOD_1024CNT + * @retval None + */ +__STATIC_INLINE void FL_WWDT_SetPeriod(WWDT_Type *WWDTx, uint32_t period) +{ + MODIFY_REG(WWDTx->CFGR, WWDT_CFGR_CFG_Msk, period); +} + +/** + * @brief Get WWDT overflow period + * @rmtoll CFGR CFG FL_WWDT_GetPeriod + * @param WWDTx WWDT instance + * @retval Returned value can be one of the following values: + * @arg @ref FL_WWDT_PERIOD_1CNT + * @arg @ref FL_WWDT_PERIOD_4CNT + * @arg @ref FL_WWDT_PERIOD_16CNT + * @arg @ref FL_WWDT_PERIOD_64CNT + * @arg @ref FL_WWDT_PERIOD_128CNT + * @arg @ref FL_WWDT_PERIOD_256CNT + * @arg @ref FL_WWDT_PERIOD_512CNT + * @arg @ref FL_WWDT_PERIOD_1024CNT + */ +__STATIC_INLINE uint32_t FL_WWDT_GetPeriod(WWDT_Type *WWDTx) +{ + return (uint32_t)(READ_BIT(WWDTx->CFGR, WWDT_CFGR_CFG_Msk)); +} + +/** + * @brief Get WWDT Counter value + * @rmtoll CNT FL_WWDT_ReadCounter + * @param WWDTx WWDT instance + * @retval + */ +__STATIC_INLINE uint32_t FL_WWDT_ReadCounter(WWDT_Type *WWDTx) +{ + return (uint32_t)(READ_BIT(WWDTx->CNT, (0x3ffU << 0U)) >> 0U); +} + +/** + * @brief WWDT interrupt enable + * @rmtoll IER IE FL_WWDT_EnableIT_NearOverflow + * @param WWDTx WWDT instance + * @retval None + */ +__STATIC_INLINE void FL_WWDT_EnableIT_NearOverflow(WWDT_Type *WWDTx) +{ + SET_BIT(WWDTx->IER, WWDT_IER_IE_Msk); +} + +/** + * @brief WWDT interrupt enable status + * @rmtoll IER IE FL_WWDT_IsEnabledIT_NearOverflow + * @param WWDTx WWDT instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_WWDT_IsEnabledIT_NearOverflow(WWDT_Type *WWDTx) +{ + return (uint32_t)(READ_BIT(WWDTx->IER, WWDT_IER_IE_Msk) == WWDT_IER_IE_Msk); +} + +/** + * @brief WWDT interrupt disable + * @rmtoll IER IE FL_WWDT_DisableIT_NearOverflow + * @param WWDTx WWDT instance + * @retval None + */ +__STATIC_INLINE void FL_WWDT_DisableIT_NearOverflow(WWDT_Type *WWDTx) +{ + CLEAR_BIT(WWDTx->IER, WWDT_IER_IE_Msk); +} + +/** + * @brief Get WWDT 75% overflow flag + * @rmtoll ISR IF FL_WWDT_IsActiveFlag_NearOverflow + * @param WWDTx WWDT instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t FL_WWDT_IsActiveFlag_NearOverflow(WWDT_Type *WWDTx) +{ + return (uint32_t)(READ_BIT(WWDTx->ISR, WWDT_ISR_IF_Msk) == (WWDT_ISR_IF_Msk)); +} + +/** + * @brief Clear WWDT 75% overflow flag + * @rmtoll ISR IF FL_WWDT_ClearFlag_NearOverflow + * @param WWDTx WWDT instance + * @retval None + */ +__STATIC_INLINE void FL_WWDT_ClearFlag_NearOverflow(WWDT_Type *WWDTx) +{ + WRITE_REG(WWDTx->ISR, WWDT_ISR_IF_Msk); +} + +/** + * @} + */ + +/** @defgroup WWDT_FL_EF_Init Initialization and de-initialization functions + * @{ + */ +FL_ErrorStatus FL_WWDT_DeInit(WWDT_Type *WWDTx); +FL_ErrorStatus FL_WWDT_Init(WWDT_Type *WWDTx, FL_WWDT_InitTypeDef *WWDT_InitStruct); +void FL_WWDT_StructInit(FL_WWDT_InitTypeDef *WWDT_InitStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FM33LG0XX_FL_WWDT_H*/ + +/*************************Py_Code_Generator Version: 0.1-0.11-0.1 @ 2020-09-14*************************/ +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl.c new file mode 100644 index 0000000..6bbadcc --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl.c @@ -0,0 +1,163 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl.c + * @author FMSH Application Team + * @brief Source file of FL Driver Library + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ + +/* Includes -------------------------------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FL_EF_DELAY + * @{ + */ + +/** + * @brief Initialize the timer(default is Systick) used as delay timer. + * @note The function is declared as __WEAK to be overwritten in case of other + * implementation in user file. + * @param None + * @retval None + */ +__WEAK void FL_DelayInit(void) +{ + SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; + SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; +} + +/** + * @brief Provide block delay in microseconds. + * @note The function is declared as __WEAK to be overwritten in case of other + * implementation in user file. + * @param count specifies the delay count in microseconds. + * @retval None + */ +__WEAK void FL_DelayUs(uint32_t count) +{ + count = FL_DELAY_US * count; + count = count > 16777216 ? 16777216 : count; + SysTick->LOAD = count - 1; + SysTick->VAL = 0; + while(!((SysTick->CTRL >> 16) & 0x1)); +} + +/** + * @brief Provide blocking delay in milliseconds. + * @note The function is declared as __WEAK to be overwritten in case of other + * implementation in user file. + * @param count specifies the delay count in milliseconds. + * @retval None + */ +__WEAK void FL_DelayMs(uint32_t count) +{ + while(count--) + { + FL_DelayUs(1000); + } +} + +/** + * @brief Provide no-blocking delay initialization in microseconds. + * @note Should be follow By while(!FL_DelayEnd()){ ** user code ** } immediately. + The function is declared as __WEAK to be overwritten in case of other + * implementation in user file. + * @param count specifies the delay count in microseconds. + * @retval None + */ +__WEAK void FL_DelayUsStart(uint32_t count) +{ + count = FL_DELAY_US * count; + count = count > 16777216 ? 16777216 : count; + SysTick->LOAD = count - 1; + SysTick->VAL = 0; +} + +/** + * @brief Provide no-blocking delay initialization in milliseconds. + * @note Should be followed By while(!FL_DelayEnd()){ ** user code ** }. + * The function is declared as __WEAK to be overwritten in case of other + * implementation in user file. + * @param count specifies the delay count in milliseconds. + * @retval None + */ +__WEAK void FL_DelayMsStart(uint32_t count) +{ + FL_DelayUsStart(1000 * count); +} + +/** + * @brief Showing if the no-blocking delay has ended. + * @note Should be used with FL_DelayMs/UsStart() function. + The function is declared as __WEAK to be overwritten in case of other + * implementation in user file. + * @param count specifies the delay count in milliseconds. + * @retval true - delay has ended + * false - delay is in progress + */ +__WEAK bool FL_DelayEnd(void) +{ + return (((SysTick->CTRL >> 16) & 0x1) == 0x1); +} + +/** + *@} + */ + +/** @addtogroup FL_EF_DELAY + * @{ + */ + +void FL_Init(void) +{ + /* Init delay support function */ + FL_DelayInit(); +} + +/** + *@} + */ + +/** @addtogroup FL_EF_NVIC + * @{ + */ + +/** + * @brief Configure NVIC for specified Interrupt. + * @param configStruct NVIC configuration. + * @param irq Interrupt number. + * @retval None + */ +void FL_NVIC_Init(FL_NVIC_ConfigTypeDef *configStruct, IRQn_Type irq) +{ + /* Check parameter */ + if(configStruct->preemptPriority > 3) + { + configStruct->preemptPriority = 3; + } + NVIC_DisableIRQ(irq); + NVIC_SetPriority(irq, configStruct->preemptPriority); + NVIC_EnableIRQ(irq); +} + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ + + + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_adc.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_adc.c new file mode 100644 index 0000000..e9609e5 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_adc.c @@ -0,0 +1,432 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_adc.c + * @author FMSH Application Team + * @brief Src file of ADC FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ + + +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0xx_FL_Driver + * @{ + */ + +/** @addtogroup ADC + * @{ + */ + +#ifdef FL_ADC_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup ADC_FL_Private_Macros + * @{ + */ + +#define IS_FL_ADC_INSTANCE(INSTANCE) ((INSTANCE) == ADC) + +#define IS_FL_ADC_CLK_SOURCE(__VALUE__) (((__VALUE__) == FL_CMU_ADC_CLK_SOURCE_RCLF)||\ + ((__VALUE__) == FL_CMU_ADC_CLK_SOURCE_RCHF)||\ + ((__VALUE__) == FL_CMU_ADC_CLK_SOURCE_XTHF)||\ + ((__VALUE__) == FL_CMU_ADC_CLK_SOURCE_PLL)||\ + ((__VALUE__) == FL_ADC_CLK_SOURCE_APBCLK)) + +#define IS_FL_ADC_CMUCLK_PRESCALER(__VALUE__) (((__VALUE__) == FL_ADC_CLK_PSC_DIV1)||\ + ((__VALUE__) == FL_ADC_CLK_PSC_DIV2)||\ + ((__VALUE__) == FL_ADC_CLK_PSC_DIV4)||\ + ((__VALUE__) == FL_ADC_CLK_PSC_DIV8)||\ + ((__VALUE__) == FL_ADC_CLK_PSC_DIV16)||\ + ((__VALUE__) == FL_ADC_CLK_PSC_DIV32)) + +#define IS_FL_ADC_APBCLK_PRESCALER(__VALUE__) (((__VALUE__) == FL_ADC_CLK_PSC_DIV1)||\ + ((__VALUE__) == FL_ADC_CLK_PSC_DIV2)||\ + ((__VALUE__) == FL_ADC_CLK_PSC_DIV4)||\ + ((__VALUE__) == FL_ADC_CLK_PSC_DIV8)) + +#define IS_FL_ADC_REFERENCE_SOURCE(__VALUE__) (((__VALUE__) == FL_ADC_REF_SOURCE_VDDA)||\ + ((__VALUE__) == FL_ADC_REF_SOURCE_VREFP)) + +#define IS_FL_ADC_BITWIDTH(__VALUE__) (((__VALUE__) == FL_ADC_BIT_WIDTH_12B)||\ + ((__VALUE__) == FL_ADC_BIT_WIDTH_10B)||\ + ((__VALUE__) == FL_ADC_BIT_WIDTH_8B)||\ + ((__VALUE__) == FL_ADC_BIT_WIDTH_6B)) + +#define IS_FL_ADC_CONTINUOUSCONVMODE(__VALUE__) (((__VALUE__) == FL_ADC_CONV_MODE_SINGLE)||\ + ((__VALUE__) == FL_ADC_CONV_MODE_CONTINUOUS)) + +#define IS_FL_ADC_AUTO_MODE(__VALUE__) (((__VALUE__) == FL_ADC_SINGLE_CONV_MODE_AUTO)||\ + ((__VALUE__) == FL_ADC_SINGLE_CONV_MODE_SEMIAUTO)) + + +#define IS_FL_ADC_SCANDIRECTION(__VALUE__) (((__VALUE__) == FL_ADC_SEQ_SCAN_DIR_FORWARD)||\ + ((__VALUE__) == FL_ADC_SEQ_SCAN_DIR_BACKWARD)) + + +#define IS_FL_ADC_EXTERNALTRIGCONV(__VALUE__) (((__VALUE__) == FL_ADC_TRIGGER_EDGE_NONE)||\ + ((__VALUE__) == FL_ADC_TRIGGER_EDGE_RISING)||\ + ((__VALUE__) == FL_ADC_TRIGGER_EDGE_FALLING)||\ + ((__VALUE__) == FL_ADC_TRIGGER_EDGE_BOTH)) + +#define IS_FL_ADC_EXTERNALTRIGSOURCE(__VALUE__) (((__VALUE__) == FL_ADC_TRGI_LUT0)||\ + ((__VALUE__) == FL_ADC_TRGI_LUT1)||\ + ((__VALUE__) == FL_ADC_TRGI_LUT2)||\ + ((__VALUE__) == FL_ADC_TRGI_ATIM)||\ + ((__VALUE__) == FL_ADC_TRGI_GPTIM1)||\ + ((__VALUE__) == FL_ADC_TRGI_GPTIM2)||\ + ((__VALUE__) == FL_ADC_TRGI_BSTIM16)||\ + ((__VALUE__) == FL_ADC_TRGI_LPTIM12)||\ + ((__VALUE__) == FL_ADC_TRGI_COMP1)||\ + ((__VALUE__) == FL_ADC_TRGI_COMP2)||\ + ((__VALUE__) == FL_ADC_TRGI_RTCA)||\ + ((__VALUE__) == FL_ADC_TRGI_LUT3)||\ + ((__VALUE__) == FL_ADC_TRGI_GPTIM0)||\ + ((__VALUE__) == FL_ADC_TRGI_COMP3)) + +#define IS_FL_ADC_CHANNEL_FAST_TIME(__VALUE__) (((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_2_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_4_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_8_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_16_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_32_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_64_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_80_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_96_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_128_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_160_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_192_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_256_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_320_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_384_ADCCLK)||\ + ((__VALUE__) == FL_ADC_FAST_CH_SAMPLING_TIME_512_ADCCLK)) + +#define IS_FL_ADC_CHANNEL_SLOW_TIME(__VALUE__) (((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_2_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_4_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_8_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_16_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_32_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_64_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_80_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_96_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_128_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_160_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_192_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_256_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_320_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_384_ADCCLK)||\ + ((__VALUE__) == FL_ADC_SLOW_CH_SAMPLING_TIME_512_ADCCLK)) + +#define IS_FL_ADC_OVERSAMPCOFIG(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_ADC_OVERSAMPINGRATIO(__VALUE__) (((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_2X)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_4X)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_8X)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_16X)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_32X)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_64X)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_128X)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_MUL_256X)) + +#define IS_FL_ADC_OVERSAMPINGSHIFT(__VALUE__) (((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_0B)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_1B)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_2B)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_3B)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_4B)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_5B)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_6B)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_7B)||\ + ((__VALUE__) == FL_ADC_OVERSAMPLING_SHIFT_8B)) + +#define ADC_CALIBRATIN_TIME_OUT (500000) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup ADC_FL_EF_Init + * @{ + */ + +/** + * @brief ADC外设寄存器值为复位值 + * @param 外设入口地址 + * @retval 返回错误状态,可能值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_ADC_CommonDeInit(void) +{ + /* 关闭总线时钟 */ + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_ADC); + /* 关闭操作时钟 */ + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_ADC); + return FL_PASS; +} +/** + * @brief ADC共用寄存器设置以配置外设工作时钟 + * + * @note 其中FL_LPTIM_OPERATION_MODE_EXTERNAL_ASYN_PAUSE_CNT 模式需要外部脉冲提供给LPTIM模块作为工作时钟,此时 + * LPTIM完全工作在异步模式下。 + * @param LPTIM 外设入口地址 + * @param LPTIM_InitStruct指向FL_LPTIM_TimeInitTypeDef类的结构体,它包含指定LPTIM外设的配置信息 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS ADC配置成功 + */ +FL_ErrorStatus FL_ADC_CommonInit(FL_ADC_CommonInitTypeDef *ADC_CommonInitStruct) +{ + FL_ErrorStatus status = FL_PASS; + /* 入口参数检查 */ + assert_param(IS_FL_ADC_CLK_SOURCE(ADC_CommonInitStruct->clockSource)); + assert_param(IS_FL_ADC_REFERENCE_SOURCE(ADC_CommonInitStruct->referenceSource)); + assert_param(IS_FL_ADC_BITWIDTH(ADC_CommonInitStruct->bitWidth)); + if(ADC_CommonInitStruct->clockSource == FL_ADC_CLK_SOURCE_APBCLK) + { + assert_param(IS_FL_ADC_APBCLK_PRESCALER(ADC_CommonInitStruct->clockPrescaler)); + } + else + { + assert_param(IS_FL_ADC_CMUCLK_PRESCALER(ADC_CommonInitStruct->clockPrescaler)); + } + + /* 开启总线时钟 */ + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_ADC); + /* 配置ADC时钟 */ + if(ADC_CommonInitStruct->clockSource == FL_ADC_CLK_SOURCE_APBCLK) + { + /* 设置ADC时钟来源于APBCLK */ + FL_ADC_SetClockSource(ADC, FL_ADC_CLK_SOURCE_APBCLK); + + /* 配置APBCLOCK时钟预分频 */ + FL_ADC_SetAPBPrescaler(ADC, ADC_CommonInitStruct->clockPrescaler << ADC_CFGR1_APBCLK_PSC_Pos); + } + else + { + /* 设置ADC时钟来源于ADCCLK */ + FL_ADC_SetClockSource(ADC, FL_ADC_CLK_SOURCE_ADCCLK); + + /* 设置ADCCLK时钟源 */ + FL_CMU_SetADCClockSource(ADC_CommonInitStruct->clockSource); + + /* 配置ADCCLK时钟预分频 */ + FL_CMU_SetADCPrescaler(ADC_CommonInitStruct->clockPrescaler << CMU_OPCCR2_ADCPRSC_Pos); + + /* 开启操作时钟 */ + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_ADC); + } + /* 配置ADC基准电压*/ + FL_ADC_SetReferenceSource(ADC, ADC_CommonInitStruct->referenceSource); + /* 配置ADC输出位数*/ + FL_ADC_SetBitWidth(ADC, ADC_CommonInitStruct->bitWidth); + return status; +} +/** + * @brief 设置 ADC_CommonInitStruct 为默认配置 + * @param ADC_CommonInitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ADC_CommonInitTypeDef 结构体 + * + * @retval None + */ +void FL_ADC_CommonStructInit(FL_ADC_CommonInitTypeDef *ADC_CommonInitStruct) +{ + /* 默认使用RCHF作为ADC时钟模块时钟源,预分频系数16 */ + ADC_CommonInitStruct->clockSource = FL_CMU_ADC_CLK_SOURCE_RCHF; + ADC_CommonInitStruct->clockPrescaler = FL_CMU_ADC_PSC_DIV16; + ADC_CommonInitStruct->referenceSource = FL_ADC_REF_SOURCE_VDDA; + ADC_CommonInitStruct->bitWidth = FL_ADC_BIT_WIDTH_12B; +} +/** + * @brief 恢复对应的ADC入口地址寄存器为默认值 + * + * @param ADCx 外设入口地址 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS ADC配置成功 + */ +FL_ErrorStatus FL_ADC_DeInit(ADC_Type *ADCx) +{ + FL_ErrorStatus status = FL_PASS; + /* 入口合法性检查 */ + assert_param(IS_FL_ADC_INSTANCE(ADCx)); + /* 外设复位使能 */ + FL_RMU_EnablePeripheralReset(RMU); + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_ADC); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_ADC); + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_ADCCR); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_ADCCR); + FL_RMU_DisablePeripheralReset(RMU); + return status; +} +/** + * @brief 初始化ADCx指定的入口地址的外设寄存器 + * + * @note 用户必须检查此函数的返回值,以确保自校准完成,否则转换结果精度无法保证,除此之外ADC使能过采样实际不会增加ADC的 + * 转换精度只会提高转换结果的稳定性(同时配置移位寄存器的情况下),同时过采样会降低转换速度。 + * @param ADCx 外设入口地址 + * @param ADC_InitStruct 指向一 @ref FL_ADC_InitTypeDef 结构体,它包含指定ADC外设的配置信息 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS ADC配置成功 + */ +FL_ErrorStatus FL_ADC_Init(ADC_Type *ADCx, FL_ADC_InitTypeDef *ADC_InitStruct) +{ + FL_ErrorStatus status = FL_PASS; + uint32_t i = 0,Calibration_Flag; + /* 入口合法性检查 */ + assert_param(IS_FL_ADC_INSTANCE(ADCx)); + assert_param(IS_FL_ADC_CONTINUOUSCONVMODE(ADC_InitStruct->conversionMode)); + assert_param(IS_FL_ADC_AUTO_MODE(ADC_InitStruct->autoMode)); + assert_param(IS_FL_ADC_SCANDIRECTION(ADC_InitStruct->scanDirection)); + assert_param(IS_FL_ADC_EXTERNALTRIGCONV(ADC_InitStruct->externalTrigConv)); + assert_param(IS_FL_ADC_OVERSAMPCOFIG(ADC_InitStruct->oversamplingMode)); + assert_param(IS_FL_ADC_OVERSAMPINGRATIO(ADC_InitStruct->overSampingMultiplier)); + assert_param(IS_FL_ADC_OVERSAMPINGSHIFT(ADC_InitStruct->oversamplingShift)); + FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_VREF1P2); + if(!FL_VREF_IsEnabled(VREF)) + { + FL_VREF_ClearFlag_Ready(VREF); + FL_VREF_Enable(VREF);//置位VREF_EN寄存器,使能VREF1p2模块 + } + FL_VREF_EnableTemperatureSensor(VREF);//置位PTAT_EN寄存器 + while(FL_VREF_IsActiveFlag_Ready(VREF) == 0) /* 等待VREF建立 */ + { + if(i >= 128000) + { + break; + } + i++; + } + FL_ADC_Disable(ADCx); + FL_ADC_DisableOverSampling(ADCx); + FL_ADC_Enable(ADCx); + FL_ADC_EnableCalibration(ADC); + + i = 0; + do + { + Calibration_Flag = FL_ADC_IsActiveFlag_EndOfCalibration(ADC); + i++; + }while((i != 0xFFFFFFFFU) && (Calibration_Flag == 0U)); //等待转换完成 + + if(Calibration_Flag == 0x01) + { + FL_ADC_ClearFlag_EndOfCalibration(ADC); + /* 关闭ADC,关闭后ADC自校准值依然保持 */ + FL_ADC_Disable(ADCx); + if(FL_ADC_IsEnabled(ADCx) == 0U) + { + /* 连续转换模式 */ + FL_ADC_SetConversionMode(ADCx, ADC_InitStruct->conversionMode); + /* 自动转换模式 */ + FL_ADC_SetSingleConversionAutoMode(ADCx, ADC_InitStruct->autoMode); + /* 通道等待使能 */ + if(ADC_InitStruct->waitMode) + { + FL_ADC_EnableWaitMode(ADCx); + } + else + { + FL_ADC_DisableWaitMode(ADCx); + } + /*数据冲突模式设置*/ + if(ADC_InitStruct->overrunMode) + { + FL_ADC_EnableOverrunMode(ADCx); + } + else + { + FL_ADC_DisableOverrunMode(ADCx); + } + /* 多通道扫描方向 */ + FL_ADC_SetSequenceScanDirection(ADCx, ADC_InitStruct->scanDirection); + /* 外部引脚触发 */ + FL_ADC_DisableExternalConversion(ADCx); + /* 触发模式 */ + FL_ADC_SetTriggerEdge(ADCx, ADC_InitStruct->externalTrigConv); + /* 触发源 */ + FL_ADC_SetTriggerSource(ADCx, ADC_InitStruct->triggerSource); + /*通道采样时间设置*/ + FL_ADC_SetFastChannelSamplingTime(ADCx, ADC_InitStruct->fastChannelTime); + FL_ADC_SetSlowChannelSamplingTime(ADCx, ADC_InitStruct->lowChannelTime); + if(ADC_InitStruct->oversamplingMode) + { + /*使能过采样倍数后,需要配置移位寄存器进行移位,这一过程是硬件自动完成的最终最大 + 可输出16位的结果值(即256被采样得到的结果是20bit的,右移4bit结果就是16bit的)*/ + FL_ADC_SetOverSamplingMultiplier(ADCx, ADC_InitStruct->overSampingMultiplier); + FL_ADC_SetOverSamplingShift(ADCx, ADC_InitStruct->oversamplingShift); + /* 过采样使能 */ + FL_ADC_EnableOverSampling(ADCx); + } + else + { + /* 关闭过采样 */ + FL_ADC_DisableOverSampling(ADCx); + } + } + else + { + status = FL_FAIL; + } + } + else + { + status = FL_FAIL; + } + return status; +} + +/** + * @brief 设置 ADC_InitStruct 为默认配置 + * @param ADC_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ADC_InitTypeDef 结构体 + * + * @retval None + */ +void FL_ADC_StructInit(FL_ADC_InitTypeDef *ADC_InitStruct) +{ + ADC_InitStruct->conversionMode = FL_ADC_CONV_MODE_SINGLE; + ADC_InitStruct->autoMode = FL_ADC_SINGLE_CONV_MODE_AUTO; + ADC_InitStruct->scanDirection = FL_ADC_SEQ_SCAN_DIR_FORWARD; + ADC_InitStruct->externalTrigConv = FL_ADC_TRIGGER_EDGE_NONE; + ADC_InitStruct->overrunMode = FL_ENABLE; + ADC_InitStruct->waitMode = FL_ENABLE; + ADC_InitStruct->fastChannelTime = FL_ADC_FAST_CH_SAMPLING_TIME_2_ADCCLK; + ADC_InitStruct->lowChannelTime = FL_ADC_SLOW_CH_SAMPLING_TIME_512_ADCCLK; + ADC_InitStruct->oversamplingMode = FL_ENABLE; + ADC_InitStruct->overSampingMultiplier = FL_ADC_OVERSAMPLING_MUL_16X; + ADC_InitStruct->oversamplingShift = FL_ADC_OVERSAMPLING_SHIFT_4B; +} + +/** + * @} + */ + +#endif /* FL_ADC_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ + + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_aes.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_aes.c new file mode 100644 index 0000000..093c4d5 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_aes.c @@ -0,0 +1,155 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_aes.c + * @author FMSH Application Team + * @brief Src file of AES FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0xx_FL_Driver + * @{ + */ + +/** @addtogroup AES + * @{ + */ + +#ifdef FL_AES_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup AES_FL_Private_Macros + * @{ + */ +#define IS_FL_AES_INSTANCE(INSTANCE) (((INSTANCE) == AES)) + +#define IS_FL_AES_KEYLENTH(__VALUE__) (((__VALUE__) == FL_AES_KEY_LENGTH_128B)||\ + ((__VALUE__) == FL_AES_KEY_LENGTH_192B)||\ + ((__VALUE__) == FL_AES_KEY_LENGTH_256B)) + +#define IS_FL_AES_CIPHERMODE(__VALUE__) (((__VALUE__) == FL_AES_CIPHER_ECB)||\ + ((__VALUE__) == FL_AES_CIPHER_CBC)||\ + ((__VALUE__) == FL_AES_CIPHER_CTR)||\ + ((__VALUE__) == FL_AES_CIPHER_MULTH)) + +#define IS_FL_AES_OPERATIONMODE(__VALUE__) (((__VALUE__) == FL_AES_OPERATION_MODE_ENCRYPTION)||\ + ((__VALUE__) == FL_AES_OPERATION_MODE_KEYDERIVATION)||\ + ((__VALUE__) == FL_AES_OPERATION_MODE_DECRYPTION)||\ + ((__VALUE__) == FL_AES_OPERATION_MODE_KEYDERIVATION_DECRYPTION)) + +#define IS_FL_AES_DATATYPE(__VALUE__) (((__VALUE__) == FL_AES_DATA_TYPE_32B)||\ + ((__VALUE__) == FL_AES_DATA_TYPE_16B)||\ + ((__VALUE__) == FL_AES_DATA_TYPE_8B)||\ + ((__VALUE__) == FL_AES_DATA_TYPE_1B)) +/** + *@} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup AES_FL_EF_Init + * @{ + */ + +/** + * @brief 复位AES 外设寄存器值为复位值 + * + * @param None + * + * @retval FL_ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_AES_DeInit(void) +{ + /* 外设复位使能 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 复位AES */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_AES); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_AES); + /* 关闭总线时钟 */ + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_AES); + /* 锁定外设复位功能 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} +/** + * @brief 根据 AES_InitStructer初始化对应外设入口地址的寄存器值. + * + * @param AESx 外设入口地址 + * @param AES_InitStructer 指向 @ref FL_AES_InitTypeDef 结构体的指针 + * + * @retval FL_ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_AES_Init(AES_Type *AESx, FL_AES_InitTypeDef *AES_InitStructer) +{ + /* 入口合法性检查 */ + assert_param(IS_FL_AES_INSTANCE(AESx)); + assert_param(IS_FL_AES_KEYLENTH(AES_InitStructer->keyLength)); + assert_param(IS_FL_AES_CIPHERMODE(AES_InitStructer->cipherMode)); + assert_param(IS_FL_AES_OPERATIONMODE(AES_InitStructer->operationMode)); + assert_param(IS_FL_AES_DATATYPE(AES_InitStructer->dataType)); + if(FL_AES_IsEnabled(AESx) == 0) + { + /* 开启总线时钟 */ + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_AES); + /* key长度 */ + FL_AES_SetKeySize(AESx, AES_InitStructer->keyLength); + /* 数据流处理模式 */ + FL_AES_SetCipherMode(AESx, AES_InitStructer->cipherMode); + /* 操作模式 */ + FL_AES_SetOperationMode(AESx, AES_InitStructer->operationMode); + /* 数据类型 */ + FL_AES_SetDataType(AESx, AES_InitStructer->dataType); + } + else + { + return FL_FAIL; + } + return FL_PASS; +} +/** + * @brief 设置 AES_InitStruct 为默认配置 + * + * @param AES_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_AES_InitTypeDef 结构体 + * + * @retval None + */ +void FL_AES_StructInit(FL_AES_InitTypeDef *AES_InitStructer) +{ + AES_InitStructer->keyLength = FL_AES_KEY_LENGTH_128B; + AES_InitStructer->cipherMode = FL_AES_CIPHER_ECB; + AES_InitStructer->operationMode = FL_AES_OPERATION_MODE_ENCRYPTION; + AES_InitStructer->dataType = FL_AES_DATA_TYPE_32B; +} + +/** + *@} + */ + +#endif /* FL_AES_DRIVER_ENABLED */ + +/** + *@} + */ + +/** + *@} + */ + +/*********************** (C) COPYRIGHT Fudan Microelectronics *****END OF FILE************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_atim.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_atim.c new file mode 100644 index 0000000..5338b69 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_atim.c @@ -0,0 +1,760 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_atim.c + * @author FMSH Application Team + * @brief Src file of ATIM FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup ATIM + * @{ + */ + +#ifdef FL_ATIM_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup ATIM_FL_Private_Macros + * @{ + */ + + +#define IS_ATIM_INSTANCE(TIMx) ((TIMx) == ATIM) + +#define IS_ATIM_CLKSRC(__VALUE__) (((__VALUE__) == FL_CMU_ATIM_CLK_SOURCE_APBCLK) \ + || ((__VALUE__) == FL_CMU_ATIM_CLK_SOURCE_PLL_X2)) + + +#define IS_FL_ATIM_COUNTERMODE(__VALUE__) (((__VALUE__) == FL_ATIM_COUNTER_DIR_UP) \ + || ((__VALUE__) == FL_ATIM_COUNTER_DIR_DOWN) \ + || ((__VALUE__) == FL_ATIM_COUNTER_ALIGNED_CENTER_DOWN ) \ + || ((__VALUE__) == FL_ATIM_COUNTER_ALIGNED_CENTER_UP ) \ + || ((__VALUE__) == FL_ATIM_COUNTER_ALIGNED_CENTER_UP_DOWN)) + +#define IS_FL_ATIM_CLOCKDIVISION(__VALUE__) (((__VALUE__) == FL_ATIM_CLK_DIVISION_DIV1) \ + || ((__VALUE__) == FL_ATIM_CLK_DIVISION_DIV2) \ + || ((__VALUE__) == FL_ATIM_CLK_DIVISION_DIV4)) + + +#define IS_FL_ATIM_CC_MODE(__VALUE__) (((__VALUE__) == FL_ATIM_CHANNEL_MODE_OUTPUT) \ + || ((__VALUE__) == FL_ATIM_CHANNEL_MODE_INPUT_NORMAL) \ + || ((__VALUE__) == FL_ATIM_CHANNEL_MODE_INPUT_CROSSOVER) \ + || ((__VALUE__) == FL_ATIM_CHANNEL_MODE_INPUT_TRC)) + +#define IS_FL_ATIM_IC_FILTER(__VALUE__) (((__VALUE__) == FL_ATIM_IC_FILTER_DIV1 ) \ + || ((__VALUE__) ==FL_ATIM_IC_FILTER_DIV1_N2) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV1_N4) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV1_N8) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV2_N6) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV2_N8) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV4_N6) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV4_N8) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV8_N6) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV8_N8) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV16_N5) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV16_N6) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV16_N8) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV32_N5) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV32_N6) \ + || ((__VALUE__) == FL_ATIM_IC_FILTER_DIV32_N8)) + +#define IS_FL_ATIM_CHANNEL(__VALUE__) (((__VALUE__) == FL_ATIM_CHANNEL_1)\ + || ((__VALUE__) == FL_ATIM_CHANNEL_2)\ + || ((__VALUE__) == FL_ATIM_CHANNEL_3)\ + || ((__VALUE__) == FL_ATIM_CHANNEL_4)) + + + +#define IS_FL_ATIM_SLAVE_MODE(__VALUE__) (((__VALUE__) == FL_ATIM_SLAVE_MODE_PROHIBITED)\ + || ((__VALUE__) == FL_ATIM_SLAVE_MODE_ENCODER_X2_TI1)\ + || ((__VALUE__) == FL_ATIM_SLAVE_MODE_ENCODER_X2_TI2)\ + || ((__VALUE__) == FL_ATIM_SLAVE_MODE_ENCODER_X4_TI1TI2)\ + || ((__VALUE__) == FL_ATIM_SLAVE_MODE_TRGI_RISE_RST)\ + || ((__VALUE__) == FL_ATIM_SLAVE_MODE_TRGI_HIGH_RUN)\ + || ((__VALUE__) == FL_ATIM_SLAVE_MODE_TRGI_RISE_RUN)\ + || ((__VALUE__) == FL_ATIM_SLAVE_MODE_TRGI_CLK)) + + +#define IS_FL_ATIM_TRIGGER_SRC(__VALUE__) (((__VALUE__) == FL_ATIM_TRGI_ITR0 )\ + ||((__VALUE__) ==FL_ATIM_TRGI_ITR1 )\ + ||((__VALUE__) ==FL_ATIM_TRGI_ITR2)\ + ||((__VALUE__) ==FL_ATIM_TRGI_ITR3)\ + ||((__VALUE__) ==FL_ATIM_TRGI_TI1F_EDGE)\ + ||((__VALUE__) ==FL_ATIM_TRGI_TI1FP1)\ + ||((__VALUE__) ==FL_ATIM_TRGI_TI2FP2)\ + ||((__VALUE__) ==FL_ATIM_TRGI_ETRF)) + + + +#define IS_FL_ATIM_ETP_FILTER(__VALUE__) (((__VALUE__) == FL_ATIM_ETR_FILTER_DIV1) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV1_N2) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV1_N4) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV1_N8) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV2_N6) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV2_N8) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV4_N6) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV4_N8) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV8_N6) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV8_N8) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV16_N5) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV16_N6) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV16_N8) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV32_N5) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV32_N6) \ + || ((__VALUE__) == FL_ATIM_ETR_FILTER_DIV32_N8)) + + +#define IS_FL_ATIM_ETR_PSC(__VALUE__) (((__VALUE__) == FL_ATIM_ETR_PSC_DIV1) \ + || ((__VALUE__) == FL_ATIM_ETR_PSC_DIV2) \ + || ((__VALUE__) == FL_ATIM_ETR_PSC_DIV4) \ + || ((__VALUE__) == FL_ATIM_ETR_PSC_DIV8)) + + + +#define IS_FL_ATIM_ETR_POLARITY(__VALUE__) (((__VALUE__) == FL_ATIM_ETR_POLARITY_NORMAL) \ + || ((__VALUE__) == FL_ATIM_ETR_POLARITY_INVERT)) + + + +#define IS_FL_ATIM_IC_POLARITY(__VALUE__) (((__VALUE__) == FL_ATIM_IC_POLARITY_NORMAL) \ + || ((__VALUE__) == FL_ATIM_IC_POLARITY_INVERT)) + + + +#define IS_FL_ATIM_IC_ACTIVEINPUT(__VALUE__) (((__VALUE__) == FL_ATIM_CHANNEL_MODE_INPUT_NORMAL) \ + || ((__VALUE__) == FL_ATIM_CHANNEL_MODE_INPUT_CROSSOVER) \ + || ((__VALUE__) == FL_ATIM_CHANNEL_MODE_INPUT_TRC)) + + +#define IS_FL_ATIM_IC_PRESCALER(__VALUE__) (((__VALUE__) == FL_ATIM_IC_PSC_DIV1) \ + || ((__VALUE__) == FL_ATIM_IC_PSC_DIV2) \ + || ((__VALUE__) == FL_ATIM_IC_PSC_DIV4) \ + || ((__VALUE__) == FL_ATIM_IC_PSC_DIV8)) + + + +#define IS_FL_ATIM_OC_POLARITY(__VALUE__) (((__VALUE__) == FL_ATIM_OC_POLARITY_NORMAL) \ + || ((__VALUE__) == FL_ATIM_OC_POLARITY_INVERT)) + + + +#define IS_FL_ATIM_OC_MODE(__VALUE__) (((__VALUE__) == FL_ATIM_OC_MODE_FROZEN) \ + || ((__VALUE__) == FL_ATIM_OC_MODE_ACTIVE) \ + || ((__VALUE__) == FL_ATIM_OC_MODE_INACTIVE) \ + || ((__VALUE__) == FL_ATIM_OC_MODE_TOGGLE) \ + || ((__VALUE__) == FL_ATIM_OC_MODE_FORCED_INACTIVE) \ + || ((__VALUE__) == FL_ATIM_OC_MODE_FORCED_ACTIVE) \ + || ((__VALUE__) == FL_ATIM_OC_MODE_PWM1) \ + || ((__VALUE__) == FL_ATIM_OC_MODE_PWM2)) + +#define IS_FL_ATIM_AUTORELOAB_STATE(__VALUE__) (((__VALUE__) == FL_ENABLE) \ + || ((__VALUE__) == FL_DISABLE)) + +#define IS_FL_ATIM_OC_FASTMODE(__VALUE__) (((__VALUE__) == FL_ENABLE) \ + || ((__VALUE__) == FL_DISABLE)) + +#define IS_FL_ATIM_OC_PRELOAD(__VALUE__) (((__VALUE__) == FL_ENABLE) \ + || ((__VALUE__) == FL_DISABLE)) + +#define IS_FL_ATIM_OC_ETR_CLEARN(__VALUE__) (((__VALUE__) == FL_ENABLE) \ + || ((__VALUE__) == FL_DISABLE)) + +#define IS_FL_ATIM_OCN_STATE(__VALUE__) (((__VALUE__) == FL_ENABLE)\ + || ((__VALUE__) == FL_DISABLE)) + +#define IS_FL_ATIM_OC_STATE(__VALUE__) (((__VALUE__) == FL_ENABLE)\ + || ((__VALUE__) == FL_DISABLE)) + +#define IS_FL_ATIM_OC_IDLESTATE(__VALUE__) (((__VALUE__) == FL_ATIM_OC_IDLE_STATE_LOW) \ + || ((__VALUE__) == FL_ATIM_OC_IDLE_STATE_HIGH)) + +#define IS_FL_ATIM_OC_NIDLESTATE(__VALUE__) (((__VALUE__) == FL_ATIM_OCN_IDLE_STATE_LOW) \ + || ((__VALUE__) == FL_ATIM_OCN_IDLE_STATE_HIGH)) + + +#define IS_FL_ATIM_OC_NPOLARITY(__VALUE__) (((__VALUE__) == FL_ATIM_OCN_POLARITY_NORMAL) \ + || ((__VALUE__) == FL_ATIM_OCN_POLARITY_INVERT)) + + + +#define IS_FL_ATIM_BDTR_FILTER(__VALUE__) (((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV1) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV1_N2) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV1_N4) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV1_N8) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV2_N6) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV2_N8) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV4_N6) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV4_N8) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV8_N6) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV8_N8) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV16_N5) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV16_N6) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV16_N8) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV32_N5) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV32_N6) \ + || ((__VALUE__) == FL_ATIM_BREAK_FILTER_DIV32_N8)) + +#define IS_FL_ATIM_OSSR_STATE(__VALUE__) (((__VALUE__) == FL_ATIM_OSSR_DISABLE) \ + || ((__VALUE__) == FL_ATIM_OSSR_ENABLE)) + +#define IS_FL_ATIM_OSSI_STATE(__VALUE__) (((__VALUE__) == FL_ATIM_OSSI_DISABLE) \ + || ((__VALUE__) == FL_ATIM_OSSI_ENABLE)) + +#define IS_FL_ATIM_LOCK_LEVEL(__VALUE__) (((__VALUE__) == FL_ATIM_LOCK_LEVEL_OFF) \ + || ((__VALUE__) == FL_ATIM_LOCK_LEVEL_1) \ + || ((__VALUE__) == FL_ATIM_LOCK_LEVEL_2) \ + || ((__VALUE__) == FL_ATIM_LOCK_LEVEL_3)) + +#define IS_FL_ATIM_BREAK_POLARITY(__VALUE__) (((__VALUE__) == FL_ATIM_BREAK_POLARITY_LOW) \ + || ((__VALUE__) == FL_ATIM_BREAK_POLARITY_HIGH)) + +#define IS_FL_ATIM_AUTOMATIC_OUTPUT_STATE(__VALUE__) (((__VALUE__) == FL_DISABLE) \ + || ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_ATIM_TRIGGER_DELAY(__VALUE__) (((__VALUE__) == FL_DISABLE) \ + || ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_ATIM_IC_CAPTURE_STATE(__VALUE__) (((__VALUE__) == FL_DISABLE) \ + || ((__VALUE__) == FL_ENABLE)) + +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup TIM_FL_Private_Functions TIM Private Functions + * @{ + */ +static FL_ErrorStatus OCConfig(ATIM_Type *TIMx, uint32_t Channel, FL_ATIM_OC_InitTypeDef *TIM_OC_InitStruct); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIM_FL_EF_Init + * @{ + */ + +/** + * @brief 复位对应ATIMx寄存器. + * @param ATIMx + * @retval ErrorStatus枚举值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_ATIM_DeInit(ATIM_Type *TIMx) +{ + FL_ErrorStatus result = FL_PASS; + /* Check the parameters */ + assert_param(IS_ATIM_INSTANCE(TIMx)); + /* 使能外设复位 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 复位ATIM外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_ATIM); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_ATIM); + /* 关闭外设总线始时钟和工作时钟 */ + FL_CMU_DisableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_ATIM); + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_ATIM); + /* 锁定外设复位 */ + FL_RMU_DisablePeripheralReset(RMU); + return result; +} +/** + * @brief 配置基本定时器时基单元(内部时钟源). + * @param TIMx Timer Instance + * @param TIM_InitStruct 指向一个 @ref FL_ATIM_InitTypeDef(时基配置结构体) + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ + +FL_ErrorStatus FL_ATIM_Init(ATIM_Type *TIMx, FL_ATIM_InitTypeDef *TIM_InitStruct) +{ + uint32_t i = 5; + /* 参数检查 */ + assert_param(IS_ATIM_INSTANCE(TIMx)); + assert_param(IS_FL_ATIM_COUNTERMODE(TIM_InitStruct->counterMode)); + assert_param(IS_FL_ATIM_CLOCKDIVISION(TIM_InitStruct->clockDivision)); + assert_param(IS_FL_ATIM_AUTORELOAB_STATE(TIM_InitStruct->autoReloadState)); + assert_param(IS_ATIM_CLKSRC(TIM_InitStruct->clockSource)); + /* 时钟总线使能配置 */ + FL_CMU_SetATIMClockSource(TIM_InitStruct->clockSource); + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_ATIM); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_ATIM); + /* 设置重复计数值 */ + FL_ATIM_WriteRepetitionCounter(TIMx, TIM_InitStruct->repetitionCounter); + /* 计数器计数模式配置 */ + switch(TIM_InitStruct->counterMode) + { + /* 中心对称模式 */ + case FL_ATIM_COUNTER_ALIGNED_CENTER_DOWN : + case FL_ATIM_COUNTER_ALIGNED_CENTER_UP : + case FL_ATIM_COUNTER_ALIGNED_CENTER_UP_DOWN: + FL_ATIM_SetCounterDirection(TIMx,FL_ATIM_COUNTER_DIR_UP); + FL_ATIM_SetCounterAlignedMode(TIMx, TIM_InitStruct->counterMode); + break; + default: + /* 边沿模式 */ + FL_ATIM_SetCounterDirection(TIMx, TIM_InitStruct->counterMode); + FL_ATIM_SetCounterAlignedMode(TIMx, FL_ATIM_COUNTER_ALIGNED_EDGE); + break; + } + /* 自动重装载值 */ + FL_ATIM_WriteAutoReload(TIMx, TIM_InitStruct->autoReload); + /* 定时器分频系数与数字滤波器所使用的采样时钟分频比 */ + FL_ATIM_SetClockDivision(TIMx, TIM_InitStruct->clockDivision); + /* 时钟分频 */ + FL_ATIM_WritePrescaler(TIMx, TIM_InitStruct->prescaler); + /* 预装载配置 */ + if(TIM_InitStruct->autoReloadState == FL_ENABLE) + { + FL_ATIM_EnableARRPreload(TIMx); + } + else + { + FL_ATIM_DisableARRPreload(TIMx); + } + /* 手动触发更新事件,将配置值写入 */ + FL_ATIM_GenerateUpdateEvent(TIMx); + while((!FL_ATIM_IsActiveFlag_Update(ATIM))&&i) + { + i--; + } + /*清除UIF标志,防止产生UG事件中断*/ + FL_ATIM_ClearFlag_Update(ATIM); + return FL_PASS; +} + +/** + * @brief 设置 FL_ATIM_InitTypeDef 为默认配置 + * @param TIM_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ATIM_InitTypeDef 结构体 + * + * @retval None + */ +void FL_ATIM_StructInit(FL_ATIM_InitTypeDef *TIM_InitStruct) +{ + /* Set the default configuration */ + TIM_InitStruct->clockSource = FL_CMU_ATIM_CLK_SOURCE_APBCLK; + TIM_InitStruct->prescaler = (uint16_t)0x0000; + TIM_InitStruct->counterMode = FL_ATIM_COUNTER_DIR_UP; + TIM_InitStruct->autoReload = 0xFFFFU; + TIM_InitStruct->clockDivision = FL_ATIM_CLK_DIVISION_DIV1; + TIM_InitStruct->repetitionCounter = 0; + TIM_InitStruct->autoReloadState = FL_DISABLE; +} + +/** + * @brief 配置基本定时器从模式,包括编码器模式. + * @param TIMx Timer Instance + * @param TIM_InitStruct 指向一个 @ref FL_ATIM_SlaveInitTypeDef 结构体 + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_ATIM_SlaveMode_Init(ATIM_Type *TIMx, FL_ATIM_SlaveInitTypeDef *TIM_InitStruct) +{ + /* 参数检查 */ + assert_param(IS_ATIM_INSTANCE(TIMx)); + assert_param(IS_FL_ATIM_TRIGGER_DELAY(TIM_InitStruct->triggerDelay)); + assert_param(IS_FL_ATIM_TRIGGER_SRC(TIM_InitStruct->triggerSrc)); + assert_param(IS_FL_ATIM_SLAVE_MODE(TIM_InitStruct->slaveMode)); + /* 时钟总线使能配置 */ + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_ATIM); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_ATIM); + /* 触发延迟默认关闭 */ + FL_ATIM_DisableMasterSlaveMode(TIMx); + /* 关闭从模式以能写入TS */ + FL_ATIM_SetSlaveMode(TIMx, 0); + /* 从模式输入源选择 */ + FL_ATIM_SetTriggerInput(TIMx, TIM_InitStruct->triggerSrc); + /* 从模式选择 */ + FL_ATIM_SetSlaveMode(TIMx, TIM_InitStruct->slaveMode); + /* 触发延迟默认关闭 */ + if(TIM_InitStruct->triggerDelay == FL_ENABLE) + { + FL_ATIM_EnableMasterSlaveMode(TIMx); + } + return FL_PASS; +} +/** + * @brief 设置 FL_ATIM_SlaveInitTypeDef 为默认配置 + * @param TIM_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ATIM_SlaveInitTypeDef 结构体 + * + * @retval None + */ +void FL_ATIM_SlaveModeStructInit(FL_ATIM_SlaveInitTypeDef *TIM_InitStruct) +{ + TIM_InitStruct->slaveMode = FL_ATIM_SLAVE_MODE_PROHIBITED; + TIM_InitStruct->triggerSrc = FL_ATIM_TRGI_TI1FP1; + TIM_InitStruct->triggerDelay = FL_DISABLE; +} + +/** + * @brief 配置TIM的输入捕获通道. + * @param TIMx Timer Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_0 + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @param TIM_IC_InitStruct 指向一个 @ref FL_ATIM_IC_InitTypeDef 结构体 + * @retval TIM_OC_InitStruct pointer to a @ref FL_ATIM_OC_InitTypeDef structure + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_ATIM_IC_Init(ATIM_Type *TIMx, uint32_t channel, FL_ATIM_IC_InitTypeDef *IC_InitStruct) +{ + /* 参数检查 */ + assert_param(IS_FL_ATIM_CHANNEL(channel)); + assert_param(IS_FL_ATIM_IC_CAPTURE_STATE(IC_InitStruct->captureState)); + assert_param(IS_FL_ATIM_IC_POLARITY(IC_InitStruct->ICPolarity)); + assert_param(IS_FL_ATIM_IC_ACTIVEINPUT(IC_InitStruct->ICActiveInput)); + assert_param(IS_FL_ATIM_IC_PRESCALER(IC_InitStruct->ICPrescaler)); + assert_param(IS_FL_ATIM_IC_FILTER(IC_InitStruct->ICFilter)); + /* 时钟总线使能配置 */ + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_ATIM); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_ATIM); + /* 通道关闭 */ + FL_ATIM_OC_DisableChannel(TIMx, channel); + /*捕获极性 */ + FL_ATIM_IC_SetChannelPolarity(TIMx, IC_InitStruct->ICPolarity, channel); + /* 捕获映射通道 */ + FL_ATIM_CC_SetChannelMode(TIMx, IC_InitStruct->ICActiveInput, channel); + /* 捕获预分频 */ + FL_ATIM_IC_SetPrescaler(TIMx, IC_InitStruct->ICPrescaler, channel); + /* 捕获滤波器 */ + FL_ATIM_IC_SetFilter(TIMx, IC_InitStruct->ICFilter, channel); + if(IC_InitStruct->captureState == FL_ENABLE) + { + FL_ATIM_IC_EnableChannel(TIMx, channel); + } + return FL_PASS; +} +/** + * @brief 设置 FL_ATIM_IC_InitTypeDef 为默认配置 + * @param TIM_ICInitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ATIM_IC_InitTypeDef 结构体 + * + * @retval None + */ +void FL_ATIM_IC_StructInit(FL_ATIM_IC_InitTypeDef *TIM_ICInitStruct) +{ + /* 默认配置 */ + TIM_ICInitStruct->ICPolarity = FL_ATIM_IC_POLARITY_NORMAL; + TIM_ICInitStruct->ICActiveInput = FL_ATIM_CHANNEL_MODE_INPUT_NORMAL; + TIM_ICInitStruct->ICPrescaler = FL_ATIM_IC_PSC_DIV1; + TIM_ICInitStruct->ICFilter = FL_ATIM_IC_FILTER_DIV1; + TIM_ICInitStruct->captureState = FL_DISABLE; +} +/** + * @brief 配置TIM触发输入捕获通道ETR. + * @param TIMx Timer Instance + * @param ETPolarity 极性 + * @param ETPrescaler 分频 + * @param ETR_Filter 滤波 + * @param TIM_IC_InitStruct 指向一个 @ref FL_ATIM_IC_InitTypeDef 结构体 + * @retval TIM_OC_InitStruct pointer to a @ref FL_ATIM_OC_InitTypeDef structure + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_ATIM_ETR_Init(ATIM_Type *TIMx, FL_ATIM_ETR_InitTypeDef *TIM_InitStruct) +{ + assert_param(IS_FL_ATIM_ETP_FILTER(TIM_InitStruct->ETRFilter)); + assert_param(IS_FL_ATIM_ETR_PSC(TIM_InitStruct->ETRClockDivision)); + assert_param(IS_FL_ATIM_ETR_POLARITY(TIM_InitStruct->ETRPolarity)); + /* 时钟总线使能配置 */ + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_ATIM); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_ATIM); + /* 外部时钟极性 */ + FL_ATIM_SetETRPolarity(TIMx, TIM_InitStruct->ETRPolarity); + /* 外部时钟滤波 */ + FL_ATIM_SetETRFilter(TIMx, TIM_InitStruct->ETRFilter); + /* 外部时钟分频 */ + FL_ATIM_SetETRPrescaler(TIMx, TIM_InitStruct->ETRClockDivision); + if(TIM_InitStruct->useExternalTrigger == FL_ENABLE) + { + FL_ATIM_EnableExternalClock(TIMx); + } + else + { + FL_ATIM_DisableExternalClock(TIMx); + } + return FL_PASS; +} + +void FL_ATIM_ETRStructInit(FL_ATIM_ETR_InitTypeDef *TIM_InitStruct) +{ + TIM_InitStruct->useExternalTrigger = FL_DISABLE; + TIM_InitStruct->ETRFilter = FL_ATIM_ETR_FILTER_DIV1; + TIM_InitStruct->ETRPolarity = FL_ATIM_ETR_POLARITY_NORMAL; + TIM_InitStruct->ETRClockDivision = FL_ATIM_ETR_PSC_DIV1; +} +/** + * @brief 配置 + * @param TIMx Timer Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @param TIM_ICInitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ATIM_IC_InitTypeDef 结构体包含配置参数. + * @retval None + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +static FL_ErrorStatus OCConfig(ATIM_Type *TIMx, uint32_t channel, FL_ATIM_OC_InitTypeDef *TIM_OC_InitStruct) +{ + FL_ErrorStatus result = FL_PASS; + /* 配置比较输出通道模式 */ + FL_ATIM_OC_SetMode(TIMx, TIM_OC_InitStruct->OCMode, channel); + /* 配置TRF清零使能 */ + if(TIM_OC_InitStruct->OCETRFStatus == FL_ENABLE) + { + FL_ATIM_OC_EnableClear(TIMx, channel); + } + else + { + FL_ATIM_OC_DisableClear(TIMx, channel); + } + /* 比较输出通道快速模式 */ + if(TIM_OC_InitStruct->OCFastMode == FL_ENABLE) + { + FL_ATIM_OC_EnableFastMode(TIMx, channel); + } + else + { + FL_ATIM_OC_DisableFastMode(TIMx, channel); + } + /* 比较输出通道缓冲模式 */ + if(TIM_OC_InitStruct->OCPreload == FL_ENABLE) + { + FL_ATIM_OC_EnablePreload(TIMx, channel); + } + else + { + FL_ATIM_OC_DisablePreload(TIMx, channel); + } + if(TIM_OC_InitStruct->OCNState == FL_ENABLE) + { + FL_ATIM_OC_EnableReverseChannel(TIMx, channel); + } + else + { + FL_ATIM_OC_DisableReverseChannel(TIMx, channel); + } + if(TIM_OC_InitStruct->OCState == FL_ENABLE) + { + /* 通道使能 */ + FL_ATIM_OC_EnableChannel(TIMx, channel); + } + else + { + FL_ATIM_OC_DisableChannel(TIMx, channel); + } + /* 设置比较值 */ + switch(channel) + { + case FL_ATIM_CHANNEL_1: + FL_ATIM_WriteCompareCH1(TIMx, TIM_OC_InitStruct->compareValue); + break; + case FL_ATIM_CHANNEL_2: + FL_ATIM_WriteCompareCH2(TIMx, TIM_OC_InitStruct->compareValue); + break; + case FL_ATIM_CHANNEL_3: + FL_ATIM_WriteCompareCH3(TIMx, TIM_OC_InitStruct->compareValue); + break; + case FL_ATIM_CHANNEL_4: + FL_ATIM_WriteCompareCH4(TIMx, TIM_OC_InitStruct->compareValue); + break; + default : + result = FL_FAIL; + break; + } + return result; +} +/** + * @brief 配置TIM的比较输出通道. + * @param TIMx Timer Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref FL_ATIM_CHANNEL_1 + * @arg @ref FL_ATIM_CHANNEL_2 + * @arg @ref FL_ATIM_CHANNEL_3 + * @arg @ref FL_ATIM_CHANNEL_4 + * @retval TIM_OC_InitStruct pointer to a @ref FL_ATIM_OC_InitTypeDef structure + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_ATIM_OC_Init(ATIM_Type *TIMx, uint32_t channel, FL_ATIM_OC_InitTypeDef *TIM_OC_InitStruct) +{ + uint32_t i = 5; + FL_ErrorStatus result = FL_PASS; + /* 参数检查 */ + assert_param(IS_ATIM_INSTANCE(TIMx)); + assert_param(IS_FL_ATIM_OC_MODE(TIM_OC_InitStruct->OCMode)); + assert_param(IS_FL_ATIM_OC_PRELOAD(TIM_OC_InitStruct->OCPreload)); + assert_param(IS_FL_ATIM_OC_POLARITY(TIM_OC_InitStruct->OCPolarity)); + assert_param(IS_FL_ATIM_OC_FASTMODE(TIM_OC_InitStruct->OCFastMode)); + assert_param(IS_FL_ATIM_OC_ETR_CLEARN(TIM_OC_InitStruct->OCETRFStatus)); + assert_param(IS_FL_ATIM_OCN_STATE(TIM_OC_InitStruct->OCNState)); + assert_param(IS_FL_ATIM_OC_STATE(TIM_OC_InitStruct->OCState)); + assert_param(IS_FL_ATIM_OC_IDLESTATE(TIM_OC_InitStruct->OCIdleState)); + assert_param(IS_FL_ATIM_OC_NIDLESTATE(TIM_OC_InitStruct->OCNIdleState)); + assert_param(IS_FL_ATIM_OC_NPOLARITY(TIM_OC_InitStruct->OCNPolarity)); + /* 通道关闭 */ + FL_ATIM_OC_DisableChannel(TIMx, channel); + FL_ATIM_OC_DisableReverseChannel(TIMx, channel); + /* 通道极性 */ + FL_ATIM_OC_SetChannelPolarity(TIMx, TIM_OC_InitStruct->OCPolarity, channel); + /* 通道空闲电平 */ + FL_ATIM_OC_SetChannelIdleState(TIMx, TIM_OC_InitStruct->OCIdleState, channel); + /* 互补通道空闲电平 */ + FL_ATIM_OC_SetReverseChannelIdleState(TIMx, TIM_OC_InitStruct->OCNIdleState, channel); + /* 互补通道极性 */ + FL_ATIM_OC_SetReverseChannelPolarity(TIMx, TIM_OC_InitStruct->OCNPolarity, channel); + /* 捕获映射到输出通道 */ + FL_ATIM_CC_SetChannelMode(TIMx, FL_ATIM_CHANNEL_MODE_OUTPUT, channel); + /* 输出比较模式寄存器配置 */ + OCConfig(TIMx, channel, TIM_OC_InitStruct); + /* 手动触发更新事件,将配置值写入 */ + FL_ATIM_GenerateUpdateEvent(TIMx); + while((!FL_ATIM_IsActiveFlag_Update(ATIM))&&i) + { + i--; + } + /*清除UIF标志,防止产生UG事件中断*/ + FL_ATIM_ClearFlag_Update(ATIM); + return result; +} +/** + * @brief 设置 FL_ATIM_OC_InitTypeDef 为默认配置 + * @param TIM_OC_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ATIM_OC_InitTypeDef 结构体 + * + * @retval None + */ +void FL_ATIM_OC_StructInit(FL_ATIM_OC_InitTypeDef *TIM_OC_InitStruct) +{ + /* Set the default configuration */ + TIM_OC_InitStruct->OCMode = FL_ATIM_OC_MODE_FROZEN; + TIM_OC_InitStruct->OCETRFStatus = FL_DISABLE; + TIM_OC_InitStruct->OCFastMode = FL_DISABLE; + TIM_OC_InitStruct->compareValue = 0x00000000U; + TIM_OC_InitStruct->OCPolarity = FL_ATIM_OC_POLARITY_NORMAL; + TIM_OC_InitStruct->OCPreload = FL_DISABLE; + TIM_OC_InitStruct->OCIdleState = FL_ATIM_OC_IDLE_STATE_LOW; + TIM_OC_InitStruct->OCNIdleState = FL_ATIM_OCN_IDLE_STATE_LOW; + TIM_OC_InitStruct->OCNPolarity = FL_ATIM_OCN_POLARITY_NORMAL; + TIM_OC_InitStruct->OCNState = FL_DISABLE; +} + +/** + * @brief 配置TIM的输入捕获通道. + * @param TIMx Timer Instance + * @param TIM_IC_InitStruct 指向一个 @ref FL_ATIM_IC_InitTypeDef 结构体 + * @retval TIM_OC_InitStruct pointer to a @ref FL_ATIM_OC_InitTypeDef structure + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_ATIM_BDTR_Init(ATIM_Type *TIMx, FL_ATIM_BDTR_InitTypeDef *TIM_BDTR_InitStruct) +{ + FL_ErrorStatus result = FL_PASS; + /* 参数检查 */ + assert_param(IS_ATIM_INSTANCE(TIMx)); + assert_param(IS_FL_ATIM_OSSR_STATE(TIM_BDTR_InitStruct->OSSRState)); + assert_param(IS_FL_ATIM_OSSI_STATE(TIM_BDTR_InitStruct->OSSIState)); + assert_param(IS_FL_ATIM_LOCK_LEVEL(TIM_BDTR_InitStruct->lockLevel)); + assert_param(IS_FL_ATIM_BREAK_POLARITY(TIM_BDTR_InitStruct->breakPolarity)); + assert_param(IS_FL_ATIM_AUTOMATIC_OUTPUT_STATE(TIM_BDTR_InitStruct->automaticOutput)); + assert_param(IS_FL_ATIM_BDTR_FILTER(TIM_BDTR_InitStruct->breakFilter)); + /* 关闭所有输出 */ + FL_ATIM_DisableALLOutput(TIMx); + /* 设置死区时间 */ + FL_ATIM_WriteDeadTime(TIMx, TIM_BDTR_InitStruct->deadTime); + /* 设置寄存器锁定等级 */ + FL_ATIM_SetLockLevel(TIMx, TIM_BDTR_InitStruct->lockLevel); + /* Idle状态下关闭状态 */ + FL_ATIM_SetOffStateIdle(TIMx, TIM_BDTR_InitStruct->OSSIState); + /* run状态下关闭状态 */ + FL_ATIM_SetOffStateRun(TIMx, TIM_BDTR_InitStruct->OSSRState); + /* 门控1刹车信号 */ + FL_ATIM_SetBreak1GateState(TIMx, TIM_BDTR_InitStruct->gatedBrakeSignal_1); + /* 门控2刹车信号 */ + FL_ATIM_SetBreak2GateState(TIMx, TIM_BDTR_InitStruct->gatedBrakeSignal_2); + /* 门控刹车信号组合方式设置 */ + FL_ATIM_SetBreakSignalCombination(TIMx, TIM_BDTR_InitStruct->brakeSignalCombined); + /* 刹车极性设置 */ + FL_ATIM_SetBreakPolarity(TIMx, TIM_BDTR_InitStruct->breakPolarity); + /* 更新时间自动设置输出配置,如果刹车事件发生过并且当前功能使能,则下一个更新事件将重新自动输出 */ + if(TIM_BDTR_InitStruct->automaticOutput == FL_ENABLE) + { + FL_ATIM_EnableAutomaticOutput(TIMx); + } + else + { + FL_ATIM_DisableAutomaticOutput(TIMx); + } + /* 刹车功能开关配置 */ + if(TIM_BDTR_InitStruct->breakState == FL_ENABLE) + { + FL_ATIM_EnableBreak(TIMx); + } + else + { + FL_ATIM_DisableBreak(TIMx); + } + /* 使能全部输出 */ + FL_ATIM_EnableALLOutput(TIMx); + return result; +} +/** + * @brief 设置 FL_ATIM_IC_InitTypeDef 为默认配置 + * @param TIM_ICInitStruct 指向需要将值设置为默认配置的结构体 @ref FL_ATIM_IC_InitTypeDef 结构体 + * + * @retval None + */ +void FL_ATIM_BDTR_StructInit(FL_ATIM_BDTR_InitTypeDef *TIM_BDTR_InitStruct) +{ + TIM_BDTR_InitStruct->deadTime = 0x00; + TIM_BDTR_InitStruct->lockLevel = FL_ATIM_LOCK_LEVEL_OFF; + TIM_BDTR_InitStruct->OSSRState = FL_ATIM_OSSR_DISABLE; + TIM_BDTR_InitStruct->OSSIState = FL_ATIM_OSSI_DISABLE; + TIM_BDTR_InitStruct->breakFilter = FL_ATIM_BREAK_FILTER_DIV1; + TIM_BDTR_InitStruct->breakPolarity = FL_ATIM_BREAK_POLARITY_LOW; + TIM_BDTR_InitStruct->automaticOutput = FL_DISABLE; + TIM_BDTR_InitStruct->gatedBrakeSignal_1 = FL_ATIM_BREAK1_GATE_AUTO; + TIM_BDTR_InitStruct->gatedBrakeSignal_2 = FL_ATIM_BREAK2_GATE_AUTO; + TIM_BDTR_InitStruct->breakState = FL_DISABLE; + TIM_BDTR_InitStruct->brakeSignalCombined = FL_ATIM_BREAK_COMBINATION_OR; +} + +/** + * @} + */ + +#endif /* FL_ATIM_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_bstim16.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_bstim16.c new file mode 100644 index 0000000..5385628 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_bstim16.c @@ -0,0 +1,157 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_bstim16.c + * @author FMSH Application Team + * @brief Src file of BSTIM FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup BSTIM16 + * @{ + */ + +#ifdef FL_BSTIM16_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup BSTIM16_FL_Private_Macros + * @{ + */ +#define IS_FL_BSTIM16_INSTANCE(INTANCE) ((INTANCE) == BSTIM16) + +#define IS_FL_BSTIM16_PSC(__VALUE__) ((__VALUE__) <= 0x0000FFFF) + +#define IS_FL_BSTIM16_AUTORELOAD(__VALUE__) ((__VALUE__) <= 0x0000FFFF) + + +#define IS_FL_BSTIM16_AUTORELOAD_MODE(__VALUE__) (((__VALUE__) == FL_ENABLE)||\ + ((__VALUE__) == FL_DISABLE)) + +#define IS_FL_BSTIM16_CLOCK_SRC(__VALUE__) (((__VALUE__) == FL_CMU_BSTIM16_CLK_SOURCE_APBCLK)||\ + ((__VALUE__) == FL_CMU_BSTIM16_CLK_SOURCE_RCLP)||\ + ((__VALUE__) == FL_CMU_BSTIM16_CLK_SOURCE_RCLF)||\ + ((__VALUE__) == FL_CMU_BSTIM16_CLK_SOURCE_LSCLK)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup BSTIM16_FL_EF_Init + * @{ + */ + +/** + * @brief 复位对应BSTIM16寄存器. + * @param BSTIMx + * @retval ErrorStatus枚举值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_BSTIM16_DeInit(BSTIM16_Type *BSTIM16x) +{ + assert_param(IS_FL_BSTIM16_INSTANCE(BSTIM16x)); + /* 使能外设复位 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 复位IIC外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_BSTIM16); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_BSTIM16); + /* 关闭外设总线始时钟和工作时钟 */ + FL_CMU_DisableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_BSTIM16); + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_BSTIM16); + /* 锁定外设复位 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} +/** + * @brief 根据 BSTIM16_InitStruct 的配置信息初始化对应外设入口地址的寄存器值. + * @param BSTIMx BSTIMx + * @param BSTIM16_InitStruct 指向一个 @ref FL_BSTIM16_InitTypeDef 结构体 + * 其中包含了外设的相关配置信息. + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 配置成功 + */ +FL_ErrorStatus FL_BSTIM16_Init(BSTIM16_Type *BSTIM16x, FL_BSTIM16_InitTypeDef *init) +{ + uint32_t i = 5; + /* 参数检查 */ + assert_param(IS_FL_BSTIM16_INSTANCE(BSTIM16x)); + assert_param(IS_FL_BSTIM16_CLOCK_SRC(init->clockSource)); + assert_param(IS_FL_BSTIM16_PSC(init->prescaler)); + assert_param(IS_FL_BSTIM16_AUTORELOAD(init->autoReload)); + assert_param(IS_FL_BSTIM16_AUTORELOAD_MODE(init->autoReloadState)); + /* 时钟使能 */ + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_BSTIM16); + /* 选择时钟源 */ + FL_CMU_SetBSTIM16ClockSource(init->clockSource); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_BSTIM16); + /* 分频系数 */ + FL_BSTIM16_WritePrescaler(BSTIM16x, init->prescaler); + /* 自动重装载值 */ + FL_BSTIM16_EnableUpdateEvent(BSTIM16x); + FL_BSTIM16_WriteAutoReload(BSTIM16x, init->autoReload); + if(init->autoReloadState == FL_ENABLE) + { + FL_BSTIM16_EnableARRPreload(BSTIM16x); + } + else + { + FL_BSTIM16_DisableARRPreload(BSTIM16x); + } + FL_BSTIM16_GenerateUpdateEvent(BSTIM16x); + while((!FL_BSTIM16_IsActiveFlag_Update(BSTIM16x))&&i) + { + i--; + } + return FL_PASS; +} +/** + * @brief 设置 BSTIM16_InitStruct 为默认配置 + * @param BSTIM16_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_BSTIM16_InitTypeDef 结构体 + * + * @retval None + */ + +void FL_BSTIM16_StructInit(FL_BSTIM16_InitTypeDef *init) +{ + init->prescaler = 0; + init->autoReload = 0xFFFFFFFF; + init->autoReloadState = FL_ENABLE; + init->clockSource = FL_CMU_BSTIM16_CLK_SOURCE_APBCLK; +} + +/** + * @} + */ + +#endif /* FL_BSTIM16_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_bstim32.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_bstim32.c new file mode 100644 index 0000000..3ccf510 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_bstim32.c @@ -0,0 +1,151 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_bstim32.c + * @author FMSH Application Team + * @brief Src file of BSTIM FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup BSTIM32 + * @{ + */ + +#ifdef FL_BSTIM32_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup BSTIM32_FL_Private_Macros + * @{ + */ +#define IS_FL_BSTIM32_INSTANCE(INTANCE) ((INTANCE) == BSTIM32) + + +#define IS_FL_BSTIM32_AUTORELOAD_MODE(__VALUE__) (((__VALUE__) == FL_ENABLE)||\ + ((__VALUE__) == FL_DISABLE)) + +#define IS_FL_BSTIM32_CLOCK_SRC(__VALUE__) (((__VALUE__) == FL_CMU_BSTIM32_CLK_SOURCE_APBCLK)||\ + ((__VALUE__) == FL_CMU_BSTIM32_CLK_SOURCE_RCLP)||\ + ((__VALUE__) == FL_CMU_BSTIM32_CLK_SOURCE_RCLF)||\ + ((__VALUE__) == FL_CMU_BSTIM32_CLK_SOURCE_LSCLK)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup BSTIM_FL_EF_Init + * @{ + */ + +/** + * @brief 复位对应BSTIM寄存器. + * @param BSTIMx + * @retval ErrorStatus枚举值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_BSTIM32_DeInit(BSTIM32_Type *BSTIM32x) +{ + assert_param(IS_FL_BSTIM32_INSTANCE(BSTIM32x)); + /* 使能外设复位 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 复位外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_BSTIM32); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_BSTIM32); + /* 关闭外设总线始时钟和工作时钟 */ + FL_CMU_DisableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_BSTIM32); + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_BSTIM32); + /* 锁定外设复位 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} +/** + * @brief 根据 BSTIM32_InitStruct 的配置信息初始化对应外设入口地址的寄存器值. + * @param BSTIMx BSTIMx + * @param BSTIM32_InitStruct 指向一个 @ref FL_BSTIM32_InitTypeDef 结构体 + * 其中包含了外设的相关配置信息. + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 配置成功 + */ +FL_ErrorStatus FL_BSTIM32_Init(BSTIM32_Type *BSTIM32x, FL_BSTIM32_InitTypeDef *init) +{ + uint32_t i = 5; + /* 参数检查 */ + assert_param(IS_FL_BSTIM32_INSTANCE(BSTIM32x)); + assert_param(IS_FL_BSTIM32_CLOCK_SRC(init->clockSource)); + assert_param(IS_FL_BSTIM32_AUTORELOAD_MODE(init->autoReloadState)); + /* 时钟使能 */ + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_BSTIM32); + /* 选择时钟源 */ + FL_CMU_SetBSTIM32ClockSource(init->clockSource); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_BSTIM32); + /* 分频系数 */ + FL_BSTIM32_WritePrescaler(BSTIM32x, init->prescaler); + /* 自动重装载值 */ + FL_BSTIM32_EnableUpdateEvent(BSTIM32x); + FL_BSTIM32_WriteAutoReload(BSTIM32x, init->autoReload); + if(init->autoReloadState == FL_ENABLE) + { + FL_BSTIM32_EnableARRPreload(BSTIM32x); + } + else + { + FL_BSTIM32_DisableARRPreload(BSTIM32x); + } + FL_BSTIM32_GenerateUpdateEvent(BSTIM32x); + while((!FL_BSTIM32_IsActiveFlag_Update(BSTIM32x))&&i) + { + i--; + } + return FL_PASS; +} + +/** + * @brief 设置 BSTIM32_InitStruct 为默认配置 + * @param BSTIM32_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_BSTIM_InitTypeDef 结构体 + * + * @retval None + */ +void FL_BSTIM32_StructInit(FL_BSTIM32_InitTypeDef *init) +{ + init->prescaler = 0; + init->autoReload = 0xFFFFFFFF; + init->autoReloadState = FL_ENABLE; + init->clockSource = FL_CMU_BSTIM32_CLK_SOURCE_APBCLK; +} + +/** + * @} + */ + +#endif /* FL_BSTIM32_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_can.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_can.c new file mode 100644 index 0000000..e73d933 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_can.c @@ -0,0 +1,301 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_can.c + * @author FMSH Application Team + * @brief Src file of VAN fL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup CAN + * @{ + */ + +#ifdef FL_CAN_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup CAN_FL_Private_Macros + * @{ + */ +#define IS_CAN_SJW(__VALUE__) (((__VALUE__) == FL_CAN_SJW_1Tq) \ + || ((__VALUE__) == FL_CAN_SJW_2Tq) \ + || ((__VALUE__) == FL_CAN_SJW_3Tq) \ + || ((__VALUE__) == FL_CAN_SJW_4Tq)) + + +#define IS_CAN_TS1(__VALUE__) (((__VALUE__) == FL_CAN_TS1_1Tq) \ + || ((__VALUE__) == FL_CAN_TS1_2Tq) \ + || ((__VALUE__) == FL_CAN_TS1_3Tq) \ + || ((__VALUE__) == FL_CAN_TS1_4Tq) \ + || ((__VALUE__) == FL_CAN_TS1_5Tq) \ + || ((__VALUE__) == FL_CAN_TS1_6Tq) \ + || ((__VALUE__) == FL_CAN_TS1_7Tq) \ + || ((__VALUE__) == FL_CAN_TS1_8Tq) \ + || ((__VALUE__) == FL_CAN_TS1_9Tq) \ + || ((__VALUE__) == FL_CAN_TS1_10Tq) \ + || ((__VALUE__) == FL_CAN_TS1_11Tq) \ + || ((__VALUE__) == FL_CAN_TS1_12Tq) \ + || ((__VALUE__) == FL_CAN_TS1_13Tq) \ + || ((__VALUE__) == FL_CAN_TS1_14Tq) \ + || ((__VALUE__) == FL_CAN_TS1_15Tq) \ + || ((__VALUE__) == FL_CAN_TS1_16Tq)) + + + +#define IS_CAN_TS2(__VALUE__) (((__VALUE__) == FL_CAN_TS2_1Tq) \ + || ((__VALUE__) == FL_CAN_TS2_2Tq) \ + || ((__VALUE__) == FL_CAN_TS2_3Tq) \ + || ((__VALUE__) == FL_CAN_TS2_4Tq) \ + || ((__VALUE__) == FL_CAN_TS2_5Tq) \ + || ((__VALUE__) == FL_CAN_TS2_6Tq) \ + || ((__VALUE__) == FL_CAN_TS2_7Tq) \ + || ((__VALUE__) == FL_CAN_TS2_8Tq)) + + +#define IS_CAN_FILTER_EN(__VALUE__) (((__VALUE__) == FL_ENABLE) \ + || ((__VALUE__) == FL_DISABLE)) + + +#define IS_CAN_AFx(__VALUE__) (((__VALUE__) == FL_CAN_FILTER1) \ + || ((__VALUE__) == FL_CAN_FILTER2) \ + || ((__VALUE__) == FL_CAN_FILTER3) \ + || ((__VALUE__) == FL_CAN_FILTER4)) + + +#define IS_CAN_MODE(__VALUE__) (((__VALUE__) == FL_CAN_MODE_NORMAL) \ + || ((__VALUE__) == FL_CAN_MODE_LOOPBACK) \ + || ((__VALUE__) == FL_CAN_MODE_CONFIG)) + + +#define IS_CAN_CLK(__VALUE__) (((__VALUE__) == FL_CMU_CAN_CLK_SOURCE_RCHF) \ + || ((__VALUE__) == FL_CMU_CAN_CLK_SOURCE_XTHF) \ + || ((__VALUE__) == FL_CMU_CAN_CLK_SOURCE_PLL) \ + || ((__VALUE__) == FL_CMU_CAN_CLK_SOURCE_APBCLK)) + + + + + + +#define IS_CAN_SRR(__VALUE__) (((__VALUE__)==FL_CAN_SRR_BIT_LOW) ||((__VALUE__)==FL_CAN_SRR_BIT_HIGH)) +#define IS_CAN_IDE(__VALUE__) (((__VALUE__)==FL_CAN_IDE_BIT_LOW) ||((__VALUE__)==FL_CAN_IDE_BIT_HIGH)) +#define IS_CAN_RTR(__VALUE__) (((__VALUE__)==FL_CAN_RTR_BIT_LOW) ||((__VALUE__)==FL_CAN_RTR_BIT_HIGH)) + +#define IS_CAN_ID18_MASK(__VALUE__) (__VALUE__<=262143U) +#define IS_CAN_ID11_MASK(__VALUE__) (__VALUE__<=2047U) + +#define IS_CAN_SRR_MASK(__VALUE__) (((__VALUE__) == FL_ENABLE) \ + || ((__VALUE__) == FL_DISABLE)) + +#define IS_CAN_IDE_MASK(__VALUE__) (((__VALUE__) == FL_ENABLE) \ + || ((__VALUE__) == FL_DISABLE)) + +#define IS_CAN_RTR_MASK(__VALUE__) (((__VALUE__) == FL_ENABLE) \ + || ((__VALUE__) == FL_DISABLE)) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup CAN_FL_EF_Init + * @{ + */ + +/** + * @brief CAN初始化 + * @param CANx外设入口地址 + * @param CAN_InitStruct 指向一个@ref FL_CAN_InitTypeDef 结构体的指针 + * @retval 错误状态可能值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 配置成功 + */ +FL_ErrorStatus FL_CAN_Init(CAN_Type *CANx, FL_CAN_InitTypeDef *CAN_InitStruct) +{ + /*参数检查*/ + assert_param(IS_CAN_SJW(CAN_InitStruct->SJW)); + assert_param(IS_CAN_TS1(CAN_InitStruct->TS1)); + assert_param(IS_CAN_TS2(CAN_InitStruct->TS2)); + assert_param(IS_CAN_CLK(CAN_InitStruct->clockSource)); + /*时钟总线配置*/ + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_CAN); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_CAN); + /*CAN时钟源选择*/ + FL_CMU_SetCANClockSource(CAN_InitStruct->clockSource); + /*复位CAN模块*/ + FL_CAN_SetSoftwareReset(CANx, FL_CAN_SOFTWARE_RESET); + /*设置同步段*/ + FL_CAN_WriteSyncJumpWidth(CANx, CAN_InitStruct->SJW); + /*设置时间段1*/ + FL_CAN_WriteTimeSegment1Length(CANx, CAN_InitStruct->TS1); + /*设置时间段2*/ + FL_CAN_WriteTimeSegment2Length(CANx, CAN_InitStruct->TS2); + /*设置波特率*/ + FL_CAN_WriteBaudRatePrescaler(CANx, CAN_InitStruct->BRP); + if(CAN_InitStruct->mode == FL_CAN_MODE_NORMAL) + { + FL_CAN_DisableLoopBackMode(CANx); /* Normal模式 */ + FL_CAN_Enable(CANx); + } + else + if(CAN_InitStruct->mode == FL_CAN_MODE_LOOPBACK) + { + FL_CAN_EnableLoopBackMode(CANx); /* Loop Back模式 */ + FL_CAN_Enable(CANx); + } + else + { + FL_CAN_Disable(CANx); /* Configuration模式 */ + } + return FL_PASS; +} + +/** + * @brief 设置 CAN_InitStruct 为默认配置 + * @param CAN_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_CAN_InitTypeDef 结构体 + * + * @retval None + */ +void FL_CAN_StructInit(FL_CAN_InitTypeDef *CAN_InitStruct) +{ + CAN_InitStruct->mode = FL_CAN_MODE_NORMAL; + CAN_InitStruct->BRP = 0; + CAN_InitStruct->clockSource = FL_CMU_CAN_CLK_SOURCE_RCHF; + CAN_InitStruct->SJW = FL_CAN_SJW_1Tq; + CAN_InitStruct->TS1 = FL_CAN_TS1_5Tq; + CAN_InitStruct->TS2 = FL_CAN_TS2_4Tq; +} + +/** + * @brief CAN滤波器初始化 + * @param CANx外设入口地址 + * @param filterX This parameter can be one of the following values: + * @arg @ref FL_CAN_FILTER1 + * @arg @ref FL_CAN_FILTER2 + * @arg @ref FL_CAN_FILTER3 + * @arg @ref FL_CAN_FILTER4 + * @param CAN_InitFilterStruct 指向一个@ref FL_CAN_FilterInitTypeDef 结构体的指针 + * @retval 错误状态可能值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 配置成功 + */ +FL_ErrorStatus FL_CAN_FilterInit(CAN_Type *CANx, FL_CAN_FilterInitTypeDef *CAN_FilterInitStruct, uint32_t filterX) +{ + uint32_t counter =0; + uint32_t filterstatus; + assert_param(IS_CAN_SRR(CAN_FilterInitStruct->filterIdSRR)); + assert_param(IS_CAN_IDE(CAN_FilterInitStruct->filterIdIDE)); + assert_param(IS_CAN_RTR(CAN_FilterInitStruct->filterIdRTR)); + assert_param(IS_CAN_FILTER_EN(CAN_FilterInitStruct->filterEn)); + assert_param(IS_CAN_ID18_MASK(CAN_FilterInitStruct->filterMaskIdLow)); + assert_param(IS_CAN_ID11_MASK(CAN_FilterInitStruct->filterMaskIdHigh)); + assert_param(IS_CAN_SRR_MASK(CAN_FilterInitStruct->filterMaskIdSRR)); + assert_param(IS_CAN_IDE_MASK(CAN_FilterInitStruct->filterMaskIdIDE)); + assert_param(IS_CAN_RTR_MASK(CAN_FilterInitStruct->filterMaskIdRTR)); + assert_param(IS_CAN_AFx(filterX)); + do + { + filterstatus = FL_CAN_IsActiveFlag_FilterBusy(CANx); + counter++; + }while((filterstatus != 0U) && (counter != CAN_TIMEOUT)); + if(CAN_FilterInitStruct->filterIdIDE == FL_CAN_IDE_BIT_HIGH) + { + FL_CAN_Filter_WriteIDCompare(CANx, filterX, ((CAN_FilterInitStruct->filterIdExtend) >> 18) & 0X7FF); + FL_CAN_Filter_WriteEXTIDCompare(CANx, filterX, (CAN_FilterInitStruct->filterIdExtend) & 0X3FFFF); + } + else + { + FL_CAN_Filter_WriteIDCompare(CANx, filterX, (CAN_FilterInitStruct->filterIdStandard) & 0X7FF); + } + if((CAN_FilterInitStruct->filterMaskIdSRR) == FL_ENABLE) /* SRR参与滤波器比较 */ + { + FL_CAN_Filter_EnableSRRCompare(CANx, filterX); + } + else + { + FL_CAN_Filter_DisableSRRCompare(CANx, filterX); + } + if((CAN_FilterInitStruct->filterMaskIdIDE) == FL_ENABLE) /* IDE位参与滤波器比较 */ + { + FL_CAN_Filter_EnableIDECompare(CANx, filterX); + } + else + { + FL_CAN_Filter_DisableIDECompare(CANx, filterX); + } + if((CAN_FilterInitStruct->filterMaskIdRTR) == FL_ENABLE) /* RTR位参与滤波器比较 */ + { + FL_CAN_Filter_EnableRTRCompare(CANx, filterX); + } + else + { + FL_CAN_Filter_DisableRTRCompare(CANx, filterX); + } + FL_CAN_Filter_WriteIDCompareMask(CANx, filterX, CAN_FilterInitStruct->filterMaskIdHigh); /* 滤波器掩码配置 */ + FL_CAN_Filter_WriteEXTIDCompareMask(CANx, filterX, CAN_FilterInitStruct->filterMaskIdLow); + FL_CAN_Filter_SetSRRCompare(CANx, filterX, CAN_FilterInitStruct->filterIdSRR); + FL_CAN_Filter_SetIDECompare(CANx, filterX, CAN_FilterInitStruct->filterIdIDE); /* 滤波器ID配置 */ + FL_CAN_Filter_SetRTRCompare(CANx, filterX, CAN_FilterInitStruct->filterIdRTR); + if((CAN_FilterInitStruct->filterEn) == FL_ENABLE) /* 滤波器使能 */ + { + FL_CAN_Filter_Enable(CANx, filterX); + } + else + { + FL_CAN_Filter_Disable(CANx, filterX); + } + return FL_PASS; +} +/** + * @brief 设置 CAN_FilterInitStruct 为默认配置 + * @param CAN_FilterInitStruct 指向需要将值设置为默认配置的结构体 @ref FL_CAN_FilterInitTypeDef 结构体 + * + * @retval None + */ +void FL_CAN_StructFilterInit(FL_CAN_FilterInitTypeDef *CAN_FilterInitStruct) +{ + CAN_FilterInitStruct->filterEn = FL_DISABLE; + CAN_FilterInitStruct->filterIdExtend = 0; + CAN_FilterInitStruct->filterMaskIdHigh = 0x7FF; + CAN_FilterInitStruct->filterIdIDE = FL_CAN_IDE_BIT_LOW; + CAN_FilterInitStruct->filterMaskIdIDE = FL_DISABLE; + CAN_FilterInitStruct->filterMaskIdLow = 0X3FFFF; + CAN_FilterInitStruct->filterIdRTR = FL_CAN_RTR_BIT_LOW; + CAN_FilterInitStruct->filterMaskIdRTR = FL_DISABLE; + CAN_FilterInitStruct->filterIdSRR = FL_CAN_SRR_BIT_LOW; + CAN_FilterInitStruct->filterMaskIdSRR = FL_DISABLE; + CAN_FilterInitStruct->filterIdStandard = 0; +} + +/** + * @} + */ + +#endif /* FL_CAN_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_cmu.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_cmu.c new file mode 100644 index 0000000..e93a269 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_cmu.c @@ -0,0 +1,289 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_cmu.c + * @author FMSH Application Team + * @brief Src file of CMU FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup CMU + * @{ + */ + +#ifdef FL_CMU_DRIVER_ENABLED + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup CMU_FL_EF_QUERY + * @{ + */ + +/** + * @brief 获取系统当前工作时钟SYSCLK。 + * @param None + * @note 函数中用到了XTHF_VALUE 宏,这个宏应该被定义为外部晶振的输入频率值。 + * + * @retval 系统时钟频率 (Hz)。 + * + */ +uint32_t FL_CMU_GetSystemClockFreq(void) +{ + uint32_t frequency = 0; + /* 获取系统时钟源 */ + switch(FL_CMU_GetSystemClockSource()) + { + /* 系统时钟源为内部RCHF */ + case FL_CMU_SYSTEM_CLK_SOURCE_RCHF: + /* 内部RCHF默认为8MHz ,可以配置为16或24M */ + frequency = FL_CMU_GetRCHFClockFreq(); + break; + /* 系统时钟源为XTHF */ + case FL_CMU_SYSTEM_CLK_SOURCE_XTHF: + frequency = XTHFClock; + break; + /* 系统时钟源为PLL */ + case FL_CMU_SYSTEM_CLK_SOURCE_PLL: + frequency = FL_CMU_GetPLLClockFreq(); + break; + /* 系统时钟源为内部RCLF */ + case FL_CMU_SYSTEM_CLK_SOURCE_RCLF: + /* 根据RC4M的分频配置得出系统时钟 */ + frequency = FL_CMU_GetRCLFClockFreq(); + break; + /* 系统时钟源为XTLF */ + case FL_CMU_SYSTEM_CLK_SOURCE_XTLF: + /* 根据外部晶振的频率得出系统时钟 */ + frequency = XTLFClock; + break; + /* 系统时钟源为RCLP */ + case FL_CMU_SYSTEM_CLK_SOURCE_RCLP: + frequency = 32768; + break; + default: + frequency = FL_CMU_GetRCHFClockFreq(); + break; + } + return frequency; +} +/** + * @brief 获取 AHB 总线时钟频率。 + * + * @param SYSCLK_Frequency 系统主时钟频率SYSCLK + * + * @retval AHB 总线时钟频率(Hz) + * + */ +uint32_t FL_CMU_GetAHBClockFreq(void) +{ + uint32_t frequency = 0; + /* 获取AHB分频系数,AHB源自系统主时钟 */ + switch(FL_CMU_GetAHBPrescaler()) + { + case FL_CMU_AHBCLK_PSC_DIV1: + frequency = FL_CMU_GetSystemClockFreq(); + break; + case FL_CMU_AHBCLK_PSC_DIV2: + frequency = FL_CMU_GetSystemClockFreq() / 2; + break; + case FL_CMU_AHBCLK_PSC_DIV4: + frequency = FL_CMU_GetSystemClockFreq() / 4; + break; + case FL_CMU_AHBCLK_PSC_DIV8: + frequency = FL_CMU_GetSystemClockFreq() / 8; + break; + case FL_CMU_AHBCLK_PSC_DIV16: + frequency = FL_CMU_GetSystemClockFreq() / 16; + break; + default: + frequency = FL_CMU_GetSystemClockFreq(); + break; + } + return frequency; +} + +/** + * @brief 获取当前系统的APB总线时钟 + * @param APB_Frequency APB总线的时钟频率 + * + * @retval APB clock frequency (in Hz) + * + */ +uint32_t FL_CMU_GetAPBClockFreq(void) +{ + uint32_t frequency = 0; + /* 获取APB1分频系数,APB源自AHB */ + switch(FL_CMU_GetAPBPrescaler()) + { + case FL_CMU_APBCLK_PSC_DIV1: + frequency = FL_CMU_GetAHBClockFreq(); + break; + case FL_CMU_APBCLK_PSC_DIV2: + frequency = FL_CMU_GetAHBClockFreq() / 2; + break; + case FL_CMU_APBCLK_PSC_DIV4: + frequency = FL_CMU_GetAHBClockFreq() / 4; + break; + case FL_CMU_APBCLK_PSC_DIV8: + frequency = FL_CMU_GetAHBClockFreq() / 8; + break; + case FL_CMU_APBCLK_PSC_DIV16: + frequency = FL_CMU_GetAHBClockFreq() / 16; + break; + default: + frequency = FL_CMU_GetAHBClockFreq(); + break; + } + return frequency; +} +/** + * @brief 获取RCLF输出时钟频率 + * @param None + * + * @retval 返回RCLF输出时钟频率(Hz) + * + */ +uint32_t FL_CMU_GetRCLFClockFreq(void) +{ + uint32_t frequency = 0; + switch(FL_CMU_RCLF_GetPrescaler()) + { + case FL_CMU_RCLF_PSC_DIV1: + frequency = 614400; + break; + case FL_CMU_RCLF_PSC_DIV4: + frequency = 153600; + break; + case FL_CMU_RCLF_PSC_DIV8: + frequency = 76800; + break; + case FL_CMU_RCLF_PSC_DIV16: + frequency = 38400; + break; + default: + frequency = 614400; + break; + } + return frequency; +} +/** + * @brief 获取RCHF输出时钟频率 + * @param None + * + * @retval 返回RCHF输出时钟频率(Hz) + * + */ +uint32_t FL_CMU_GetRCHFClockFreq(void) +{ + uint32_t frequency = 0; + switch(FL_CMU_RCHF_GetFrequency()) + { + case FL_CMU_RCHF_FREQUENCY_8MHZ: + frequency = 8000000; + break; + case FL_CMU_RCHF_FREQUENCY_16MHZ: + frequency = 16000000; + break; + case FL_CMU_RCHF_FREQUENCY_24MHZ: + frequency = 24000000; + break; + case FL_CMU_RCHF_FREQUENCY_32MHZ: + frequency = 32000000; + break; + default: + frequency = 8000000; + break; + } + return frequency; +} +/** + * @brief 获取PLL输出时钟频率 + * @param None + * + * @retval 返回PLL输出时钟频率(Hz) + * + */ +uint32_t FL_CMU_GetPLLClockFreq(void) +{ + uint32_t frequency = 0; + uint32_t multiplier = 0; + /* 获取PLL时钟源 */ + switch(FL_CMU_PLL_GetClockSource()) + { + case FL_CMU_PLL_CLK_SOURCE_RCHF: + /* 获取RCHF配置主频 */ + frequency = FL_CMU_GetRCHFClockFreq(); + break; + case FL_CMU_PLL_CLK_SOURCE_XTHF: + frequency = XTHFClock; + break; + default: + frequency = FL_CMU_GetRCHFClockFreq(); + break; + } + /* 获取PLL时钟分频系数 */ + switch(FL_CMU_PLL_GetPrescaler()) + { + case FL_CMU_PLL_PSC_DIV1: + break; + case FL_CMU_PLL_PSC_DIV2: + frequency /= 2; + break; + case FL_CMU_PLL_PSC_DIV4: + frequency /= 4; + break; + case FL_CMU_PLL_PSC_DIV8: + frequency /= 8; + break; + case FL_CMU_PLL_PSC_DIV12: + frequency /= 12; + break; + case FL_CMU_PLL_PSC_DIV16: + frequency /= 16; + break; + case FL_CMU_PLL_PSC_DIV24: + frequency /= 24; + break; + case FL_CMU_PLL_PSC_DIV32: + frequency /= 32; + break; + default: + break; + } + multiplier = FL_CMU_PLL_ReadMultiplier() + 1; + frequency *= multiplier; + return frequency; +} + +/** + * @} + */ + +#endif /* FL_CMU_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_comp.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_comp.c new file mode 100644 index 0000000..49c4498 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_comp.c @@ -0,0 +1,219 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_comp.c + * @author FMSH Application Team + * @brief Src file of COMP FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup COMP + * @{ + */ + +#ifdef FL_COMP_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup COMP_FL_Private_Macros + * @{ + */ +#define IS_COMP_ALL_INSTANCE(INTENCE) (((INTENCE) == COMP1)||\ + ((INTENCE) == COMP2)||\ + ((INTENCE) == COMP3)) + +#define IS_FL_COMP_POSITIVEINPUT(__VALUE__) (((__VALUE__) == FL_COMP_INP_SOURCE_INP1)||\ + ((__VALUE__) == FL_COMP_INP_SOURCE_INP2)||\ + ((__VALUE__) == FL_COMP_INP_SOURCE_AVREF)||\ + ((__VALUE__) == FL_COMP_INP_SOURCE_ULPBG_REF)||\ + ((__VALUE__) == FL_COMP_INP_SOURCE_VDD15)||\ + ((__VALUE__) == FL_COMP_INP_SOURCE_VREFP)) + +#define IS_FL_COMP_NEGATIVEINPUT(__VALUE__) (((__VALUE__) == FL_COMP_INN_SOURCE_INN1)||\ + ((__VALUE__) == FL_COMP_INN_SOURCE_INN2)||\ + ((__VALUE__) == FL_COMP_INN_SOURCE_VREF)||\ + ((__VALUE__) == FL_COMP_INN_SOURCE_VREF_DIV_2)||\ + ((__VALUE__) == FL_COMP_INN_SOURCE_VREFP)||\ + ((__VALUE__) == FL_COMP_INN_SOURCE_DAC)) + +#define IS_FL_COMP_POLARITY(__VALUE__) (((__VALUE__) == FL_COMP_OUTPUT_POLARITY_NORMAL)||\ + ((__VALUE__) == FL_COMP_OUTPUT_POLARITY_INVERT)) + +#define IS_FL_COMP_EDGE(__VALUE__) (((__VALUE__) == FL_COMP_INTERRUPT_EDGE_BOTH)||\ + ((__VALUE__) == FL_COMP_INTERRUPT_EDGE_RISING )||\ + ((__VALUE__) == FL_COMP_INTERRUPT_EDGE_FALLING)) + +#define IS_FL_COMP_DIGITAL_FILTER(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_COMP_DIGITAL_FILTER_LEN(__VALUE__) (((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_3APBCLK)||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_4APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_5APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_6APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_7APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_8APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_9APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_10APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_11APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_12APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_13APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_14APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_15APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_16APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_17APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_18APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_19APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_20APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_21APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_22APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_23APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_24APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_25APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_26APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_27APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_28APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_29APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_30APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_31APBCLK )||\ + ((__VALUE__) == FL_COMP_OUTPUT_FILTER_WINDOW_32APBCLK)) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup COMP_FL_EF_Init + * @{ + */ + +/** + * @brief 复位对应COMP控制寄存器. + * @param COMPx COMP Port + * @retval ErrorStatus枚举值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_COMP_DeInit(COMP_Type *COMPx) +{ + /* 入口参数检查 */ + assert_param(IS_COMP_ALL_INSTANCE(COMPx)); + /* 恢复寄存器值为默认值 */ + COMPx->CR = 0x00000000U; + return FL_PASS; +} + +/** + * @brief 根据 COMP_InitStruct的配置信息初始化对应外设. + * @param COMPx COMP Port + * @param initStruct 指向一个 @ref FL_COMP_InitTypeDef 结构体 + * 其中包含了外设的相关配置信息. + * @param Serial 比较器序号可取值: + * 1 配置比较器1 + * 2 配置比较器2 + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS COMP配置成功 + */ +FL_ErrorStatus FL_COMP_Init(COMP_Type *COMPx, FL_COMP_InitTypeDef *initStruct) +{ + /* 入口参数检查 */ + assert_param(IS_COMP_ALL_INSTANCE(COMPx)); + assert_param(IS_FL_COMP_EDGE(initStruct->edge)); + assert_param(IS_FL_COMP_POLARITY(initStruct->polarity)); + assert_param(IS_FL_COMP_POSITIVEINPUT(initStruct->positiveInput)); + assert_param(IS_FL_COMP_NEGATIVEINPUT(initStruct->negativeInput)); + assert_param(IS_FL_COMP_DIGITAL_FILTER(initStruct->digitalFilter)); + assert_param(IS_FL_COMP_DIGITAL_FILTER_LEN(initStruct->digitalFilterLen)); + /* 使能时钟总线 */ + FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_COMP); + /* 比较器输出极性选择 */ + FL_COMP_SetOutputPolarity(COMPx, initStruct->polarity); + /* 比较器正向输入选择 */ + FL_COMP_SetINPSource(COMPx, initStruct->positiveInput); + /* 比较器反向输入选择 */ + FL_COMP_SetINNSource(COMPx, initStruct->negativeInput); + /* 比较器使用1/2(internal reference) 打开buffer */ + if(initStruct->negativeInput == FL_COMP_INN_SOURCE_VREF_DIV_2) + { + FL_COMP_EnableBuffer(COMP); /* buffer使能 */ + FL_COMP_DisableBufferBypass(COMP); /* 不bypass buffer */ + } + /* 比较器数字滤波 */ + if(COMPx == COMP1) + { + /* 比较器中断边沿选择 */ + FL_COMP_SetComparator1InterruptEdge(COMP, ((initStruct->edge)<edge)<edge)<digitalFilter) + { + FL_COMP_EnableOutputFilter(COMPx); + } + else + { + FL_COMP_DisableOutputFilter(COMPx); + } + /* 滤波长度 */ + FL_COMP_SetOutputFilterWindow(COMPx, initStruct->digitalFilterLen); + return FL_PASS; +} +/** + * @brief 设置 initStruct 为默认配置 + * @param initStruct 指向需要将值设置为默认配置的结构体 @ref FL_COMP_InitTypeDef 结构体 + * + * @retval None + */ +void FL_COMP_StructInit(FL_COMP_InitTypeDef *initStruct) +{ + /* 复位配置信息 */ + initStruct->edge = FL_COMP_INTERRUPT_EDGE_BOTH; + initStruct->polarity = FL_COMP_OUTPUT_POLARITY_NORMAL; + initStruct->negativeInput = FL_COMP_INN_SOURCE_INN1; + initStruct->positiveInput = FL_COMP_INP_SOURCE_INP1; + initStruct->digitalFilter = FL_ENABLE; + initStruct->digitalFilterLen = FL_COMP_OUTPUT_FILTER_WINDOW_3APBCLK; +} + +/** + * @} + */ + +#endif /* FL_COMP_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_crc.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_crc.c new file mode 100644 index 0000000..756f6c2 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_crc.c @@ -0,0 +1,167 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_crc.c + * @author FMSH Application Team + * @brief Src file of CRC FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup CRC + * @{ + */ + +#ifdef FL_CRC_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup CRC_FL_Private_Macros + * @{ + */ +#define IS_FL_CRC_INSTANCE(INTANCE) ((INTANCE) == CRC) + +#define IS_FL_CRC_POLYNOMIAL_WIDTH(__VALUE__) (((__VALUE__) == FL_CRC_POLYNOMIAL_16B)||\ + ((__VALUE__) == FL_CRC_POLYNOMIAL_32B)||\ + ((__VALUE__) == FL_CRC_POLYNOMIAL_8B)||\ + ((__VALUE__) == FL_CRC_POLYNOMIAL_7B)) + +#define IS_FL_CRC_DR_WIDTH(__VALUE__) (((__VALUE__) == FL_CRC_DATA_WIDTH_8B)||\ + ((__VALUE__) == FL_CRC_DATA_WIDTH_32B)) + + +#define IS_FL_CRC_OUPUT_REFLECTE_MODE(__VALUE__) (((__VALUE__) == FL_CRC_OUPUT_INVERT_NONE)||\ + ((__VALUE__) == FL_CRC_OUPUT_INVERT_BYTE)) + +#define IS_FL_CRC_INPUT_REFLECTE_MODE(__VALUE__) (((__VALUE__) == FL_CRC_INPUT_INVERT_NONE)||\ + ((__VALUE__) == FL_CRC_INPUT_INVERT_BYTE)||\ + ((__VALUE__) == FL_CRC_INPUT_INVERT_HALF_WORD)||\ + ((__VALUE__) == FL_CRC_INPUT_INVERT_WORD)) + +#define IS_FL_CRC_CALCULA_MODE(__VALUE__) (((__VALUE__) == FL_CRC_CALCULATE_SERIAL)||\ + ((__VALUE__) == FL_CRC_CALCULATE_PARALLEL)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup CRC_FL_EF_Init + * @{ + */ + +/** + * @brief 复位对应CRC寄存器. + * + * @param CRCx 外设入口地址 + * + * @retval FL_ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_CRC_DeInit(CRC_Type *CRCx) +{ + assert_param(IS_FL_CRC_INSTANCE(CRCx)); + /* 外设复位使能 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 复位外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_CRC); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_CRC); + /* 关闭总线时钟 */ + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_CRC); + /* 锁定外设复位功能 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} +/** + * @brief 根据 CRC_InitStruct 的配置信息初始化对应外设入口地址的寄存器值. + * + * @param CRCx 外设入口地址 + * @param CRC_InitStruct 指向一个 @ref FL_CRC_InitTypeDef 结构体其中包含了外设的相关配置信息. + * + * @retval FL_ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 配置成功 + */ +FL_ErrorStatus FL_CRC_Init(CRC_Type *CRCx, FL_CRC_InitTypeDef *CRC_InitStruct) +{ + /* 参数检查 */ + assert_param(IS_FL_CRC_INSTANCE(CRCx)); + assert_param(IS_FL_CRC_DR_WIDTH(CRC_InitStruct->dataWidth)); + assert_param(IS_FL_CRC_CALCULA_MODE(CRC_InitStruct->calculatMode)); + assert_param(IS_FL_CRC_POLYNOMIAL_WIDTH(CRC_InitStruct->polynomialWidth)); + assert_param(IS_FL_CRC_INPUT_REFLECTE_MODE(CRC_InitStruct->reflectIn)); + assert_param(IS_FL_CRC_OUPUT_REFLECTE_MODE(CRC_InitStruct->reflectOut)); + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_CRC); + FL_CRC_SetCalculateMode(CRCx, CRC_InitStruct->calculatMode); + FL_CRC_SetInputInvertMode(CRCx, CRC_InitStruct->reflectIn); + FL_CRC_SetOutputInvertMode(CRCx, CRC_InitStruct->reflectOut); + FL_CRC_SetPolynomialWidth(CRCx, CRC_InitStruct->polynomialWidth); + FL_CRC_WriteXORValue(CRCx, CRC_InitStruct->xorReg); + FL_CRC_WritePolynominalParam(CRCx, CRC_InitStruct->polynomial); + FL_CRC_WriteInitialValue(CRCx, CRC_InitStruct->initVal); + FL_CRC_SetDataWidth(CRCx, CRC_InitStruct->dataWidth); + if(CRC_InitStruct->xorRegState == FL_ENABLE) + { + FL_CRC_EnableOutputXOR(CRCx); + } + else + { + FL_CRC_DisableOutputXOR(CRCx); + } + return FL_PASS; +} + + +/** + * @brief 设置 CRC_InitStruct 为默认配置 + * + * @param CRC_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_CRC_InitTypeDef 结构体 + * + * @retval None + */ + +void FL_CRC_StructInit(FL_CRC_InitTypeDef *CRC_InitStruct) +{ + CRC_InitStruct->polynomial = 0x00000000; + CRC_InitStruct->polynomialWidth = FL_CRC_POLYNOMIAL_16B; + CRC_InitStruct->dataWidth = FL_CRC_DATA_WIDTH_8B; + CRC_InitStruct->calculatMode = FL_CRC_CALCULATE_SERIAL; + CRC_InitStruct->reflectIn = FL_CRC_INPUT_INVERT_NONE; + CRC_InitStruct->reflectOut = FL_CRC_OUPUT_INVERT_NONE; + CRC_InitStruct->xorReg = 0x00000000; + CRC_InitStruct->xorRegState = FL_DISABLE; +} + + +/** + * @} + */ + +#endif /* FL_CRC_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_dac.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_dac.c new file mode 100644 index 0000000..c962996 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_dac.c @@ -0,0 +1,199 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_dac.c + * @author FMSH Application Team + * @brief Src file of DAC FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup DAC + * @{ + */ + +#ifdef FL_DAC_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup DAC_FL_Private_Macros + * @{ + */ + +#define IS_FL_DAC_INSTANCE(INSTANCE) ((INSTANCE) == DAC) + +#define IS_FL_DAC_TRIGGERMODE(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_DAC_TRIGGE_SOURCE(__VALUE__) (((__VALUE__) == FL_DAC_TRGI_SOFTWARE)||\ + ((__VALUE__) == FL_DAC_TRGI_ATIM)||\ + ((__VALUE__) == FL_DAC_TRGI_GPTIM1)||\ + ((__VALUE__) == FL_DAC_TRGI_GPTIM2)||\ + ((__VALUE__) == FL_DAC_TRGI_BSTIM16)||\ + ((__VALUE__) == FL_DAC_TRGI_LPTIM16)||\ + ((__VALUE__) == FL_DAC_TRGI_EXTI0)||\ + ((__VALUE__) == FL_DAC_TRGI_EXTI4)||\ + ((__VALUE__) == FL_DAC_TRGI_EXTI8)||\ + ((__VALUE__) == FL_DAC_TRGI_EXTI12)) + +#define IS_FL_DAC_SAMPLEHOLDMODE(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_DAC_HOLD_TIME(__VALUE__) (((__VALUE__) <= 0XFFFF)) + +#define IS_FL_DAC_SAMPLE_TIME(__VALUE__) (((__VALUE__) <= 0XFF)) + +#define IS_FL_DAC_BUFFERMODE(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_DAC_SWITCHMODE(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_DAC_DMAMODE(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup CRC_FL_EF_Init + * @{ + */ + +/** + * @brief 恢复对应的DAC入口地址寄存器为默认值 + * + * @param DACx 外设入口地址 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS DAC配置成功 + */ +FL_ErrorStatus FL_DAC_DeInit(DAC_Type *DACx) +{ + FL_ErrorStatus status = FL_PASS; + /* 入口合法性检查 */ + assert_param(IS_FL_DAC_INSTANCE(DACx)); + /* 外设复位使能 */ + FL_RMU_EnablePeripheralReset(RMU); + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_DAC); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_DAC); + FL_RMU_DisablePeripheralReset(RMU); + return status; +} +/** + * @brief 初始化DACx指定的入口地址的外设寄存器 + * @param DACx 外设入口地址 + * @param DAC_InitStruct 向一FL_DAC_InitTypeDef结构体,它包含指定DAC外设的配置信息 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS DAC配置成功 + */ +FL_ErrorStatus FL_DAC_Init(DAC_Type *DACx, FL_DAC_InitTypeDef *DAC_InitStruct) +{ + FL_ErrorStatus status = FL_PASS; + /* 入口合法性检查 */ + assert_param(IS_FL_DAC_INSTANCE(DACx)); + assert_param(IS_FL_DAC_TRIGGERMODE(DAC_InitStruct->triggerMode)); + assert_param(IS_FL_DAC_TRIGGE_SOURCE(DAC_InitStruct->triggerSource)); + assert_param(IS_FL_DAC_SAMPLEHOLDMODE(DAC_InitStruct->sampleHoldMode)); + assert_param(IS_FL_DAC_HOLD_TIME(DAC_InitStruct->holdTime)); + assert_param(IS_FL_DAC_SAMPLE_TIME(DAC_InitStruct->sampleTime)); + assert_param(IS_FL_DAC_BUFFERMODE(DAC_InitStruct->bufferMode)); + assert_param(IS_FL_DAC_SWITCHMODE(DAC_InitStruct->switchMode)); + FL_RMU_EnablePeripheralReset(RMU); + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_DAC); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_DAC); + FL_RMU_DisablePeripheralReset(RMU); + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_DAC); + FL_DAC_Disable(DACx); + if(FL_DAC_IsEnabled(DACx) == 0U) + { + /* 采样保持使能配置 */ + if(DAC_InitStruct->sampleHoldMode) + { + FL_DAC_WriteSamplingTime(DACx, DAC_InitStruct->sampleTime); + FL_DAC_WriteHoldingTime(DACx, DAC_InitStruct->holdTime); + FL_DAC_EnableSampleHoldMode(DACx); + } + else + { FL_DAC_DisableSampleHoldMode(DACx); } + /* 触发模式使能配置 */ + if(DAC_InitStruct->triggerMode) + { + FL_DAC_SetTriggerSource(DACx, DAC_InitStruct->triggerSource); + FL_DAC_EnableTriggerMode(DACx); + } + else + { FL_DAC_DisableTriggerMode(DACx); } + /* buffer使能配置 */ + if(DAC_InitStruct->bufferMode) + { FL_DAC_EnableOutputBuffer(DACx); } + else + { FL_DAC_DisableOutputBuffer(DACx); } + /* SWITCH使能配置 */ + if(DAC_InitStruct->switchMode) + { FL_DAC_EnableFeedbackSwitch(DACx); } + else + { FL_DAC_DisableFeedbackSwitch(DACx); } + } + else + { + status = FL_FAIL; + } + return status; +} + + +/** + * @brief 设置 DAC_InitStruct 为默认配置 + * @param DAC_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_DAC_InitTypeDef 结构体 + * + * @retval None + */ +void FL_DAC_StructInit(FL_DAC_InitTypeDef *DAC_InitStruct) +{ + DAC_InitStruct->bufferMode = FL_ENABLE; + DAC_InitStruct->switchMode = FL_ENABLE; + DAC_InitStruct->triggerMode = FL_DISABLE; + DAC_InitStruct->triggerSource = FL_DAC_TRGI_SOFTWARE; + DAC_InitStruct->sampleHoldMode = FL_DISABLE; + DAC_InitStruct->sampleTime = 0xFF; + DAC_InitStruct->holdTime = 0X0; +} + +/** + * @} + */ + +#endif /* FL_DAC_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ + + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_divas.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_divas.c new file mode 100644 index 0000000..37e7d11 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_divas.c @@ -0,0 +1,182 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_divas.c + * @author FMSH Application Team + * @brief Src file of DIVAS FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup DIVAS + * @{ + */ + +#ifdef FL_DIVAS_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup DIVAS_FL_Private_Macros + * @{ + */ +#define IS_DIVAS_ALL_INSTANCE(INTENCE) ((INTENCE) == DIVAS) + +#define IS_FL_DIVAS_DIVISOR(__VALUE__) (((__VALUE__) != 0)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup DIVAS_FL_EF_Init + * @{ + */ + +/** + * @brief 复位对应HDIV控制寄存器. + * + * @param DIVASx 外设入口地址 + * + * @retval FL_ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_DIVAS_DeInit(DIVAS_Type *DIVASx) +{ + /* 入口参数检查 */ + assert_param(IS_DIVAS_ALL_INSTANCE(DIVASx)); + /* 外设复位使能 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 恢复寄存器值为默认值 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_DIVAS); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_DIVAS); + /* 关闭总线时钟 */ + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_DIVAS); + /* 锁定外设复位功能 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} + +/** + * @brief 根据 初始化对应外设DIVAS. + * + * @param DIVASx 外设入口地址 + * + * @retval FL_ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_DIVAS_Init(DIVAS_Type *DIVASx) +{ + /* 入口参数检查 */ + assert_param(IS_DIVAS_ALL_INSTANCE(DIVASx)); + /* 使能时钟总线 */ + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_DIVAS); + return FL_PASS; +} +/** + * @brief 硬件除法器计算函数 + * + * @param DIVASx 外设入口地址 + * @param DivisorEnd 32位有符号被除数 + * @param Divisor 16位有符号除数,注意不能为0 + * @param Quotient 指向 @ref int32_t 指针 保存商的地址 + * @param Residue 指向 @ref int16_t 指针 保存余数的地址 + * + * @retval 计算正确性与否 + * -0 计算结果正确 + * -非0 计算过程发生错误 + */ +uint32_t FL_DIVAS_Hdiv_Calculation(DIVAS_Type *DIVASx, int32_t DivisorEnd, int16_t Divisor, int32_t *Quotient, int16_t *Residue) +{ + uint32_t TimeOut ; + FL_DIVAS_SetMode(DIVASx, FL_DIVAS_MODE_DIV); + FL_DIVAS_WriteOperand(DIVASx, (uint32_t)DivisorEnd); + FL_DIVAS_WriteDivisor(DIVASx, (uint32_t)Divisor); + if(FL_DIVAS_IsActiveFlag_DividedZero(DIVASx)) + { + /*除数为0 */ + *Quotient = 0; + *Residue = 0; + return 1; + } + TimeOut = FL_DIVAS_SR_BUSY_TIMEOUT; + while(FL_DIVAS_IsActiveFlag_Busy(DIVASx)) + { + TimeOut--; + if(TimeOut == 0) + { + /* 计算超时*/ + *Quotient = 0; + *Residue = 0; + return 3; + } + } + *Quotient = FL_DIVAS_ReadQuotient(DIVASx); + *Residue = FL_DIVAS_ReadResidue(DIVASx); + return 0; +} + +/** + * @brief 硬件开方计算函数 + * + * @param DIVASx 外设入口地址 + * @param Root 32bit被开方数 + * @param Result 指向 @ref int16_t 指针 保存结果开方根 + * + * @retval 计算正确性与否 + * -0 计算结果正确 + * -非0 计算过程发生错误 + */ +uint32_t FL_DIVAS_Root_Calculation(DIVAS_Type *DIVASx, uint32_t Root, uint16_t *Result) +{ + uint32_t TimeOut ; + FL_DIVAS_SetMode(DIVASx, FL_DIVAS_MODE_ROOT); + FL_DIVAS_WriteOperand(DIVASx, Root); + TimeOut = FL_DIVAS_SR_BUSY_TIMEOUT; + while(FL_DIVAS_IsActiveFlag_Busy(DIVASx)) + { + TimeOut --; + if(TimeOut == 0) + { + /* 计算超时*/ + *Result = 0; + return 1; + } + } + *Result = FL_DIVAS_ReadRoot(DIVASx); + return 0; +} + +/** + * @} + */ + +#endif /* FL_DIVAS_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_dma.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_dma.c new file mode 100644 index 0000000..6cb7eee --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_dma.c @@ -0,0 +1,229 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_dma.c + * @author FMSH Application Team + * @brief Src file of DMA FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup DMA + * @{ + */ + +#ifdef FL_DMA_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup DMA_FL_Private_Macros + * @{ + */ +#define IS_FL_DMA_INSTANCE(INTANCE) ((INTANCE) == DMA) + +#define IS_FL_DMA_PRIORITY(__VALUE__) (((__VALUE__) == FL_DMA_PRIORITY_LOW)||\ + ((__VALUE__) == FL_DMA_PRIORITY_MEDIUM)||\ + ((__VALUE__) == FL_DMA_PRIORITY_HIGH)||\ + ((__VALUE__) == FL_DMA_PRIORITY_VERYHIGH)) + +#define IS_FL_DMA_CIRC_MODE(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + + +#define IS_FL_DMA_DIRECION(__VALUE__) (((__VALUE__) == FL_DMA_DIR_PERIPHERAL_TO_RAM)||\ + ((__VALUE__) == FL_DMA_DIR_RAM_TO_PERIPHERAL)||\ + ((__VALUE__) == FL_DMA_DIR_FLASH_TO_RAM)||\ + ((__VALUE__) == FL_DMA_DIR_RAM_TO_FLASH)) + + +#define IS_FL_DMA_DATA_SIZE(__VALUE__) (((__VALUE__) == FL_DMA_BANDWIDTH_8B)||\ + ((__VALUE__) == FL_DMA_BANDWIDTH_16B)||\ + ((__VALUE__) == FL_DMA_BANDWIDTH_32B)) + +#define IS_FL_DMA_INCMODE(__VALUE__) (((__VALUE__) == FL_DMA_MEMORY_INC_MODE_INCREASE)||\ + ((__VALUE__) == FL_DMA_MEMORY_INC_MODE_DECREASE) ||\ + ((__VALUE__) == FL_DMA_CH7_RAM_INC_MODE_INCREASE)||\ + ((__VALUE__) == FL_DMA_CH7_RAM_INC_MODE_DECREASE)||\ + ((__VALUE__) == FL_DMA_CH7_FLASH_INC_MODE_INCREASE)||\ + ((__VALUE__) == FL_DMA_CH7_FLASH_INC_MODE_DECREASE)) + +#define IS_FL_DMA_PERIPH(__VALUE__) (((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION1)||\ + ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION2)||\ + ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION3)||\ + ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION4)||\ + ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION5)||\ + ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION6)||\ + ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION7)||\ + ((__VALUE__) == FL_DMA_PERIPHERAL_FUNCTION8)) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup DMA_FL_EF_Init + * @{ + */ + +/** + * @brief 复位对应DMA寄存器. + * @param DMAx + * @retval ErrorStatus枚举值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_DMA_DeInit(DMA_Type *DMAx) +{ + assert_param(IS_FL_DMA_INSTANCE(DMAx)); + /* 使能外设复位 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 复位外设寄存器 */ + FL_RMU_EnableResetAHBPeripheral(RMU, FL_RMU_RSTAHB_DMA); + FL_RMU_DisableResetAHBPeripheral(RMU, FL_RMU_RSTAHB_DMA); + /* 关闭外设总线始时钟和工作时钟 */ + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_DMA); + /* 锁定外设复位 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} +/** + * @brief 根据 DMA_InitStruct 的配置信息初始化对应外设入口地址的寄存器值. + * @param DMAx DMAx + * @param DMA_InitStruct 指向一个 @ref FL_DMA_InitTypeDef 结构体 + * 其中包含了外设的相关配置信息. + * @param Channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 配置成功 + */ +FL_ErrorStatus FL_DMA_Init(DMA_Type *DMAx, FL_DMA_InitTypeDef *initStruct, uint32_t channel) +{ + /* 参数检查 */ + assert_param(IS_FL_DMA_INSTANCE(DMAx)); + assert_param(IS_FL_DMA_PRIORITY(initStruct->priority)); + assert_param(IS_FL_DMA_CIRC_MODE(initStruct->circMode)); + assert_param(IS_FL_DMA_DIRECION(initStruct->direction)); + assert_param(IS_FL_DMA_DATA_SIZE(initStruct->dataSize)); + assert_param(IS_FL_DMA_INCMODE(initStruct->memoryAddressIncMode)); + /* 开启时钟 */ + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_DMA); + /* 配置通道优先级 */ + FL_DMA_SetPriority(DMAx, initStruct->priority, channel); + /* RAM地址方向 */ + FL_DMA_SetMemoryIncrementMode(DMAx, initStruct->memoryAddressIncMode, channel); + /* 传输方向 */ + FL_DMA_SetTransmissionDirection(DMAx, initStruct->direction, channel); + /* 数据宽度 */ + FL_DMA_SetBandwidth(DMAx, initStruct->dataSize, channel); + /* 循环模式 */ + if(initStruct->circMode == FL_ENABLE) + { + if(channel == FL_DMA_CHANNEL_7) + { + return FL_FAIL; + } + FL_DMA_EnableCircularMode(DMAx, channel); + } + else + { + FL_DMA_DisableCircularMode(DMAx, channel); + } + /* 如果是通道7 外设地址实际就是FLASH地址,因此这里针对通道7做了单独处理 */ + if(channel != FL_DMA_CHANNEL_7) + { + assert_param(IS_FL_DMA_PERIPH(initStruct->periphAddress)); + FL_DMA_SetPeripheralMap(DMAx, initStruct->periphAddress, channel); + } + else + { + FL_DMA_SetFlashAddrIncremental(DMAx, initStruct->flashAddressIncMode); + } + return FL_PASS; +} +/** + * @brief 设置 CRC_InitStruct 为默认配置 + * @param CRC_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_CRC_InitTypeDef 结构体 + * + * @retval None + */ + +void FL_DMA_StructInit(FL_DMA_InitTypeDef *initStruct) +{ + initStruct->circMode = FL_DISABLE; + initStruct->dataSize = FL_DMA_BANDWIDTH_8B; + initStruct->direction = FL_DMA_DIR_PERIPHERAL_TO_RAM; + initStruct->periphAddress = FL_DMA_PERIPHERAL_FUNCTION1; + initStruct->priority = FL_DMA_PRIORITY_LOW; + initStruct->memoryAddressIncMode = FL_DMA_MEMORY_INC_MODE_INCREASE; +} + +/** + * @brief 启动一次DMA传输. + * @param DMAx DMAx + * @param configStruct 指向一个 @ref FL_DMA_ConfigTypeDef 结构体 + * 其中包含了外设的相关配置信息. + * @param Channel This parameter can be one of the following values: + * @arg @ref FL_DMA_CHANNEL_0 + * @arg @ref FL_DMA_CHANNEL_1 + * @arg @ref FL_DMA_CHANNEL_2 + * @arg @ref FL_DMA_CHANNEL_3 + * @arg @ref FL_DMA_CHANNEL_4 + * @arg @ref FL_DMA_CHANNEL_5 + * @arg @ref FL_DMA_CHANNEL_6 + * @arg @ref FL_DMA_CHANNEL_7 + * @retval ErrorStatus枚举值 + * -FL_FAIL 过程发生错误可能是超时也可能是地址非法 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_DMA_StartTransmission(DMA_Type *DMAx, FL_DMA_ConfigTypeDef *configStruct, uint32_t channel) +{ + /* 配置传输个数 */ + FL_DMA_WriteTransmissionSize(DMAx, configStruct->transmissionCount, channel); + /* 配置Memory地址 */ + FL_DMA_WriteMemoryAddress(DMAx, configStruct->memoryAddress, channel); + /* 清除通道中断标志位 */ + FL_DMA_ClearFlag_TransferHalfComplete(DMAx, channel); + FL_DMA_ClearFlag_TransferComplete(DMAx, channel); + /* 使能DMA通道使能开关 */ + FL_DMA_EnableChannel(DMAx, channel); + return FL_PASS; +} + +/** + * @} + */ + +#endif /* FL_DIVAS_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_exti.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_exti.c new file mode 100644 index 0000000..3ea4c81 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_exti.c @@ -0,0 +1,263 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_exti.c + * @author FMSH Application Team + * @brief Src file of EXTI FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup EXTI + * @{ + */ + +#ifdef FL_EXTI_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup EXTI_FL_Private_Macros + * @{ + */ + +#define IS_EXTI_ALL_INSTANCE(INSTANCE) (((INSTANCE) == FL_GPIO_EXTI_LINE_0)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_1)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_2)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_3)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_4)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_5)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_6)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_7)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_8)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_9)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_10)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_11)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_12)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_13)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_14)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_15)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_16)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_17)||\ + ((INSTANCE) == FL_GPIO_EXTI_LINE_18)) + +#define IS_EXTI_CLK_SOURCE(__VALUE__) (((__VALUE__) == FL_CMU_EXTI_CLK_SOURCE_HCLK)||\ + ((__VALUE__) == FL_CMU_EXTI_CLK_SOURCE_LSCLK)) + +#define IS_EXTI_INPUT_GROUP(__VALUE__) (((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP0)||\ + ((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP1)||\ + ((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP2)||\ + ((__VALUE__) == FL_GPIO_EXTI_INPUT_GROUP3)) + +#define IS_EXTI_TRIG_EDGE(__VALUE__) (((__VALUE__) == FL_GPIO_EXTI_TRIGGER_EDGE_RISING)||\ + ((__VALUE__) == FL_GPIO_EXTI_TRIGGER_EDGE_FALLING)||\ + ((__VALUE__) == FL_GPIO_EXTI_TRIGGER_EDGE_BOTH)) + +#define IS_EXTI_FILTER(__VALUE__) (((__VALUE__) == FL_ENABLE)||\ + ((__VALUE__) == FL_DISABLE)) + +/** + * @} + */ + +/* Private consts ------------------------------------------------------------*/ +/** @addtogroup EXTI_FL_Private_Consts + * @{ + */ + +typedef void (*pSetExtiLineFunc)(GPIO_COMMON_Type *, uint32_t); +static const pSetExtiLineFunc setExtiLineFuncs[] = +{ + FL_GPIO_SetExtiLine0, + FL_GPIO_SetExtiLine1, + FL_GPIO_SetExtiLine2, + FL_GPIO_SetExtiLine3, + FL_GPIO_SetExtiLine4, + FL_GPIO_SetExtiLine5, + FL_GPIO_SetExtiLine6, + FL_GPIO_SetExtiLine7, + FL_GPIO_SetExtiLine8, + FL_GPIO_SetExtiLine9, + FL_GPIO_SetExtiLine10, + FL_GPIO_SetExtiLine11, + FL_GPIO_SetExtiLine12, + FL_GPIO_SetExtiLine13, + FL_GPIO_SetExtiLine14, + FL_GPIO_SetExtiLine15, + FL_GPIO_SetExtiLine16, + FL_GPIO_SetExtiLine17, + FL_GPIO_SetExtiLine18, +}; + +typedef void (*pSetTrigEdgeFunc)(GPIO_COMMON_Type *, uint32_t, uint32_t); +static const pSetTrigEdgeFunc setTrigEdgeFuncs[] = +{ + FL_GPIO_SetTriggerEdge0, + FL_GPIO_SetTriggerEdge1, +}; + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup EXTI_FL_EF_Init + * @{ + */ + +/** + * @brief EXTI通用配置设置 + * + * @param EXTI_CommonInitStruct 指向 @ref FL_EXTI_CommonInitTypeDef 类型的结构体,它包含EXTI外设通用配置信息 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS EXTI配置成功 + */ +FL_ErrorStatus FL_EXTI_CommonInit(FL_EXTI_CommonInitTypeDef *EXTI_CommonInitStruct) +{ + assert_param(IS_EXTI_CLK_SOURCE(EXTI_CommonInitStruct->clockSource)); + /* 使能IO时钟寄存器总线时钟 */ + FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_PAD); + /* 使能并配置外部中断时钟源 */ + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_EXTI); + FL_CMU_SetEXTIClockSource(EXTI_CommonInitStruct->clockSource); + return FL_PASS; +} + +/** + * @brief 复位EXTI通用配置设置 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 发生错误 + * -FL_PASS EXTI通用设置复位成功 + */ +FL_ErrorStatus FL_EXTI_CommonDeinit(void) +{ + /* 关闭外部中断时钟源 */ + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_EXTI); + return FL_PASS; +} + +/** + * @brief 设置 EXTI_CommonInitStruct 为默认配置 + * @param EXTI_CommonInitStruct 指向需要将值设置为默认配置的结构体 @ref FL_EXTI_CommonInitTypeDef 结构体 + * + * @retval None + */ +void FL_EXTI_CommonStructInit(FL_EXTI_CommonInitTypeDef *EXTI_CommonInitStruct) +{ + EXTI_CommonInitStruct->clockSource = FL_CMU_EXTI_CLK_SOURCE_LSCLK; +} + +/** + * @brief EXTI配置设置 + * + * @param extiLineX 外设入口地址 + * @param EXTI_InitStruct 指向 @ref FL_EXTI_InitTypeDef 类型的结构体,它包含EXTI外设配置信息 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS EXTI配置成功 + */ +FL_ErrorStatus FL_EXTI_Init(uint32_t extiLineX, FL_EXTI_InitTypeDef *EXTI_InitStruct) +{ + uint8_t extiLineId; + uint32_t tmpExtiLineX; + uint32_t i = 0; + /* 通过内核时钟计算200us延时的计数个数 */ + uint32_t temp = SystemCoreClock*2/10000 ; + /* 检查参数合法性 */ + assert_param(IS_EXTI_ALL_INSTANCE(extiLineX)); + assert_param(IS_EXTI_INPUT_GROUP(EXTI_InitStruct->input)); + assert_param(IS_EXTI_TRIG_EDGE(EXTI_InitStruct->triggerEdge)); + assert_param(IS_EXTI_FILTER(EXTI_InitStruct->filter)); + /* 获取EXTI中断线对应id号 */ + tmpExtiLineX = extiLineX; + for(extiLineId = 0; tmpExtiLineX != FL_GPIO_EXTI_LINE_0; tmpExtiLineX >>= 1, extiLineId++); + /* 设置中断线连接的IO */ + setExtiLineFuncs[extiLineId](GPIO, EXTI_InitStruct->input << (2 * (extiLineId % 16))); + /* 设置数字滤波 */ + EXTI_InitStruct->filter == FL_ENABLE ? FL_GPIO_EnableDigitalFilter(GPIO, extiLineX) : FL_GPIO_DisableDigitalFilter(GPIO, extiLineX); + /* 设置中断线触发边沿 */ + setTrigEdgeFuncs[extiLineId / 16](GPIO, extiLineX, EXTI_InitStruct->triggerEdge); + /* 等待至少周期6个LSCLK周期,约200us */ + for(i=0;i>= 1, extiLineId++); + /* 清除外部中断标志 */ + FL_GPIO_ClearFlag_EXTI(GPIO, extiLineX); + /* 中断线触发边沿禁止 */ + setTrigEdgeFuncs[extiLineId / 16](GPIO, extiLineX, FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE); + /* 禁止数字滤波 */ + FL_GPIO_DisableDigitalFilter(GPIO, extiLineX); + return FL_PASS; +} + +/** + * @brief 设置 EXTI_InitStruct 为默认配置 + * @param EXTI_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_EXTI_InitTypeDef 结构体 + * + * @retval None + */ +void FL_EXTI_StructInit(FL_EXTI_InitTypeDef *EXTI_InitStruct) +{ + EXTI_InitStruct->filter = FL_DISABLE; + EXTI_InitStruct->input = FL_GPIO_EXTI_INPUT_GROUP0; + EXTI_InitStruct->triggerEdge = FL_GPIO_EXTI_TRIGGER_EDGE_RISING; +} + +/** + * @} + */ + +#endif /* FL_EXTI_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_flash.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_flash.c new file mode 100644 index 0000000..a58f4c8 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_flash.c @@ -0,0 +1,568 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_flash.c + * @author FMSH Application Team + * @brief Src file of FLASH FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup FLASH + * @{ + */ + +#ifdef FL_FLASH_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup GPIO_FL_Private_Macros + * @{ + */ + +#define IS_FLASH_ALL_INSTANCE(INTENCE) (((INTENCE) == FLASH)) + +#define IS_FL_FLASH_PAGE_NUM(__VALUE__) ((uint32_t)(__VALUE__) < FL_FLASH_MAX_PAGE_NUM) + +#define IS_FL_FLASH_SECTOR_NUM(__VALUE__) ((uint32_t)(__VALUE__) < FL_FLASH_MAX_SECTOR_NUM) + +#define IS_FL_FLASH_MAX_ADDR(__VALUE__) ((uint32_t)(__VALUE__) <= FL_FLASH_ADDR_MAXPROGRAM) + +#define IS_FL_FLASH_MAX_PAGE(__VALUE__) ((uint32_t)(__VALUE__) < FL_FLASH_MAX_PAGE_NUM) + +#define IS_FL_FLASH_MAX_SECTOR(__VALUE__) ((uint32_t)(__VALUE__) < FL_FLASH_MAX_SECTOR_NUM) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup FLASH_FL_EF_Init + * @{ + */ + +/** + * @brief Flash 页擦除函数,一个页为512byte. + * @param FLASHx FLASH Port + * @param address 为需要擦除的页内任意地址,推荐使用页开始的首地址(字对齐) + * . + * @retval ErrorStatus枚举值 + * -FL_FAIL 擦写发生错误 + * -FL_PASS 擦写成功 + */ +FL_ErrorStatus FL_FLASH_PageErase(FLASH_Type *FLASHx, uint32_t address) +{ + uint32_t timeout = 0; + uint32_t primask; + FL_ErrorStatus ret = FL_PASS; + /* 入口参数检查 */ + assert_param(IS_FLASH_ALL_INSTANCE(FLASHx)); + assert_param(IS_FL_FLASH_MAX_ADDR((uint32_t)address)); + /*时钟使能*/ + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_FLASH); + if((address % FL_FLASH_ADDRS_ALIGN) != 0) + { + /*地址未对齐*/ + return FL_FAIL; + } + if(FL_FLASH_GetFlashLockStatus(FLASHx) == FL_FLASH_KEY_STATUS_ERROR) + { + /*Flash 已经锁定,复位前无法操作*/ + return FL_FAIL; + } + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_FLASH); + /*配置擦写类型*/ + FL_FLASH_SetFlashEraseType(FLASHx, FL_FLASH_ERASE_TYPE_PAGE); + /* 开始擦除页*/ + FL_FLASH_EnableErase(FLASHx); + /* Key 序列*/ + primask = __get_PRIMASK(); + __disable_irq(); + FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_ERASE_KEY); + FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PGAE_ERASE_KEY); + __set_PRIMASK(primask); + FL_FLASH_ClearFlag_EraseComplete(FLASHx); + FL_FLASH_ClearFlag_ClockError(FLASHx); + FL_FLASH_ClearFlag_AuthenticationError(FLASHx); + /* 擦请求 */ + *((uint32_t *)address) = FL_FLASH_ERASE_REQUEST; + while(1) + { + timeout++; + if((timeout > FL_FLASH_ERASE_TIMEOUT)\ + || (FL_FLASH_IsActiveFlag_ClockError(FLASHx))\ + || (FL_FLASH_IsActiveFlag_KeyError(FLASHx))\ + || (FL_FLASH_IsActiveFlag_AuthenticationError(FLASHx))) + { + /* 超时或出现错误 */ + ret = FL_FAIL; + break; + } + else + if(FL_FLASH_IsActiveFlag_EraseComplete(FLASHx)) + { + /*编程成功*/ + FL_FLASH_ClearFlag_EraseComplete(FLASHx); + ret = FL_PASS; + break; + } + } + FL_FLASH_LockFlash(FLASHx); + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_FLASH); + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_FLASH); + return ret; +} + +/** + * @brief Flash 扇区擦除函数,一个扇区为2k byte. + * @param FLASHx FLASH Port + * @param address 为需要擦除的扇区内任意地址,推荐使用扇区开始的首地址(字对齐) + * . + * @retval ErrorStatus枚举值 + * -FL_FAIL 擦写发生错误 + * -FL_PASS 擦写成功 + */ +FL_ErrorStatus FL_FLASH_SectorErase(FLASH_Type *FLASHx, uint32_t address) +{ + uint32_t timeout = 0; + uint32_t primask; + FL_ErrorStatus ret = FL_PASS; + /* 入口参数检查 */ + assert_param(IS_FLASH_ALL_INSTANCE(FLASHx)); + assert_param(IS_FL_FLASH_MAX_ADDR((uint32_t)address)); + /*时钟使能*/ + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_FLASH); + if((address % FL_FLASH_ADDRS_ALIGN) != 0) + { + /*地址未对齐*/ + return FL_FAIL; + } + if(FL_FLASH_GetFlashLockStatus(FLASHx) == FL_FLASH_KEY_STATUS_ERROR) + { + /*Flash 已经锁定,复位前无法操作*/ + return FL_FAIL; + } + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_FLASH); + /*配置擦写类型*/ + FL_FLASH_SetFlashEraseType(FLASHx, FL_FLASH_ERASE_TYPE_SECTOR); + /* 开始擦除扇区*/ + FL_FLASH_EnableErase(FLASHx); + /* Key 序列*/ + primask = __get_PRIMASK(); + __disable_irq(); + FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_ERASE_KEY); + FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_SECTOR_ERASE_KEY); + __set_PRIMASK(primask); + FL_FLASH_ClearFlag_EraseComplete(FLASHx); + FL_FLASH_ClearFlag_ClockError(FLASHx); + FL_FLASH_ClearFlag_AuthenticationError(FLASHx); + /* 擦请求 */ + *((uint32_t *)address) = FL_FLASH_ERASE_REQUEST; + while(1) + { + timeout++; + if((timeout > FL_FLASH_ERASE_TIMEOUT)\ + || (FL_FLASH_IsActiveFlag_ClockError(FLASHx))\ + || (FL_FLASH_IsActiveFlag_KeyError(FLASHx))\ + || (FL_FLASH_IsActiveFlag_AuthenticationError(FLASHx))) + { + /* 超时或出现错误 */ + ret = FL_FAIL; + break; + } + else + if(FL_FLASH_IsActiveFlag_EraseComplete(FLASHx)) + { + /*编程成功*/ + FL_FLASH_ClearFlag_EraseComplete(FLASHx); + ret = FL_PASS; + break; + } + } + FL_FLASH_LockFlash(FLASHx); + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_FLASH); + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_FLASH); + return ret; +} + +/** + * @brief 单次编程函数,编程地址必须对齐到Word边界. + * @param FLASHx FLASH Port + * @param address 为需要编程的已经擦除过的扇区内任意地址,非对齐地址编程将触发fault。 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 擦写发生错误 + * -FL_PASS 擦写成功 + */ +FL_ErrorStatus FL_FLASH_Program_Word(FLASH_Type *FLASHx, uint32_t address, uint32_t data) +{ + uint32_t timeout = 0; + uint32_t primask; + FL_ErrorStatus ret = FL_PASS; + /* 入口参数检查 */ + assert_param(IS_FLASH_ALL_INSTANCE(FLASHx)); + assert_param(IS_FL_FLASH_MAX_ADDR((uint32_t)address)); + /*时钟使能*/ + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_FLASH); + if((address % FL_FLASH_ADDRS_ALIGN) != 0) + { + /*地址未对齐*/ + return FL_FAIL; + } + if(FL_FLASH_GetFlashLockStatus(FLASHx) == FL_FLASH_KEY_STATUS_ERROR) + { + /*Flash 已经锁定,复位前无法操作*/ + return FL_FAIL; + } + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_FLASH); + /* 开始编程*/ + FL_FLASH_EnableProgram(FLASHx); + /* Key 序列*/ + primask = __get_PRIMASK(); + __disable_irq(); + FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PROGRAM_KEY1); + FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PROGRAM_KEY2); + __set_PRIMASK(primask); + FL_FLASH_ClearFlag_ClockError(FLASHx); + FL_FLASH_ClearFlag_AuthenticationError(FLASHx); + *((uint32_t *)address) = data; + while(1) + { + timeout++; + if((timeout > FL_FLASH_ERASE_TIMEOUT)\ + || (FL_FLASH_IsActiveFlag_ClockError(FLASHx))\ + || (FL_FLASH_IsActiveFlag_KeyError(FLASHx))\ + || (FL_FLASH_IsActiveFlag_AuthenticationError(FLASHx))) + { + /* 超时或出现错误 */ + ret = FL_FAIL; + break; + } + else + if(FL_FLASH_IsActiveFlag_ProgramComplete(FLASHx)) + { + /*编程成功*/ + FL_FLASH_ClearFlag_ProgramComplete(FLASHx); + ret = FL_PASS; + break; + } + } + FL_FLASH_LockFlash(FLASHx); + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_FLASH); + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_FLASH); + return ret; +} + +/** + * @brief 页编程函数,编程地址必须对齐到Page边界. + * @param FLASHx FLASH Port + * @param PageNum 为需要编程的已经擦除过的扇区号,FM33LG04最大为256,非对齐地址编程将触发fault。 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 擦写发生错误 + * -FL_PASS 擦写成功 + */ +FL_ErrorStatus FL_FLASH_Program_Page(FLASH_Type *FLASHx, uint32_t pageNum, uint32_t *data) +{ + uint32_t count; + uint32_t primask; + uint32_t address; + uint32_t timeout; + FL_ErrorStatus ret=FL_PASS; + /* 入口参数检查 */ + assert_param(IS_FLASH_ALL_INSTANCE(FLASHx)); + assert_param(IS_FL_FLASH_MAX_PAGE((uint32_t)pageNum)); + address = pageNum * FL_FLASH_PGAE_SIZE_BYTE; + /* 页对齐*/ + if((address % FL_FLASH_PGAE_SIZE_BYTE) != 0) + { + /*地址未对齐*/ + return FL_FAIL; + } + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_FLASH); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_FLASH); + FL_FLASH_EnableProgram(FLASHx); + /* Key 序列*/ + primask = __get_PRIMASK(); + __disable_irq(); + FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PROGRAM_KEY1); + FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PROGRAM_KEY2); + __set_PRIMASK(primask); + FL_FLASH_ClearFlag_ClockError(FLASHx); + FL_FLASH_ClearFlag_AuthenticationError(FLASHx); + for(count = 0; count < FL_FLASH_PGAE_SIZE_BYTE; count += 4) + { + timeout = 0; + FL_FLASH_EnableProgram(FLASHx); + *((uint32_t *)address) = *data; + address += 4; + data++; + while(1) + { + timeout++; + if((timeout > FL_FLASH_ERASE_TIMEOUT)\ + || (FL_FLASH_IsActiveFlag_ClockError(FLASHx))\ + || (FL_FLASH_IsActiveFlag_KeyError(FLASHx))\ + || (FL_FLASH_IsActiveFlag_AuthenticationError(FLASHx))) + { + /* 超时或出现错误 */ + ret = FL_FAIL; + break; + } + if(FL_FLASH_IsActiveFlag_ProgramComplete(FLASHx)) + { + /*编程成功*/ + FL_FLASH_ClearFlag_ProgramComplete(FLASHx); + ret = FL_PASS; + break; + } + } + if(ret == FL_FAIL) + { + break; + } + } + FL_FLASH_LockFlash(FLASHx); + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_FLASH); + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_FLASH); + return ret; +} + +/** + * @brief 扇区编程函数,编程地址必须对齐到Sector边界. + * @param FLASHx FLASH Port + * @param sectorNum 为需要编程的已经擦除过的扇区号,最大为128,非对齐地址编程将触发fault。 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 擦写发生错误 + * -FL_PASS 擦写成功 + */ +FL_ErrorStatus FL_FLASH_Program_Sector(FLASH_Type *FLASHx, uint32_t sectorNum, uint32_t *data) +{ + uint32_t count; + uint32_t primask; + uint32_t address; + uint32_t timeout; + FL_ErrorStatus ret=FL_PASS; + /* 入口参数检查 */ + assert_param(IS_FLASH_ALL_INSTANCE(FLASHx)); + assert_param(IS_FL_FLASH_MAX_SECTOR((uint32_t)sectorNum)); + address = sectorNum * FL_FLASH_SECTOR_SIZE_BYTE; + /* Sector对齐*/ + if((address % FL_FLASH_SECTOR_SIZE_BYTE) != 0) + { + /*地址未对齐*/ + return FL_FAIL; + } + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_FLASH); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_FLASH); + FL_FLASH_EnableProgram(FLASHx); + /* Key 序列*/ + primask = __get_PRIMASK(); + __disable_irq(); + FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PROGRAM_KEY1); + FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PROGRAM_KEY2); + __set_PRIMASK(primask); + FL_FLASH_ClearFlag_ClockError(FLASHx); + FL_FLASH_ClearFlag_AuthenticationError(FLASHx); + for(count = 0; count < FL_FLASH_SECTOR_SIZE_BYTE; count += 4) + { + timeout = 0; + FL_FLASH_EnableProgram(FLASHx); + *((uint32_t *)address) = *data; + address += 4; + data++; + while(1) + { + timeout++; + if((timeout > FL_FLASH_ERASE_TIMEOUT)\ + || (FL_FLASH_IsActiveFlag_ClockError(FLASHx))\ + || (FL_FLASH_IsActiveFlag_KeyError(FLASHx))\ + || (FL_FLASH_IsActiveFlag_AuthenticationError(FLASHx))) + { + /* 超时或出现错误 */ + ret = FL_FAIL; + break; + } + if(FL_FLASH_IsActiveFlag_ProgramComplete(FLASHx)) + { + /*编程成功*/ + FL_FLASH_ClearFlag_ProgramComplete(FLASHx); + ret = FL_PASS; + break; + } + } + if(ret == FL_FAIL) + { + break; + } + } + FL_FLASH_LockFlash(FLASHx); + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_FLASH); + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_FLASH); + return ret; +} + +/** + * @brief DMA编程函数,编程地址必须对齐到half-page,长度固定为64字. + * @param FLASHx FLASH Port + * @param address 待编程Flash地址 + * @param *data 待写入Flash数据 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 擦写发生错误 + * -FL_PASS 擦写成功 + */ +FL_ErrorStatus FL_FLASH_Write_Dma(FLASH_Type *FLASHx, uint32_t address, uint32_t *data) +{ + FL_ErrorStatus ret=FL_PASS; + uint32_t primask; + uint32_t timeout; + FL_DMA_InitTypeDef DMA_InitStruct = {0}; + /* 入口参数检查 */ + assert_param(IS_FLASH_ALL_INSTANCE(FLASHx)); + assert_param(IS_FL_FLASH_MAX_ADDR(address)); + /* 半页对齐*/ + if((address % (FL_FLASH_PGAE_SIZE_BYTE / 2)) != 0) + { + /*地址未对齐*/ + return FL_FAIL; + } + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_FLASH); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_FLASH); + FL_FLASH_EnableProgram(FLASHx); + /* Key 序列*/ + primask = __get_PRIMASK(); + __disable_irq(); + FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PROGRAM_KEY1); + FL_FLASH_UnlockFlash(FLASHx, FL_FLASH_PROGRAM_KEY2); + __set_PRIMASK(primask); + FL_FLASH_EnableProgram(FLASHx); + DMA_InitStruct.circMode = FL_DISABLE; + DMA_InitStruct.direction = FL_DMA_DIR_RAM_TO_FLASH; + DMA_InitStruct.memoryAddressIncMode = FL_DMA_CH7_RAM_INC_MODE_INCREASE; + DMA_InitStruct.flashAddressIncMode = FL_DMA_CH7_FLASH_INC_MODE_INCREASE; + DMA_InitStruct.priority = FL_DMA_PRIORITY_HIGH; + FL_DMA_Init(DMA, &DMA_InitStruct, FL_DMA_CHANNEL_7); + /* Channel7 Flash 指针地址为(word 地址) */ + FL_DMA_WriteFlashAddress(DMA, address >> 2); + /* Channel7 RAM 指针地址为(word 地址)*/ + FL_DMA_WriteMemoryAddress(DMA, (uint32_t)data >> 2, FL_DMA_CHANNEL_7); + FL_DMA_WriteTransmissionSize(DMA, 64 - 1, FL_DMA_CHANNEL_7); + FL_DMA_ClearFlag_TransferComplete(DMA, FL_DMA_CHANNEL_7); + FL_DMA_EnableChannel(DMA, FL_DMA_CHANNEL_7); + timeout = 0; + while(1) + { + timeout++; + if(timeout > FL_FLASH_ERASE_TIMEOUT) + { + ret = FL_FAIL; + break; + } + if(FL_DMA_IsActiveFlag_TransferComplete(DMA, FL_DMA_CHANNEL_7) == FL_SET) + { + ret = FL_PASS; + break; + } + } + FL_FLASH_LockFlash(FLASHx); + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_FLASH); + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_FLASH); + return ret; +} + +/** + * @brief DMA读取函数,编程地址必须对齐到Word边界. + * @param FLASHx FLASH Port + * @param address 读取数据Flash地址 + * @param *data 读出数据存储区 + * @param length 读出数据的字长度 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 擦写发生错误 + * -FL_PASS 擦写成功 + */ +FL_ErrorStatus FL_FLASH_Read_Dma(FLASH_Type *FLASHx, uint32_t address, uint32_t *data, uint16_t length) +{ + FL_ErrorStatus ret=FL_PASS; + uint32_t Timeout; + FL_DMA_InitTypeDef DMA_InitStruct = {0}; + /* 入口参数检查 */ + assert_param(IS_FLASH_ALL_INSTANCE(FLASHx)); + assert_param(IS_FL_FLASH_MAX_ADDR(address)); + /* 字对齐*/ + if((address % FL_FLASH_ADDRS_ALIGN) != 0) + { + /*地址未对齐*/ + return FL_FAIL; + } + DMA_InitStruct.circMode = FL_DISABLE; + DMA_InitStruct.direction = FL_DMA_DIR_FLASH_TO_RAM; + DMA_InitStruct.memoryAddressIncMode = FL_DMA_CH7_RAM_INC_MODE_INCREASE; + DMA_InitStruct.flashAddressIncMode = FL_DMA_CH7_FLASH_INC_MODE_INCREASE; + DMA_InitStruct.priority = FL_DMA_PRIORITY_HIGH; + FL_DMA_Init(DMA, &DMA_InitStruct, FL_DMA_CHANNEL_7); + /* Channel7 Flash 指针地址为(word 地址) */ + FL_DMA_WriteFlashAddress(DMA, address >> 2); + /* Channel7 RAM 指针地址为(word 地址)*/ + FL_DMA_WriteMemoryAddress(DMA, (uint32_t)data >> 2, FL_DMA_CHANNEL_7); + FL_DMA_WriteTransmissionSize(DMA, length - 1, FL_DMA_CHANNEL_7); + FL_DMA_ClearFlag_TransferComplete(DMA, FL_DMA_CHANNEL_7); + FL_DMA_EnableChannel(DMA, FL_DMA_CHANNEL_7); + Timeout = 0; + while(1) + { + Timeout++; + if(Timeout > FL_FLASH_ERASE_TIMEOUT) + { + ret = FL_FAIL; + break; + } + if(FL_DMA_IsActiveFlag_TransferComplete(DMA, FL_DMA_CHANNEL_7) == FL_SET) + { + ret = FL_PASS; + break; + } + } + return ret; +} + +/** + * @} + */ + +#endif /* FL_FLASH_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ + + + + + + + + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_gpio.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_gpio.c new file mode 100644 index 0000000..51344a5 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_gpio.c @@ -0,0 +1,405 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_gpio.c + * @author FMSH Application Team + * @brief Src file of GPIO FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup GPIO + * @{ + */ + +#ifdef FL_GPIO_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup GPIO_FL_Private_Macros + * @{ + */ + +#define IS_GPIO_ALL_INSTANCE(INTENCE) (((INTENCE) == GPIOA)||\ + ((INTENCE) == GPIOB)||\ + ((INTENCE) == GPIOC)||\ + ((INTENCE) == GPIOD)||\ + ((INTENCE) == GPIOE)) + +#define IS_FL_GPIO_PIN(__VALUE__) ((((uint32_t)0x00000000U) < (__VALUE__)) &&\ + ((__VALUE__) <= (FL_GPIO_PIN_ALL))) + +#define IS_FL_GPIO_MODE(__VALUE__) (((__VALUE__) == FL_GPIO_MODE_ANALOG)||\ + ((__VALUE__) == FL_GPIO_MODE_INPUT)||\ + ((__VALUE__) == FL_GPIO_MODE_OUTPUT)||\ + ((__VALUE__) == FL_GPIO_MODE_DIGITAL)) + +#define IS_FL_GPIO_OPENDRAIN(__VALUE__) (((__VALUE__) == FL_GPIO_OUTPUT_OPENDRAIN)||\ + ((__VALUE__) == FL_GPIO_OUTPUT_PUSHPULL)) + +#define IS_FL_GPIO_PULL_UP(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_GPIO_ANALOG_SWITCH(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_GPIO_WKUP_ENTRY(__VALUE__) (((__VALUE__) == FL_GPIO_WKUP_INT_ENTRY_NMI)||\ + ((__VALUE__) == FL_GPIO_WKUP_INT_ENTRY_NUM_38)) + +#define IS_FL_GPIO_WKUP_EDGE(__VALUE__) (((__VALUE__) == FL_GPIO_WAKEUP_TRIGGER_RISING)||\ + ((__VALUE__) == FL_GPIO_WAKEUP_TRIGGER_FALLING)||\ + ((__VALUE__) == FL_GPIO_WAKEUP_TRIGGER_BOTH)) + + +#define IS_FL_GPIO_WKUP_NUM(__VALUE__) (((__VALUE__) == FL_GPIO_WAKEUP_0)||\ + ((__VALUE__) == FL_GPIO_WAKEUP_1)||\ + ((__VALUE__) == FL_GPIO_WAKEUP_2)||\ + ((__VALUE__) == FL_GPIO_WAKEUP_3)||\ + ((__VALUE__) == FL_GPIO_WAKEUP_4)||\ + ((__VALUE__) == FL_GPIO_WAKEUP_5)||\ + ((__VALUE__) == FL_GPIO_WAKEUP_6)||\ + ((__VALUE__) == FL_GPIO_WAKEUP_7)||\ + ((__VALUE__) == FL_GPIO_WAKEUP_8)||\ + ((__VALUE__) == FL_GPIO_WAKEUP_9)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup GPIO_FL_EF_Init + * @{ + */ + +/** + * @brief 复位对应GPIO控制寄存器. + * @param GPIOx GPIO Port + * @retval ErrorStatus枚举值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_GPIO_DeInit(GPIO_Type *GPIOx, uint32_t pin) +{ + uint32_t pinPos = 0x00000000U; + uint32_t currentPin = 0x00000000U; + /* 入口参数检查 */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_FL_GPIO_PIN(pin)); + /* 恢复寄存器值为默认值 */ + while(((pin) >> pinPos) != 0x00000000U) + { + /* 获取当前遍历到的Pin脚 */ + currentPin = (pin) & (0x00000001U << pinPos); + if(currentPin) + { + FL_GPIO_SetPinMode(GPIOx, currentPin, FL_GPIO_MODE_INPUT); + FL_GPIO_DisablePinInput(GPIOx, currentPin); + FL_GPIO_DisablePinOpenDrain(GPIOx, currentPin); + FL_GPIO_DisablePinPullup(GPIOx, currentPin); + FL_GPIO_DisablePinAnalogSwitch(GPIOx, currentPin); + FL_GPIO_DisablePinRemap(GPIOx, currentPin); + } + pinPos++; + } + return FL_PASS; +} + +#if defined (FM33LG0x3A) /* 仅针对32pin芯片处理 */ +/** +* @brief 复用GPIO数据类型,单个元素为一组复用的GPIO + */ +static const struct MultiplexGpioType +{ + /* 成员元素 */ + const struct + { + GPIO_Type *GPIox; /* 元素信息: GPIO的Port索引 */ + uint32_t Pin; /* 元素信息: GPIO的Pin索引 */ + } MultiplexGpioElement[2]; /* 一组复用关系,无先后顺序 */ + +} MultiplexGpioTable[] = /* 复用GPIO的表格清单 */ +{ + { {{GPIOA, (uint32_t)FL_GPIO_PIN_9 }/*PA9 */, {GPIOA, (uint32_t)FL_GPIO_PIN_11}/*PA11*/} },/* 此为一组复用关系 */ + { {{GPIOB, (uint32_t)FL_GPIO_PIN_0 }/*PB0 */, {GPIOA, (uint32_t)FL_GPIO_PIN_12}/*PA12*/} }, + { {{GPIOB, (uint32_t)FL_GPIO_PIN_7 }/*PB7 */, {GPIOB, (uint32_t)FL_GPIO_PIN_8 }/*PB8 */} }, + { {{GPIOB, (uint32_t)FL_GPIO_PIN_12}/*PB12*/, {GPIOE, (uint32_t)FL_GPIO_PIN_1 }/*PE1 */} }, + { {{GPIOC, (uint32_t)FL_GPIO_PIN_2 }/*PC2 */, {GPIOD, (uint32_t)FL_GPIO_PIN_12}/*PD12*/} }, + { {{GPIOD, (uint32_t)FL_GPIO_PIN_11}/*PD11*/, {GPIOD, (uint32_t)FL_GPIO_PIN_0 }/*PD0 */} }, + { {{GPIOD, (uint32_t)FL_GPIO_PIN_6 }/*PD6 */, {GPIOD, (uint32_t)FL_GPIO_PIN_1 }/*PD1 */} } +}; + +/** +* @brief 复用GPIO的组数 + */ +static const uint32_t u32MultiplexGpioCount =\ + (uint32_t)((sizeof(MultiplexGpioTable)) / (sizeof(MultiplexGpioTable[0]))); + +/** +* @brief 针对复用GPIO,如有一个GPIO使用,则将另一个GPIO配置为高阻抗,避免相互影响 + * @param GPIOx 当前使用的GPIO Port索引 + * @param pin 当前使用的GPIO Pin索引 + * @retval 无 + */ +static void FL_GPIO_Multiplex_DeInit(GPIO_Type *GPIOx, uint32_t pin) +{ + /* 指向复用GPIO表格的指针 */ + const struct MultiplexGpioType *pMultiplexGpio = MultiplexGpioTable; + + /* 入口参数检查 */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_FL_GPIO_PIN(pin)); + + for( ; pMultiplexGpio < (MultiplexGpioTable + u32MultiplexGpioCount); pMultiplexGpio++) + { + if( (pMultiplexGpio->MultiplexGpioElement[0].Pin == pin)\ + && (pMultiplexGpio->MultiplexGpioElement[0].GPIox == GPIOx)) + { + /* 未使用的GPIO执行高阻抗初始化 */ + FL_GPIO_DeInit(pMultiplexGpio->MultiplexGpioElement[1].GPIox,\ + pMultiplexGpio->MultiplexGpioElement[1].Pin ); + break; + } + else if( (pMultiplexGpio->MultiplexGpioElement[1].Pin == pin)\ + && (pMultiplexGpio->MultiplexGpioElement[1].GPIox == GPIOx)) + { + /* 未使用的GPIO执行高阻抗初始化 */ + FL_GPIO_DeInit(pMultiplexGpio->MultiplexGpioElement[0].GPIox,\ + pMultiplexGpio->MultiplexGpioElement[0].Pin ); + break; + } + } +} +#endif /* #if defined (FM33LG0x3A) */ + +/** + * @brief 根据 GPIO_InitStruct的配置信息初始化对应外设. + * @param GPIOx GPIO Port + * @param GPIO_InitStruct 指向一个 @ref FL_GPIO_InitTypeDef 结构体 + * 其中包含了外设的相关配置信息. + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 配置成功 + */ +FL_ErrorStatus FL_GPIO_Init(GPIO_Type *GPIOx, FL_GPIO_InitTypeDef *initStruct) +{ + uint32_t pinPos = 0x00000000U; + uint32_t currentPin = 0x00000000U; + /* 入口参数检查 */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_FL_GPIO_PIN(initStruct->pin)); + assert_param(IS_FL_GPIO_MODE(initStruct->mode)); + assert_param(IS_FL_GPIO_OPENDRAIN(initStruct->outputType)); + assert_param(IS_FL_GPIO_PULL_UP(initStruct->pull)); + assert_param(IS_FL_GPIO_ANALOG_SWITCH(initStruct->analogSwitch)); + /* 使能时钟总线 */ + FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_PAD); + /* 这里考虑到PIN有可能不止一个因此需要遍历 */ + while(((initStruct->pin) >> pinPos) != 0x00000000U) + { + /* 获取当前遍历到的Pin脚 */ + currentPin = (initStruct->pin) & (0x00000001U << pinPos); + if(currentPin) + { + #if defined (FM33LG0x3A) /* 仅针对32pin芯片处理 */ + /* 检查复用引脚,并做处理 */ + FL_GPIO_Multiplex_DeInit(GPIOx, currentPin); + #endif /* #if defined (FM33LG0x3A) */ + /* Pin脚模拟模式设置 */ + if(initStruct->mode == FL_GPIO_MODE_ANALOG) + { + FL_GPIO_DisablePinInput(GPIOx, currentPin); + FL_GPIO_DisablePinPullup(GPIOx, currentPin); + FL_GPIO_DisablePinOpenDrain(GPIOx, currentPin); + if(initStruct->analogSwitch == FL_ENABLE) + { + FL_GPIO_EnablePinAnalogSwitch(GPIOx, currentPin); + } + else + { + FL_GPIO_DisablePinAnalogSwitch(GPIOx, currentPin); + } + } + else + { + FL_GPIO_DisablePinAnalogSwitch(GPIOx, currentPin); + /* Pin脚输入使能控制 */ + if(initStruct->mode == FL_GPIO_MODE_INPUT) + { + FL_GPIO_EnablePinInput(GPIOx, currentPin); + } + else + { + FL_GPIO_DisablePinInput(GPIOx, currentPin); + } + /* Pin脚输出模式设置 */ + if(initStruct->outputType == FL_GPIO_OUTPUT_PUSHPULL) + { + FL_GPIO_DisablePinOpenDrain(GPIOx, currentPin); + } + else + { + FL_GPIO_EnablePinOpenDrain(GPIOx, currentPin); + } + /* Pin脚上拉模式设置 */ + if(initStruct->pull) + { + FL_GPIO_EnablePinPullup(GPIOx, currentPin); + } + else + { + FL_GPIO_DisablePinPullup(GPIOx, currentPin); + } + } + /* 数字模式复用功能选择 */ + if(initStruct->mode == FL_GPIO_MODE_DIGITAL) + { + /*重定向*/ + if(initStruct->remapPin == FL_ENABLE) + { + FL_GPIO_EnablePinRemap(GPIOx, currentPin); + } + else + { + FL_GPIO_DisablePinRemap(GPIOx, currentPin); + } + } + /* Pin脚工作模式设置 */ + FL_GPIO_SetPinMode(GPIOx, currentPin, initStruct->mode); + } + pinPos++; + } + return FL_PASS; +} + +/** + * @brief 设置 GPIO_InitStruct 为默认配置 + * @param GPIO_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_GPIO_InitTypeDef 结构体 + * + * @retval None + */ +void FL_GPIO_StructInit(FL_GPIO_InitTypeDef *initStruct) +{ + /* 复位配置信息 */ + initStruct->pin = FL_GPIO_PIN_ALL; + initStruct->mode = FL_GPIO_MODE_INPUT; + initStruct->outputType = FL_GPIO_OUTPUT_OPENDRAIN; + initStruct->pull = FL_DISABLE; + initStruct->remapPin = FL_DISABLE; + initStruct->analogSwitch = FL_DISABLE; +} + +/** + * @brief 根据 WKUP_InitTypeDef的配置信息初始化对应外设. + * @param WKUP_InitTypeDef 指向一个 @ref FL_WKUP_InitTypeDef 结构体 + * 其中包含了外设的相关配置信息. + * @param Wkupx 唤醒入口 + * FL_GPIO_WKUP_0 + * FL_GPIO_WKUP_1 + * FL_GPIO_WKUP_2 + * FL_GPIO_WKUP_3 + * FL_GPIO_WKUP_4 + * FL_GPIO_WKUP_5 + * FL_GPIO_WKUP_6 + * FL_GPIO_WKUP_7 + * FL_GPIO_WKUP_8 + * FL_GPIO_WKUP_9 + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 配置成功 + */ +FL_ErrorStatus FL_WKUP_Init(FL_WKUP_InitTypeDef *initStruct, uint32_t wakeup) +{ + /* 入口参数检查 */ + assert_param(IS_FL_GPIO_WKUP_NUM(wakeup)); + assert_param(IS_FL_GPIO_WKUP_EDGE(initStruct->polarity)); + FL_GPIO_EnableWakeup(GPIO, wakeup); + FL_GPIO_SetWakeupEdge(GPIO, wakeup, initStruct->polarity); + return FL_PASS; +} + +/** + * @brief 去初始化Wakeup设置. + * @param Wkupx 唤醒入口 + * FL_GPIO_WKUP_0 + * FL_GPIO_WKUP_1 + * FL_GPIO_WKUP_2 + * FL_GPIO_WKUP_3 + * FL_GPIO_WKUP_4 + * FL_GPIO_WKUP_5 + * FL_GPIO_WKUP_6 + * FL_GPIO_WKUP_7 + * FL_GPIO_WKUP_8 + * FL_GPIO_WKUP_9 + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 配置成功 + */ +FL_ErrorStatus FL_WKUP_DeInit(uint32_t wakeup) +{ + /* 入口参数检查 */ + assert_param(IS_FL_GPIO_WKUP_NUM(wakeup)); + FL_GPIO_DisableWakeup(GPIO, wakeup); + return FL_PASS; +} + +/** + * @brief 设置 GPIO_InitStruct 为默认配置 + * @param GPIO_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_GPIO_InitTypeDef 结构体 + * + * @retval None + */ +void FL_WKUP_StructInit(FL_WKUP_InitTypeDef *initStruct_Wakeup) +{ + /* 复位配置信息 */ + initStruct_Wakeup->polarity = FL_GPIO_WAKEUP_TRIGGER_FALLING; +} + +/** + * @brief 配置所有IO口为输入模式、输入使能关闭(高阻态),SWD接口除外。 + * @note PD7和PD8为调试接口 + * + * @param None + * + * @retval None + */ +void FL_GPIO_ALLPIN_LPM_MODE(void) +{ + FL_GPIO_DeInit(GPIOA, FL_GPIO_PIN_ALL); + FL_GPIO_DeInit(GPIOB, FL_GPIO_PIN_ALL); + FL_GPIO_DeInit(GPIOC, FL_GPIO_PIN_ALL); + FL_GPIO_DeInit(GPIOD, FL_GPIO_PIN_ALL & + (~FL_GPIO_PIN_7) & (~FL_GPIO_PIN_8)); + FL_GPIO_DeInit(GPIOE, FL_GPIO_PIN_ALL); +} + +/** + * @} + */ + +#endif /* FL_GPIO_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_gptim.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_gptim.c new file mode 100644 index 0000000..48c926d --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_gptim.c @@ -0,0 +1,641 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_gptim.c + * @author FMSH Application Team + * @brief Src file of GPTIM FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup GPTIM + * @{ + */ + +#ifdef FL_GPTIM_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup GPTIM_FL_Private_Macros + * @{ + */ + +#define IS_GPTIM_INSTANCE(TIMx) (((TIMx) == GPTIM0) || \ + ((TIMx) == GPTIM1) || \ + ((TIMx) == GPTIM2)) + +#define IS_FL_GPTIM_COUNTERMODE(__VALUE__) (((__VALUE__) == FL_GPTIM_COUNTER_DIR_UP) || \ + ((__VALUE__) == FL_GPTIM_COUNTER_DIR_DOWN) || \ + ((__VALUE__) == FL_GPTIM_COUNTER_ALIGNED_EDGE) || \ + ((__VALUE__) == FL_GPTIM_COUNTER_ALIGNED_CENTER_UP) || \ + ((__VALUE__) == FL_GPTIM_COUNTER_ALIGNED_CENTER_DOWN) || \ + ((__VALUE__) == FL_GPTIM_COUNTER_ALIGNED_CENTER_UP_DOWN)) + +#define IS_FL_GPTIM_CLOCKDIVISION(__VALUE__) (((__VALUE__) == FL_GPTIM_CLK_DIVISION_DIV1) || \ + ((__VALUE__) == FL_GPTIM_CLK_DIVISION_DIV2) || \ + ((__VALUE__) == FL_GPTIM_CLK_DIVISION_DIV4)) + + +#define IS_FL_GPTIM_CHANNEL_MODE(__VALUE__) (((__VALUE__) == FL_GPTIM_CHANNEL_MODE_OUTPUT) || \ + ((__VALUE__) == FL_GPTIM_CHANNEL_MODE_INPUT_NORMAL) || \ + ((__VALUE__) == FL_GPTIM_CHANNEL_MODE_INPUT_CROSSOVER) || \ + ((__VALUE__) == FL_GPTIM_CHANNEL_MODE_INPUT_TRC)) + +#define IS_FL_GPTIM_IC_FILTER(__VALUE__) (((__VALUE__) == FL_GPTIM_IC_FILTER_DIV1) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV1_N2) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV1_N4) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV1_N8) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV2_N6) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV2_N8) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV4_N6) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV4_N8) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV8_N6) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV8_N8) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV16_N5) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV16_N6) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV16_N8) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV32_N5) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV32_N6) || \ + ((__VALUE__) == FL_GPTIM_IC_FILTER_DIV32_N8)) + +#define IS_FL_GPTIM_CHANNEL(__VALUE__) (((__VALUE__) == FL_GPTIM_CHANNEL_1)\ + || ((__VALUE__) == FL_GPTIM_CHANNEL_2)\ + || ((__VALUE__) == FL_GPTIM_CHANNEL_3)\ + || ((__VALUE__) == FL_GPTIM_CHANNEL_4)) + + + +#define IS_FL_GPTIM_SLAVE_MODE(__VALUE__) (((__VALUE__) == FL_GPTIM_SLAVE_MODE_PROHIBITED)\ + || ((__VALUE__) == FL_GPTIM_SLAVE_MODE_ENCODER_X2_TI1)\ + || ((__VALUE__) == FL_GPTIM_SLAVE_MODE_ENCODER_X2_TI2)\ + || ((__VALUE__) == FL_GPTIM_SLAVE_MODE_ENCODER_X4_TI1TI2)\ + || ((__VALUE__) == FL_GPTIM_SLAVE_MODE_TRGI_RISE_RST)\ + || ((__VALUE__) == FL_GPTIM_SLAVE_MODE_TRGI_HIGH_RUN)\ + || ((__VALUE__) == FL_GPTIM_SLAVE_MODE_TRGI_RISE_RUN)\ + || ((__VALUE__) == FL_GPTIM_SLAVE_MODE_TRGI_CLK)) + + +#define IS_FL_GPTIM_TRIGGER_SRC(__VALUE__) (((__VALUE__) ==FL_GPTIM_TIM_TS_ITR0 )\ + ||((__VALUE__) ==FL_GPTIM_TIM_TS_ITR1 )\ + ||((__VALUE__) ==FL_GPTIM_TIM_TS_ITR2)\ + ||((__VALUE__) ==FL_GPTIM_TIM_TS_ITR3)\ + ||((__VALUE__) ==FL_GPTIM_TIM_TS_TI1F_ED)\ + ||((__VALUE__) ==FL_GPTIM_TIM_TS_TI1FP1)\ + ||((__VALUE__) ==FL_GPTIM_TIM_TS_TI2FP2)\ + ||((__VALUE__) ==FL_GPTIM_TIM_TS_ETRF)) + + + +#define IS_FL_GPTIM_ETR_FILTER(__VALUE__) (((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV1) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV1_N2) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV1_N4) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV1_N8) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV2_N6) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV2_N8) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV4_N6) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV4_N8) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV8_N6) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV8_N8) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV16_N5) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV16_N6) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV16_N8) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV32_N5) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV32_N6) || \ + ((__VALUE__) == FL_GPTIM_ETR_FILTER_DIV32_N8)) + + +#define IS_FL_GPTIM_ETR_PSC(__VALUE__) (((__VALUE__) == FL_GPTIM_ETR_PSC_DIV1) ||\ + ((__VALUE__) == FL_GPTIM_ETR_PSC_DIV2) ||\ + ((__VALUE__) == FL_GPTIM_ETR_PSC_DIV4) ||\ + ((__VALUE__) == FL_GPTIM_ETR_PSC_DIV8)) + +#define IS_FL_GPTIM_ETR_POLARITY(__VALUE__) (((__VALUE__) == FL_GPTIM_ETR_POLARITY_NORMAL) || \ + ((__VALUE__) == FL_GPTIM_ETR_POLARITY_INVERT)) + + + +#define IS_FL_GPTIM_IC_POLARITY(__VALUE__) (((__VALUE__) == FL_GPTIM_IC_POLARITY_NORMAL) \ + || ((__VALUE__) == FL_GPTIM_IC_POLARITY_INVERT)) + + + +#define IS_FL_GPTIM_IC_PSC(__VALUE__) (((__VALUE__) == FL_GPTIM_IC_PSC_DIV1) \ + || ((__VALUE__) == FL_GPTIM_IC_PSC_DIV2) \ + || ((__VALUE__) == FL_GPTIM_IC_PSC_DIV4) \ + || ((__VALUE__) == FL_GPTIM_IC_PSC_DIV8)) + +#define IS_FL_GPTIM_OC_POLARITY(__VALUE__) (((__VALUE__) == FL_GPTIM_OC_POLARITY_NORMAL) \ + || ((__VALUE__) == FL_GPTIM_OC_POLARITY_INVERT)) + +#define IS_FL_GPTIM_OC_MODE(__VALUE__) (((__VALUE__) == FL_GPTIM_OC_MODE_FROZEN) \ + || ((__VALUE__) == FL_GPTIM_OC_MODE_ACTIVE) \ + || ((__VALUE__) == FL_GPTIM_OC_MODE_INACTIVE) \ + || ((__VALUE__) == FL_GPTIM_OC_MODE_TOGGLE) \ + || ((__VALUE__) == FL_GPTIM_OC_MODE_FORCED_INACTIVE) \ + || ((__VALUE__) == FL_GPTIM_OC_MODE_FORCED_ACTIVE) \ + || ((__VALUE__) == FL_GPTIM_OC_MODE_PWM1) \ + || ((__VALUE__) == FL_GPTIM_OC_MODE_PWM2)) + +#define IS_FL_GPTIM_OC_FASTMODE(__VALUE__) (((__VALUE__) == FL_ENABLE) \ + || ((__VALUE__) == FL_DISABLE)) + +#define IS_FL_GPTIM_OC_PRELOAD(__VALUE__) (((__VALUE__) == FL_ENABLE) \ + || ((__VALUE__) == FL_DISABLE)) + +#define IS_FL_GPTIM_OC_ETR_CLEARN(__VALUE__) (((__VALUE__) == FL_ENABLE) \ + || ((__VALUE__) == FL_DISABLE)) + + +#define IS_FL_GPTIM_TRIGGER_DELAY(__VALUE__) (((__VALUE__) == FL_DISABLE) \ + || ((__VALUE__) == FL_ENABLE)) + + +#define IS_FL_GPTIM_IC_CAPTURE_STATE(__VALUE__) (((__VALUE__) == FL_DISABLE) \ + || ((__VALUE__) == FL_ENABLE)) +/** + * @} + */ + + +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup TIM_FL_Private_Functions TIM Private Functions + * @{ + */ +static FL_ErrorStatus OCConfig(GPTIM_Type *TIMx, uint32_t Channel, FL_GPTIM_OC_InitTypeDef *TIM_OC_InitStruct); + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIM_FL_EF_Init + * @{ + */ + +/** + * @brief 复位对应GPTIMx寄存器. + * @param GPTIMx + * @retval ErrorStatus枚举值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_GPTIM_DeInit(GPTIM_Type *TIMx) +{ + FL_ErrorStatus result = FL_PASS; + /* Check the parameters */ + assert_param(IS_GPTIM_INSTANCE(TIMx)); + /* 使能外设复位 */ + FL_RMU_EnablePeripheralReset(RMU); + if(TIMx == GPTIM0) + { + /* 使能外设复位 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_GPTIM0); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_GPTIM0); + /* 关闭外设时钟 */ + FL_CMU_DisableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM0); + } + else + if(TIMx == GPTIM1) + { + /* 使能外设复位 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_GPTIM1); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_GPTIM1); + /* 关闭外设时钟 */ + FL_CMU_DisableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM1); + } + else + if(TIMx == GPTIM2) + { + /* 使能外设复位 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_GPTIM2); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_GPTIM2); + /* 关闭外设时钟 */ + FL_CMU_DisableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM2); + } + else + { + result = FL_FAIL; + } + /* 锁定外设复位 */ + FL_RMU_DisablePeripheralReset(RMU); + return result; +} +/** + * @brief 配置基本定时器时基单元(内部时钟源). + * @param TIMx Timer Instance + * @param TIM_InitStruct 指向一个 @ref FL_GPTIM_InitTypeDef(时基配置结构体) + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_GPTIM_Init(GPTIM_Type *TIMx, FL_GPTIM_InitTypeDef *init) +{ + uint32_t i = 5; + /* 参数检查 */ + assert_param(IS_GPTIM_INSTANCE(TIMx)); + assert_param(IS_FL_GPTIM_COUNTERMODE(init->counterMode)); + assert_param(IS_FL_GPTIM_CLOCKDIVISION(init->clockDivision)); + /* 时钟总线使能配置 */ + if(TIMx == GPTIM0) + { + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM0); + } + else + if(TIMx == GPTIM1) + { + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM1); + } + else + { + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM2); + } + /* 计数器计数模式配置 */ + switch(init->counterMode) + { + /* 中心对称模式 */ + case FL_GPTIM_COUNTER_ALIGNED_CENTER_DOWN : + case FL_GPTIM_COUNTER_ALIGNED_CENTER_UP : + case FL_GPTIM_COUNTER_ALIGNED_CENTER_UP_DOWN: + FL_GPTIM_SetCounterAlignedMode(TIMx, init->counterMode); + break; + default: + /* 边沿模式 */ + FL_GPTIM_SetCounterDirection(TIMx, init->counterMode); + FL_GPTIM_SetCounterAlignedMode(TIMx, FL_GPTIM_COUNTER_ALIGNED_EDGE); + break; + } + /* 自动重装载值 */ + FL_GPTIM_WriteAutoReload(TIMx, init->autoReload); + /* 定时器分频系数与数字滤波器所使用的采样时钟分频比 */ + FL_GPTIM_SetClockDivision(TIMx, init->clockDivision); + /* 时钟分频 */ + FL_GPTIM_WritePrescaler(TIMx, init->prescaler); + /* 预装载配置 */ + if(init->autoReloadState == FL_ENABLE) + { + FL_GPTIM_EnableARRPreload(TIMx); + } + else + { + FL_GPTIM_DisableARRPreload(TIMx); + } + /* 手动触发更新事件,将配置值写入 */ + FL_GPTIM_GenerateUpdateEvent(TIMx); + while((!FL_GPTIM_IsActiveFlag_Update(TIMx))&&i) + { + i--; + } + FL_GPTIM_ClearFlag_Update(TIMx); + return FL_PASS; +} + +/** + * @brief 设置 FL_GPTIM_InitTypeDef 为默认配置 + * @param TIM_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_GPTIM_InitTypeDef 结构体 + * + * @retval None + */ +void FL_GPTIM_StructInit(FL_GPTIM_InitTypeDef *TIM_InitStruct) +{ + /* Set the default configuration */ + TIM_InitStruct->prescaler = (uint16_t)0x0000; + TIM_InitStruct->autoReloadState = FL_DISABLE; + TIM_InitStruct->counterMode = FL_GPTIM_COUNTER_DIR_UP; + TIM_InitStruct->autoReload = 0xFFFFU; + TIM_InitStruct->clockDivision = FL_GPTIM_CLK_DIVISION_DIV1; +} + +/** + * @brief 配置基本定时器外部时钟源模式,包括编码器模式. + * @param TIMx Timer Instance + * @param slave_init 指向一个 @ref FL_GPTIM_SlaveInitTypeDef 结构体 + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_GPTIM_SlaveMode_Init(GPTIM_Type *TIMx, FL_GPTIM_SlaveInitTypeDef *slave_init) +{ + /* 参数检查 */ + assert_param(IS_GPTIM_INSTANCE(TIMx)); + assert_param(IS_FL_GPTIM_SLAVE_MODE(slave_init->slaveMode)); + assert_param(IS_FL_GPTIM_TRIGGER_SRC(slave_init->triggerSrc)); + assert_param(IS_FL_GPTIM_TRIGGER_DELAY(slave_init->triggerDelay)); + /* 时钟总线使能配置 */ + if(TIMx == GPTIM0) + { + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM0); + } + else + if(TIMx == GPTIM1) + { + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM1); + } + else + { + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM2); + } + /* 触发延迟默认关闭 */ + FL_GPTIM_DisableMasterSlaveMode(TIMx); + /* 关闭从模式以能写入TS */ + FL_GPTIM_SetSlaveMode(TIMx, 0); + /* 从模式输入源选择 */ + FL_GPTIM_SetTriggerInput(TIMx, slave_init->triggerSrc); + /* ITRx 输入源选择 */ + if(slave_init->triggerSrc <= FL_GPTIM_TIM_TS_ITR3) + { + /* 内部触发ITRx源选择 */ + FL_GPTIM_SetITRInput(TIMx, (1U << (slave_init->triggerSrc >> GPTIM_SMCR_TS_Pos)), slave_init->ITRSourceGroup); + } + /* 从模式选择 */ + FL_GPTIM_SetSlaveMode(TIMx, slave_init->slaveMode); + /* 触发延迟默认关闭 */ + if(slave_init->triggerDelay == FL_ENABLE) + { + FL_GPTIM_EnableMasterSlaveMode(TIMx); + } + return FL_PASS; +} + +/** + * @brief 设置 FL_GPTIM_SlaveInitTypeDef 为默认配置 + * @param TIM_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_GPTIM_SlaveInitTypeDef 结构体 + * + * @retval None + */ +void FL_GPTIM_SlaveMode_StructInit(FL_GPTIM_SlaveInitTypeDef *slave_init) +{ + slave_init->ITRSourceGroup = 0; + slave_init->slaveMode = FL_GPTIM_SLAVE_MODE_PROHIBITED; + slave_init->triggerSrc = FL_GPTIM_TIM_TS_TI1FP1; + slave_init->triggerDelay = FL_DISABLE; +} +/** + * @brief 配置TIM触发输入捕获通道ETR. + * @param TIMx Timer Instance + * @param ETPolarity 极性 + * @param ETPrescaler 分频 + * @param ETR_Filter 滤波 + * @param etr_init 指向一个 @ref FL_GPTIM_ETR_InitTypeDef 结构体 + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_GPTIM_ETR_Init(GPTIM_Type *TIMx, FL_GPTIM_ETR_InitTypeDef *etr_init) +{ + assert_param(IS_FL_GPTIM_ETR_FILTER(etr_init->ETRFilter)); + assert_param(IS_FL_GPTIM_ETR_PSC(etr_init->ETRClockDivision)); + assert_param(IS_FL_GPTIM_ETR_POLARITY(etr_init->ETRPolarity)); + /* 时钟总线使能配置 */ + if(TIMx == GPTIM0) + { + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM0); + } + else + if(TIMx == GPTIM1) + { + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM1); + } + else + { + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM2); + } + /* 外部时钟极性 */ + FL_GPTIM_SetETRPolarity(TIMx, etr_init->ETRPolarity); + /* 外部时钟滤波 */ + FL_GPTIM_SetETRFilter(TIMx, etr_init->ETRFilter); + /* 外部时钟分频 */ + FL_GPTIM_SetETRPrescaler(TIMx, etr_init->ETRClockDivision); + if(etr_init->useExternalTrigger == FL_ENABLE) + { + FL_GPTIM_EnableExternalClock(TIMx); + } + else + { + FL_GPTIM_DisableExternalClock(TIMx); + } + return FL_PASS; +} + +/** + * @brief 设置 FL_GPTIM_ETRInitTypeDef 为默认配置 + * @param etr_init 指向需要将值设置为默认配置的结构体 @ref FL_GPTIM_ETR_InitTypeDef 结构体 + * + * @retval None + */ +void FL_GPTIM_ETR_StructInit(FL_GPTIM_ETR_InitTypeDef *etr_init) +{ + etr_init->useExternalTrigger = FL_DISABLE; + etr_init->ETRFilter = FL_GPTIM_ETR_FILTER_DIV1; + etr_init->ETRPolarity = FL_GPTIM_ETR_POLARITY_NORMAL; + etr_init->ETRClockDivision = FL_GPTIM_ETR_PSC_DIV1; +} + +/** + * @brief 配置TIM的比较输出通道. + * @param TIMx Timer Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_0 + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @param oc_init 指向一个 @ref FL_GPTIM_OC_InitTypeDef 结构体 + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_GPTIM_OC_Init(GPTIM_Type *TIMx, uint32_t channel, FL_GPTIM_OC_InitTypeDef *oc_init) +{ + FL_ErrorStatus result = FL_PASS; + /* 参数检查 */ + assert_param(IS_GPTIM_INSTANCE(TIMx)); + assert_param(IS_FL_GPTIM_OC_MODE(oc_init->OCMode)); + assert_param(IS_FL_GPTIM_OC_PRELOAD(oc_init->OCPreload)); + assert_param(IS_FL_GPTIM_OC_POLARITY(oc_init->OCPolarity)); + assert_param(IS_FL_GPTIM_OC_FASTMODE(oc_init->OCFastMode)); + assert_param(IS_FL_GPTIM_OC_ETR_CLEARN(oc_init->OCETRFStatus)); + /* 通道关闭 */ + FL_GPTIM_OC_DisableChannel(TIMx, channel); + /* 通道极性 */ + FL_GPTIM_OC_SetChannelPolarity(TIMx, oc_init->OCPolarity, channel); + /* 捕获映射到输出通道 */ + FL_GPTIM_CC_SetChannelMode(TIMx, FL_GPTIM_CHANNEL_MODE_OUTPUT, channel); + /* 输出比较模式寄存器配置 */ + OCConfig(TIMx, channel, oc_init); + /* 通道使能 */ + FL_GPTIM_OC_EnableChannel(TIMx, channel); + /* 手动触发更新事件,将配置值写入 */ + FL_GPTIM_GenerateUpdateEvent(TIMx); + FL_GPTIM_ClearFlag_Update(TIMx); + return result; +} +/** + * @brief 配置 + * @param TIMx Timer Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_0 + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @param oc_init 指向需要将值设置为默认配置的结构体 @ref FL_GPTIM_OC_InitTypeDef 结构体包含配置参数. + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +static FL_ErrorStatus OCConfig(GPTIM_Type *TIMx, uint32_t channel, FL_GPTIM_OC_InitTypeDef *oc_init) +{ + FL_ErrorStatus result = FL_PASS; + /* 配置比较输出通道模式 */ + FL_GPTIM_OC_SetMode(TIMx, oc_init->OCMode, channel); + /* 配置ETRF清零使能 */ + if(oc_init->OCETRFStatus == FL_ENABLE) + { + FL_GPTIM_OC_EnableClear(TIMx, channel); + } + /* 比较输出通道快速模式 */ + if(oc_init->OCFastMode == FL_ENABLE) + { + FL_GPTIM_OC_EnableFastMode(TIMx, channel); + } + /* 比较输出通道缓冲模式 */ + if(oc_init->OCPreload == FL_ENABLE) + { + FL_GPTIM_OC_EnablePreload(TIMx, channel); + } + /* 设置比较值 */ + switch(channel) + { + case FL_GPTIM_CHANNEL_1: + FL_GPTIM_WriteCompareCH1(TIMx, oc_init->compareValue); + break; + case FL_GPTIM_CHANNEL_2: + FL_GPTIM_WriteCompareCH2(TIMx, oc_init->compareValue); + break; + case FL_GPTIM_CHANNEL_3: + FL_GPTIM_WriteCompareCH3(TIMx, oc_init->compareValue); + break; + case FL_GPTIM_CHANNEL_4: + FL_GPTIM_WriteCompareCH4(TIMx, oc_init->compareValue); + break; + default : + result = FL_FAIL; + break; + } + return result; +} +/** + * @brief 设置 FL_GPTIM_OC_InitTypeDef 为默认配置 + * @param oc_init 指向需要将值设置为默认配置的结构体 @ref FL_GPTIM_OC_InitTypeDef 结构体 + * + * @retval None + */ +void FL_GPTIM_OC_StructInit(FL_GPTIM_OC_InitTypeDef *oc_init) +{ + /* Set the default configuration */ + oc_init->OCMode = FL_GPTIM_OC_MODE_FROZEN; + oc_init->OCETRFStatus = FL_DISABLE; + oc_init->OCFastMode = FL_DISABLE; + oc_init->compareValue = 0x00000000U; + oc_init->OCPolarity = FL_GPTIM_OC_POLARITY_NORMAL; + oc_init->OCPreload = FL_DISABLE; +} +/** + * @brief 配置TIM的输入捕获通道. + * @param TIMx Timer Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref FL_GPTIM_CHANNEL_0 + * @arg @ref FL_GPTIM_CHANNEL_1 + * @arg @ref FL_GPTIM_CHANNEL_2 + * @arg @ref FL_GPTIM_CHANNEL_3 + * @param ic_init 指向一个 @ref FL_GPTIM_IC_InitTypeDef 结构体 + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_GPTIM_IC_Init(GPTIM_Type *TIMx, uint32_t channel, FL_GPTIM_IC_InitTypeDef *ic_init) +{ + FL_ErrorStatus result = FL_PASS; + /* 参数检查 */ + assert_param(IS_FL_GPTIM_CHANNEL(channel)); + assert_param(IS_FL_GPTIM_IC_CAPTURE_STATE(ic_init->captureState)); + assert_param(IS_FL_GPTIM_IC_POLARITY(ic_init->ICPolarity)); + assert_param(IS_FL_GPTIM_CHANNEL_MODE(ic_init->ICActiveInput)); + assert_param(IS_FL_GPTIM_IC_PSC(ic_init->ICPrescaler)); + assert_param(IS_FL_GPTIM_IC_FILTER(ic_init->ICFilter)); + /* 时钟总线使能配置 */ + if(TIMx == GPTIM0) + { + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM0); + } + else + if(TIMx == GPTIM1) + { + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM1); + } + else + { + FL_CMU_EnableGroup4BusClock(FL_CMU_GROUP4_BUSCLK_GPTIM2); + } + /* 通道关闭 */ + FL_GPTIM_IC_DisableChannel(TIMx, channel); + /*捕获极性 */ + FL_GPTIM_IC_SetChannelPolarity(TIMx, ic_init->ICPolarity, channel); + /* 捕获映射通道 */ + FL_GPTIM_CC_SetChannelMode(TIMx, ic_init->ICActiveInput, channel); + /* 捕获预分频 */ + FL_GPTIM_IC_SetPrescaler(TIMx, ic_init->ICPrescaler, channel); + /* 捕获滤波器 */ + FL_GPTIM_IC_SetFilter(TIMx, ic_init->ICFilter, channel); + if(ic_init->captureState == FL_ENABLE) + { + FL_GPTIM_IC_EnableChannel(TIMx, channel); + } + return result; +} + +/** + * @brief 设置 FL_GPTIM_IC_InitTypeDef 为默认配置 + * @param ic_init 指向需要将值设置为默认配置的结构体 @ref FL_GPTIM_IC_InitTypeDef 结构体 + * + * @retval None + */ +void FL_GPTIM_IC_StructInit(FL_GPTIM_IC_InitTypeDef *ic_init) +{ + /* Set the default configuration */ + ic_init->ICPolarity = FL_GPTIM_IC_POLARITY_NORMAL; + ic_init->ICActiveInput = FL_GPTIM_CHANNEL_MODE_INPUT_NORMAL; + ic_init->ICPrescaler = FL_GPTIM_IC_PSC_DIV1; + ic_init->ICFilter = FL_GPTIM_IC_FILTER_DIV1; + ic_init->captureState = FL_DISABLE; +} + +/** + * @} + */ + +#endif /* FL_GPTIM_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_i2c.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_i2c.c new file mode 100644 index 0000000..77f5f00 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_i2c.c @@ -0,0 +1,249 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_i2c.c + * @author FMSH Application Team + * @brief Src file of I2C FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup I2C + * @{ + */ + +#ifdef FL_I2C_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup I2C_FL_Private_Macros + * @{ + */ + +#define IS_FL_I2C_INSTANCE(INSTANCE) ((INSTANCE) == I2C) + +#define IS_FL_I2C_BAUDRATE(__VALUE__) (((__VALUE__) > 0 )&&((__VALUE__) <= 1000000)) + +#define IS_FL_I2C_CLOCKSRC(__VALUE__) (((__VALUE__) == FL_CMU_I2C_CLK_SOURCE_APBCLK )||\ + ((__VALUE__) == FL_CMU_I2C_CLK_SOURCE_RCHF)||\ + ((__VALUE__) == FL_CMU_I2C_CLK_SOURCE_SYSCLK)||\ + ((__VALUE__) == FL_CMU_I2C_CLK_SOURCE_RCLF)) + +#define IS_FL_I2C_MSATER_TIMEOUT(__VALUE__) (((__VALUE__) == FL_IWDT_PERIOD_125MS)||\ + ((__VALUE__) == FL_IWDT_PERIOD_16000MS)) + + +#define IS_FL_I2C_SLAVE_ACK(__VALUE__) (((__VALUE__) == FL_ENABLE)||\ + ((__VALUE__) == FL_DISABLE)) + + + +#define IS_FL_I2C_ANGLOGFILTER(__VALUE__) (((__VALUE__) == FL_ENABLE)||\ + ((__VALUE__) == FL_DISABLE)) + +#define IS_FL_I2C_ADDRSIZE10BIT(__VALUE__) (((__VALUE__) == FL_ENABLE)||\ + ((__VALUE__) == FL_DISABLE)) + +#define IS_FL_I2C_SLAVE_SCLSEN(__VALUE__) (((__VALUE__) == FL_ENABLE)||\ + ((__VALUE__) == FL_DISABLE)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup I2C_FL_EF_Init + * @{ + */ + +/** + * @brief 复位I2C外设. + * @param I2Cx 外设入口地址 + * @retval 错误状态,可能值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_I2C_DeInit(I2C_Type *I2Cx) +{ + assert_param(IS_FL_I2C_INSTANCE(I2Cx)); + /* 使能外设复位 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 复位I2C外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_I2C); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_I2C); + /* 关闭外设总线始时钟和工作时钟 */ + FL_CMU_DisableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_I2C); + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_I2C); + /* 锁定外设复位 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} + +/** + * @brief 配置I2C主机模式. + * @param I2Cx 外设入口地址 + * @param I2C_InitStruct 指向 @ref FL_I2C_MasterMode_InitTypeDef 结构体的指针 + * @retval 错误状态,可能值: + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_I2C_MasterMode_Init(I2C_Type *I2Cx, FL_I2C_MasterMode_InitTypeDef *I2C_InitStruct) +{ + uint32_t I2C_Clk_Freq = 0, BRG = 0; + assert_param(IS_FL_I2C_INSTANCE(I2Cx)); + assert_param(IS_FL_I2C_CLOCKSRC(I2C_InitStruct->clockSource)); + assert_param(IS_FL_I2C_BAUDRATE(I2C_InitStruct->baudRate)); + /* 外设总线时钟和工作时钟开启 */ + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_I2C); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_I2C); + /* 选择I2C工作时钟源 */ + FL_CMU_SetI2CClockSource(I2C_InitStruct->clockSource); + /* 获取时钟源速度 */ + switch(I2C_InitStruct->clockSource) + { + case FL_CMU_I2C_CLK_SOURCE_APBCLK: + I2C_Clk_Freq = FL_CMU_GetAPBClockFreq(); + break; + case FL_CMU_I2C_CLK_SOURCE_RCHF: + I2C_Clk_Freq = FL_CMU_GetRCHFClockFreq(); + break; + case FL_CMU_I2C_CLK_SOURCE_SYSCLK: + I2C_Clk_Freq = FL_CMU_GetSystemClockFreq(); + break; + case FL_CMU_I2C_CLK_SOURCE_RCLF: + I2C_Clk_Freq = FL_CMU_GetRCLFClockFreq(); + break; + default: + break; + } + /* 根据不同的时钟源速度计算出配置速率需要的寄存器值并配置相关寄存器 */ + BRG = (uint32_t)(I2C_Clk_Freq / (2 * I2C_InitStruct->baudRate)) - 1; + FL_I2C_Master_WriteSCLHighWidth(I2Cx, BRG); + FL_I2C_Master_WriteSCLLowWidth(I2Cx, BRG); + FL_I2C_Master_WriteSDAHoldTime(I2Cx, (uint32_t)(BRG / 2.0 + 0.5)); + /* 使能外设 */ + FL_I2C_Master_Enable(I2C); + return FL_PASS; +} + + + +/** + * @brief 将 @ref FL_I2C_MasterMode_InitTypeDef 结构体初始化为默认配置 + * @param I2C_InitStruct 指向 @ref FL_I2C_MasterMode_InitTypeDef 结构体的指针 + * + * @retval None + */ + +void FL_I2C_MasterMode_StructInit(FL_I2C_MasterMode_InitTypeDef *I2C_InitStruct) +{ + I2C_InitStruct->clockSource = FL_CMU_I2C_CLK_SOURCE_RCHF; + I2C_InitStruct->baudRate = 40000; +} + +/** + * @brief 配置I2C从机模式. + * @param I2Cx 外设入口地址 + * @param I2C_InitStruct 指向 @ref FL_I2C_SlaveMode_InitTypeDef 结构体的指针. + * @note 作为从机时的从机地址应参考手册推荐具体设置 + * @retval 错误状态,可能值: + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_I2C_SlaveMode_Init(I2C_Type *I2Cx, FL_I2C_SlaveMode_InitTypeDef *I2C_InitStruct) +{ + assert_param(IS_FL_I2C_INSTANCE(I2Cx)); + assert_param(IS_FL_I2C_SLAVE_ACK(I2C_InitStruct->ACK)); + assert_param(IS_FL_I2C_ADDRSIZE10BIT(I2C_InitStruct->ownAddrSize10bit)); + assert_param(IS_FL_I2C_SLAVE_SCLSEN(I2C_InitStruct->SCLSEN)); + /* 外设总线时钟开启 注:不需要工作时钟*/ + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_I2C); + /* 使能SDA输出延迟 注:推荐开启*/ + FL_I2C_Slave_EnableSDAStretching(I2Cx); + /* 使能SCL模拟滤波使能 注:推荐开启*/ + FL_I2C_Slave_EnableSCLAnalogFilter(I2Cx); + /* 从机ACK */ + if(I2C_InitStruct->ACK == FL_ENABLE) + { + FL_I2C_Slave_EnableACK(I2Cx); + } + else + { + FL_I2C_Slave_DisableACK(I2Cx); + } + /* 从机地址宽度 和地址配置 */ + if(I2C_InitStruct->ownAddrSize10bit == FL_ENABLE) + { + FL_I2C_Slave_Enable10BitAddress(I2Cx); + FL_I2C_Slave_WriteSlaveAddress(I2Cx, I2C_InitStruct->ownAddr); + } + else + { + FL_I2C_Slave_Disable10BitAddress(I2Cx); + FL_I2C_Slave_WriteSlaveAddress(I2Cx, I2C_InitStruct->ownAddr & 0x7F); + } + /* 从机时钟延展使能 */ + if(I2C_InitStruct->SCLSEN == FL_ENABLE) + { + FL_I2C_Slave_EnableSCLStretching(I2Cx); + } + else + { + FL_I2C_Slave_DisableSCLStretching(I2Cx); + } + /* 外设开启 */ + FL_I2C_Slave_Enable(I2Cx); + return FL_PASS; +} + +/** + * @brief 将 @ref FL_I2C_SlaveMode_InitTypeDef 结构体初始化为默认配置 + * @param I2C_InitStruct 指向 @ref FL_I2C_SlaveMode_InitTypeDef 结构体的指针 + * + * @retval None + */ + +void FL_I2C_SlaveMode_StructInit(FL_I2C_SlaveMode_InitTypeDef *I2C_InitStruct) +{ + I2C_InitStruct->ACK = FL_ENABLE; + I2C_InitStruct->ownAddr = 0x55; + I2C_InitStruct->ownAddrSize10bit = FL_DISABLE; + I2C_InitStruct->SCLSEN = FL_DISABLE; +} + +/** + * @} + */ + +#endif /* FL_I2C_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ + + + + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_iwdt.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_iwdt.c new file mode 100644 index 0000000..5512a0d --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_iwdt.c @@ -0,0 +1,133 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_iwdt.c + * @author FMSH Application Team + * @brief Src file of IWDT FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup IWDT + * @{ + */ + +#ifdef FL_IWDT_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup IWDT_FL_Private_Macros + * @{ + */ +#define IS_IWDT_INSTANCE(INTANCE) ((INTANCE) == IWDT) + +#define IS_FL_IWDT_WINDOWSVEL(__VALUE__) ((__VALUE__) < 0xFFF) + +#define IS_FL_IWDT_OVERFLOWPERIOD(__VALUE__) (((__VALUE__) == FL_IWDT_PERIOD_125MS)||\ + ((__VALUE__) == FL_IWDT_PERIOD_250MS)||\ + ((__VALUE__) == FL_IWDT_PERIOD_500MS)||\ + ((__VALUE__) == FL_IWDT_PERIOD_1000MS)||\ + ((__VALUE__) == FL_IWDT_PERIOD_2000MS)||\ + ((__VALUE__) == FL_IWDT_PERIOD_4000MS)||\ + ((__VALUE__) == FL_IWDT_PERIOD_8000MS)||\ + ((__VALUE__) == FL_IWDT_PERIOD_16000MS)) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup IWDT_FL_EF_Init + * @{ + */ + +/** + * @brief 复位IWDT外设 + * + * @note 此函数只能用于配制前复位外设,因为IWDT开启后不可以关闭 + * + * @param IWDTx 外设入口地址 + * + * @retval FL_ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_IWDT_DeInit(IWDT_Type *IWDTx) +{ + assert_param(IS_IWDT_INSTANCE(IWDTx)); + return FL_PASS; +} +/** + * @brief 根据 IWDT_InitStruct 初始化对应外设的寄存器值. + * + * @note IWTD使能后将无法关闭,直到下一次芯片复位 + * + * @param IWDTx 外设入口地址 + * @param IWDT_InitStruct 是 @ref FL_IWDT_InitTypeDef结构体,它包含指定IWDT外设的配置信息 + * + * @retval ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_IWDT_Init(IWDT_Type *IWDTx, FL_IWDT_InitTypeDef *IWDT_InitStruct) +{ + FL_ErrorStatus status = FL_PASS; + /* 入口参数检查 */ + assert_param(IS_IWDT_INSTANCE(IWDTx)); + assert_param(IS_FL_IWDT_WINDOWSVEL(IWDT_InitStruct->iwdtWindows)); + assert_param(IS_FL_IWDT_OVERFLOWPERIOD(IWDT_InitStruct->overflowPeriod)); + /* 开启总线时钟 */ + FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_IWDT); + /* 配置独立看门狗溢出周期 */ + FL_IWDT_SetPeriod(IWDTx, IWDT_InitStruct->overflowPeriod); + /* 配置独立看门狗清狗窗口*/ + FL_IWDT_WriteWindow(IWDTx, IWDT_InitStruct->iwdtWindows); + /* 启动看门狗 */ + FL_IWDT_ReloadCounter(IWDTx); + return status; +} +/** + * @brief 设置 IWDT_InitStruct 为默认配置 + * + * @param IWDT_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_IWDT_InitTypeDef 结构体 + * + * @retval None + */ +void FL_IWDT_StructInit(FL_IWDT_InitTypeDef *IWDT_InitStruct) +{ + /* 默认不使用窗口 */ + IWDT_InitStruct->iwdtWindows = 0; + /*最长溢出时间*/ + IWDT_InitStruct->overflowPeriod = FL_IWDT_PERIOD_500MS; +} + +/** + * @} + */ + +#endif /* FL_IWDT_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lcd.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lcd.c new file mode 100644 index 0000000..48e7a52 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lcd.c @@ -0,0 +1,341 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_lcd.c + * @author FMSH Application Team + * @brief Src file of LCD FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup LCD + * @{ + */ + +#ifdef FL_LCD_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup LCD_FL_Private_Macros + * @{ + */ + +#define IS_FL_LCD_INSTANCE(INTENCE) ((INTENCE) == LCD) + +#define IS_FL_LCD_BIASCURRENT(__VALUE__) (((__VALUE__) == (FL_LCD_BIAS_CURRENT_VERYHIGH))||\ + ((__VALUE__) == (FL_LCD_BIAS_CURRENT_HIGH))||\ + ((__VALUE__) == (FL_LCD_BIAS_CURRENT_MEDIUM))||\ + ((__VALUE__) == (FL_LCD_BIAS_CURRENT_LOW))) + +#define IS_FL_LCD_ENMODE(__VALUE__) ((__VALUE__) == (FL_LCD_DRIVER_MODE_INNER_RESISTER)||\ + ((__VALUE__) == (FL_LCD_DRIVER_MODE_OUTER_CAPACITY))) + +#define IS_FL_LCD_BIASVOLTAGE(__VALUE__) (((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL0))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL1))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL2))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL3))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL4))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL5))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL6))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL7))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL8))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL9))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL10))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL11))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL12))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL13))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL14))||\ + ((__VALUE__) == (FL_LCD_BIAS_VOLTAGE_LEVEL15))) + +#define IS_FL_LCD_BIASMD(__VALUE__) (((__VALUE__) == (FL_LCD_BIAS_MODE_4BIAS))||\ + ((__VALUE__) == (FL_LCD_BIAS_MODE_3BIAS))) + +#define IS_FL_LCD_BWFT(__VALUE__) (((__VALUE__) == (FL_LCD_WAVEFORM_TYPEA))||\ + ((__VALUE__) == (FL_LCD_WAVEFORM_TYPEB))) + +#define IS_FL_LCD_LMUX(__VALUE__) (((__VALUE__) == (FL_LCD_COM_NUM_4COM))||\ + ((__VALUE__) == (FL_LCD_COM_NUM_6COM))||\ + ((__VALUE__) == (FL_LCD_COM_NUM_8COM))) + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup LCD_FL_EF_Init + * @{ + */ + +/** + * @brief 获取LCD工作频率寄存器. + * @param wavetype 波形 + * @param freq 工作频率 + * @retval 工作频率寄存器值 + */ +static uint32_t FL_LCD_DisplayFreq(uint32_t wavetype,uint32_t freq) +{ + uint32_t displayFreq = 32u; + if((freq > 0) && (freq <= 100)) + { + if(wavetype == FL_LCD_WAVEFORM_TYPEA) + { + switch(FL_LCD_GetCOMNumber(LCD)) + { + case FL_LCD_COM_NUM_4COM: + displayFreq = (32768 / (4 * freq * 2) ); + break; + case FL_LCD_COM_NUM_6COM: + displayFreq = (32768 / (6 * freq * 2) ); + break; + case FL_LCD_COM_NUM_8COM: + displayFreq = (32768 / (8 * freq * 2) ); + break; + default: + displayFreq = (32768/ (4 * freq * 2) ); + break; + } + } + else + { + switch(FL_LCD_GetCOMNumber(LCD)) + { + case FL_LCD_COM_NUM_4COM: + displayFreq = (32768 / (4 * freq * 4) ); + break; + case FL_LCD_COM_NUM_6COM: + displayFreq = (32768 / (6 * freq * 4) ); + break; + case FL_LCD_COM_NUM_8COM: + displayFreq = (32768 / (8 * freq * 4) ); + break; + default: + displayFreq = (32768/ (4 * freq * 4) ); + break; + } + } + + } + displayFreq = displayFreq & 0x000000ffu; + return displayFreq; +} + +/** + * @brief 获取LCD闪烁时间寄存器值 + * @param timevalue 闪烁时间 + * @retval 闪烁时间寄存器 + */ +static uint32_t FL_LCD_FlickTime(uint32_t timevalue) +{ + uint32_t stepTime; + uint32_t TimeResult = 0u; + switch(FL_LCD_GetCOMNumber(LCD)) + { + case FL_LCD_COM_NUM_4COM: + stepTime = (4 * FL_LCD_ReadDisplayFrequency(LCD) * 2 * 16 * 1000) / 32768; + break; + case FL_LCD_COM_NUM_6COM: + stepTime = (6 * FL_LCD_ReadDisplayFrequency(LCD) * 2 * 16 * 1000) / 32768; + break; + case FL_LCD_COM_NUM_8COM: + stepTime = (8 * FL_LCD_ReadDisplayFrequency(LCD) * 2 * 16 * 1000) / 32768; + break; + default: + stepTime = (4 * FL_LCD_ReadDisplayFrequency(LCD) * 2 * 16 * 1000) / 32768; + break; + } + TimeResult = timevalue / stepTime; + return TimeResult; +} + +/** + * @brief 复位对应LCD寄存器. + + * @param LCDx + * @retval ErrorStatus枚举值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_LCD_DeInit(LCD_Type *LCDx) +{ + assert_param(IS_FL_LCD_INSTANCE(LCDx)); + /* 使能外设复位 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 复位LCD外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_LCD); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_LCD); + /* 关闭外设总线始时钟和工作时钟 */ + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_LCD); + /* 锁定外设复位 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} + +/** + * @brief 根据 LCD_InitStruct 的配置信息初始化对应外设入口地址的寄存器值. + * @param LCDx LCDx + * @param LCD_InitStruct 指向一个 @ref FL_LCD_InitTypeDef 结构体 + * 其中包含了外设的相关配置信息. + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS LCD配置成功 + */ +FL_ErrorStatus FL_LCD_Init(LCD_Type *LCDx, FL_LCD_InitTypeDef *initStruct) +{ + assert_param(IS_FL_LCD_INSTANCE(LCDx)); + assert_param(IS_FL_LCD_BIASCURRENT(initStruct->biasCurrent)); + assert_param(IS_FL_LCD_ENMODE(initStruct->mode)); + assert_param(IS_FL_LCD_BIASVOLTAGE(initStruct->biasVoltage)); + assert_param(IS_FL_LCD_BIASMD(initStruct->biasMode)); + assert_param(IS_FL_LCD_BWFT(initStruct->waveform)); + assert_param(IS_FL_LCD_LMUX(initStruct->COMxNum)); + /* 外设总线始时钟 */ + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_LCD); + /* 电流源电流控制 */ + FL_LCD_SetBiasCurrent(LCD, initStruct->biasCurrent); + /* LCD驱动模式 */ + FL_LCD_SetDriverMode(LCD, initStruct->mode); + /* 偏执电压设置 */ + FL_LCD_SetBiasVoltage(LCD, initStruct->biasVoltage); + /* 偏执模式选择 */ + FL_LCD_SetBiasMode(LCD, initStruct->biasMode); + /* 驱动波形设置 */ + FL_LCD_SetWaveform(LCD, initStruct->waveform); + /* COMx口选择 */ + FL_LCD_SetCOMNumber(LCD, initStruct->COMxNum); + /* 设置工作频率 */ + FL_LCD_WriteDisplayFrequency(LCD, FL_LCD_DisplayFreq(initStruct->waveform,initStruct->displayFreq)); + /* 设置闪烁频率 */ + FL_LCD_WriteDisplayOnTime(LCD, FL_LCD_FlickTime(initStruct->flickOnTime)); + FL_LCD_WriteDisplayOffTime(LCD, FL_LCD_FlickTime(initStruct->flickOffTime)); + /* 使能外设 */ + FL_LCD_Enable(LCD); + return FL_PASS; +} + +/** + * @brief 设置 LCD_InitStruct 为默认配置 + * @param LCD_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_LCD_InitTypeDef 结构体 + * + * @retval None + */ +void FL_LCD_StructInit(FL_LCD_InitTypeDef *initStruct) +{ + initStruct->biasCurrent = FL_LCD_BIAS_CURRENT_HIGH; + initStruct->mode = FL_LCD_DRIVER_MODE_INNER_RESISTER; + initStruct->biasVoltage = FL_LCD_BIAS_VOLTAGE_LEVEL10; + initStruct->biasMode = FL_LCD_BIAS_MODE_3BIAS; + initStruct->waveform = FL_LCD_WAVEFORM_TYPEA; + initStruct->COMxNum = FL_LCD_COM_NUM_6COM; + initStruct->displayFreq = 42; + initStruct->flickOnTime = 0; + initStruct->flickOffTime = 0; +} + +/** + * @brief 设置 LCD 4COM显示字端 + * @param display 指向显示信息的缓存区域,可直接指向LCD的DATAx寄存器。 + * @param com 待显示字段所在COM。范围0-4。 + * @param seg 待显示字段所在SEG。范围0-43。 + * @param state 待显示字段状态。0,熄灭;否则,点亮。 + * + * @retval None + */ +void FL_LCD_4COMDisplay(uint32_t *display, uint8_t com, uint8_t seg, uint8_t state) +{ + uint8_t temp; + if(state != 0) + { + state = 1; + } + if(seg > 31) + { + temp = (seg - 32) + com * 12; + com = 4 + temp / 32; + seg = temp % 32; + } + MODIFY_REG(display[com], (uint32_t)(0x1U << seg), (uint32_t)(state << seg)); +} + +/** + * @brief 设置 LCD 6COM显示字端 + * @param display 指向显示信息的缓存区域,可直接指向LCD的DATAx寄存器。 + * @param com 待显示字段所在COM。范围0-6。 + * @param seg 待显示字段所在SEG。范围0-41。 + * @param state 待显示字段状态。0,熄灭;否则,点亮。 + * + * @retval None + */ +void FL_LCD_6COMDisplay(uint32_t *display, uint8_t com, uint8_t seg, uint8_t state) +{ + uint8_t temp; + if(state != 0) + { + state = 1; + } + if(seg > 31) + { + temp = (seg - 32) + com * 10; + com = 6 + temp / 32; + seg = temp % 32; + } + MODIFY_REG(display[com], (uint32_t)(0x1 << seg), (uint32_t)(state << seg)); +} + +/** + * @brief 设置 LCD 8COM显示字端 + * @param display 指向显示信息的缓存区域,可直接指向LCD的DATAx寄存器。 + * @param com 待显示字段所在COM。范围0-8。 + * @param seg 待显示字段所在SEG。范围0-39。 + * @param state 待显示字段状态。0,熄灭;否则,点亮。 + * + * @retval None + */ +void FL_LCD_8COMDisplay(uint32_t *display, uint8_t com, uint8_t seg, uint8_t state) +{ + uint8_t temp; + if(state != 0) + { + state = 1; + } + if(seg > 31) + { + temp = (seg - 32) + com * 8; + com = 8 + temp / 32; + seg = temp % 32; + } + MODIFY_REG(display[com], (uint32_t)(0x1 << seg), (uint32_t)(state << seg)); +} + +/** + * @} + */ + +#endif /* FL_LCD_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lptim16.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lptim16.c new file mode 100644 index 0000000..ab59228 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lptim16.c @@ -0,0 +1,374 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_lptim16.c + * @author FMSH Application Team + * @brief Src file of LPTIM16 FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup LPTIM16 + * @{ + */ + +#ifdef FL_LPTIM16_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup LPTIM16_FL_Private_Macros + * @{ + */ + +#define IS_LPTIM16_INSTANCE(INSTANCE) (((INSTANCE) == LPTIM16)) + +#define IS_FL_LPTIM16_CHANNEL(__VALUE__) (((__VALUE__) == FL_LPTIM16_CHANNEL_1)||\ + ((__VALUE__) == FL_LPTIM16_CHANNEL_2)) + +#define IS_FL_LPTIM16_CMU_CLK_SOURCE(__VALUE__) (((__VALUE__) == FL_CMU_LPTIM16_CLK_SOURCE_RCLF)||\ + ((__VALUE__) == FL_CMU_LPTIM16_CLK_SOURCE_RCLP)||\ + ((__VALUE__) == FL_CMU_LPTIM16_CLK_SOURCE_LSCLK)||\ + ((__VALUE__) == FL_CMU_LPTIM16_CLK_SOURCE_APBCLK)) + +#define IS_FL_LPTIM16_CLK_SOURCE(__VALUE__) (((__VALUE__) == FL_LPTIM16_CLK_SOURCE_INTERNAL)||\ + ((__VALUE__) == FL_LPTIM16_CLK_SOURCE_EXTERNAL)) + +#define IS_FL_LPTIM16_PSC(__VALUE__) (((__VALUE__) == FL_LPTIM16_PSC_DIV1)||\ + ((__VALUE__) == FL_LPTIM16_PSC_DIV2)||\ + ((__VALUE__) == FL_LPTIM16_PSC_DIV4)||\ + ((__VALUE__) == FL_LPTIM16_PSC_DIV8)||\ + ((__VALUE__) == FL_LPTIM16_PSC_DIV16)||\ + ((__VALUE__) == FL_LPTIM16_PSC_DIV32)||\ + ((__VALUE__) == FL_LPTIM16_PSC_DIV64)||\ + ((__VALUE__) == FL_LPTIM16_PSC_DIV128)) + +#define IS_FL_LPTIM16_OPERATION_MODE(__VALUE__) (((__VALUE__) == FL_LPTIM16_OPERATION_MODE_NORMAL)||\ + ((__VALUE__) == FL_LPTIM16_OPERATION_MODE_EXTERNAL_TRIGGER_CNT)||\ + ((__VALUE__) == FL_LPTIM16_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT)||\ + ((__VALUE__) == FL_LPTIM16_OPERATION_MODE_TIMEOUT)) + +#define IS_FL_LPTIM16_ENCODER_MODE(__VALUE__) (((__VALUE__) == FL_LPTIM16_ENCODER_MODE_DISABLE)||\ + ((__VALUE__) == FL_LPTIM16_ENCODER_MODE_TI1FP1_TI2FP2_CNT)||\ + ((__VALUE__) == FL_LPTIM16_ENCODER_MODE_TI2FP2_TI1FP1_CNT)||\ + ((__VALUE__) == FL_LPTIM16_ENCODER_MODE_TI2FP2_CNT_TI1FP1_CNT)) + +#define IS_FL_LPTIM16_ETR_TRIGGER_EDGE(__VALUE__) (((__VALUE__) == FL_LPTIM16_ETR_TRIGGER_EDGE_RISING)||\ + ((__VALUE__) == FL_LPTIM16_ETR_TRIGGER_EDGE_FALLING)||\ + ((__VALUE__) == FL_LPTIM16_ETR_TRIGGER_EDGE_BOTH)) + +#define IS_FL_LPTIM16_ETR_COUNT_EDGE(__VALUE__) (((__VALUE__) == FL_LPTIM16_ETR_COUNT_EDGE_RISING)||\ + ((__VALUE__) == FL_LPTIM16_ETR_COUNT_EDGE_FALLING)) + +#define IS_FL_LPTIM16_ONE_PULSE_MODE(__VALUE__) (((__VALUE__) == FL_LPTIM16_ONE_PULSE_MODE_CONTINUOUS)||\ + ((__VALUE__) == FL_LPTIM16_ONE_PULSE_MODE_SINGLE)) + +#define IS_FL_LPTIM16_IC_EDGE(__VALUE__) (((__VALUE__) == FL_LPTIM16_IC_EDGE_RISING)||\ + ((__VALUE__) == FL_LPTIM16_IC_EDGE_FALLING)||\ + ((__VALUE__) == FL_LPTIM16_IC_EDGE_BOTH)) + +#define IS_FL_LPTIM16_IC_POLARITY(__VALUE__) (((__VALUE__) == FL_LPTIM16_IC_POLARITY_NORMAL)||\ + ((__VALUE__) == FL_LPTIM16_IC_POLARITY_INVERT)) + +#define IS_FL_LPTIM16_OC_POLARITY(__VALUE__) (((__VALUE__) == FL_LPTIM16_OC_POLARITY_NORMAL)||\ + ((__VALUE__) == FL_LPTIM16_OC_POLARITY_INVERT)) + +#define IS_FL_LPTIM16_IC1_CAPTURE_SOURCE(__VALUE__) (((__VALUE__) == FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP0)||\ + ((__VALUE__) == FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP1)||\ + ((__VALUE__) == FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP2)||\ + ((__VALUE__) == FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP3)) + +#define IS_FL_LPTIM16_TRGO_SOURCE(__VALUE__) (((__VALUE__) == FL_LPTIM16_TRGO_ENABLE)||\ + ((__VALUE__) == FL_LPTIM16_TRGO_UPDATE)||\ + ((__VALUE__) == FL_LPTIM16_TRGO_OC1_CMP_PULSE)||\ + ((__VALUE__) == FL_LPTIM16_TRGO_IC1_EVENT)||\ + ((__VALUE__) == FL_LPTIM16_TRGO_IC2_EVENT)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup LPTIM16_FL_EF_Init + * @{ + */ + +/** + * @brief 复位LPTIM16 外设 + * @param 外设入口地址 + * @retval 返回错误状态,可能值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_LPTIM16_DeInit(LPTIM16_Type *LPTIM16x) +{ + /* 参数检查 */ + assert_param(IS_LPTIM16_INSTANCE(LPTIM16x)); + /* 使能外设复位 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 复位外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_LPTIM16); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_LPTIM16); + /* 关闭外设总线时钟和工作时钟 */ + FL_CMU_DisableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_LPTIM16); + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_LPTIM16); + /* 锁定外设复位 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} + +/** + * @brief 根据需要功能配置LPTIM16寄存器使之工作在定时器功能模式下 + * + * @note 需要使用ETR作为计数源时,建议根据需求配置为异步脉冲计数模式 + * @ref FL_LPTIM16_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT 或外部触发计数模式 + * @ref FL_LPTIM16_OPERATION_MODE_EXTERNAL_TRIGGER_CNT + * + * @param LPTIM16x 外设入口地址 + * @param init 为 @ref FL_LPTIM16_InitTypeDef类型的结构体 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS LPTIM16配置成功 + */ +FL_ErrorStatus FL_LPTIM16_Init(LPTIM16_Type *LPTIM16x, FL_LPTIM16_InitTypeDef *init) +{ + /* 参数检查 */ + assert_param(IS_LPTIM16_INSTANCE(LPTIM16x)); + assert_param(IS_FL_LPTIM16_CMU_CLK_SOURCE(init->clockSource)); + assert_param(IS_FL_LPTIM16_CLK_SOURCE(init->prescalerClockSource)); + assert_param(IS_FL_LPTIM16_PSC(init->prescaler)); + assert_param(IS_FL_LPTIM16_OPERATION_MODE(init->mode)); + assert_param(IS_FL_LPTIM16_ENCODER_MODE(init->encoderMode)); + assert_param(IS_FL_LPTIM16_ONE_PULSE_MODE(init->onePulseMode)); + assert_param(IS_FL_LPTIM16_ETR_TRIGGER_EDGE(init->triggerEdge)); + assert_param(IS_FL_LPTIM16_ETR_COUNT_EDGE(init->countEdge)); + /* 时钟配置 */ + if(LPTIM16x == LPTIM16) + { + /* 使能总线时钟 */ + FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_LPTIM16); + /* 除了异步计数模式,其他模式都需要使能工作时钟 */ + if(init->prescalerClockSource == FL_LPTIM16_CLK_SOURCE_EXTERNAL) + { + /* 使能工作时钟 */ + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_LPTIM16); + /* 设置工作时钟时钟源 */ + FL_CMU_SetLPTIM16ClockSource(init->clockSource); + } + } + else + { + return FL_FAIL; + } + /* 配置分频器的时钟源 */ + FL_LPTIM16_SetClockSource(LPTIM16x, init->prescalerClockSource); + /* 配置时钟分频 */ + FL_LPTIM16_SetPrescaler(LPTIM16x, init->prescaler); + /* 配置重装载值 */ + FL_LPTIM16_WriteAutoReload(LPTIM16x, init->autoReload); + /* 配置定时器工作模式 */ + FL_LPTIM16_SetOperationMode(LPTIM16x, init->mode); + /* 配置编码器模式 */ + if(init->mode == FL_LPTIM16_OPERATION_MODE_NORMAL) + { + FL_LPTIM16_SetEncoderMode(LPTIM16x, init->encoderMode); + } + /* 单次计数模式 */ + FL_LPTIM16_SetOnePulseMode(LPTIM16x, init->onePulseMode); + /* 配置定时器不同模式下的特殊寄存器 */ + switch(init->mode) + { + case FL_LPTIM16_OPERATION_MODE_NORMAL: + { + /* ETR作为时钟时和异步脉冲计数模式信号路径一样,需要使能模拟滤波,并配置边沿 */ + if(init->prescalerClockSource == FL_LPTIM16_CLK_SOURCE_EXTERNAL) + { + /* 配置异步计数边沿 */ + FL_LPTIM16_SetETRCountEdge(LPTIM16x, init->countEdge); + /* 开启外部输入滤波 */ + FL_LPTIM16_EnableETRFilter(LPTIM16x); + } + } + break; + case FL_LPTIM16_OPERATION_MODE_EXTERNAL_TRIGGER_CNT: + { + /* 配置外部输入有效边沿 */ + FL_LPTIM16_SetETRTriggerEdge(LPTIM16x, init->triggerEdge); + } + break; + case FL_LPTIM16_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT: + { + /* 配置异步计数边沿 */ + FL_LPTIM16_SetETRCountEdge(LPTIM16x, init->countEdge); + /* 开启外部输入滤波 */ + FL_LPTIM16_EnableETRFilter(LPTIM16x); + } + break; + case FL_LPTIM16_OPERATION_MODE_TIMEOUT: + { + /* 配置外部输入有效边沿 */ + FL_LPTIM16_SetETRTriggerEdge(LPTIM16x, init->triggerEdge); + } + break; + default: + return FL_FAIL; + } + return FL_PASS; +} + +/** + * @brief 设置 LPTIM16_InitStruct 为默认配置 + * @param init 为 @ref FL_LPTIM16_InitTypeDef类型的结构体 + * + * @retval None + */ +void FL_LPTIM16_StructInit(FL_LPTIM16_InitTypeDef *init) +{ + init->clockSource = FL_CMU_LPTIM16_CLK_SOURCE_APBCLK; + init->prescalerClockSource = FL_LPTIM16_CLK_SOURCE_INTERNAL; + init->prescaler = FL_LPTIM16_PSC_DIV1; + init->autoReload = 0; + init->mode = FL_LPTIM16_OPERATION_MODE_NORMAL; + init->countEdge = FL_LPTIM16_ETR_COUNT_EDGE_RISING; + init->triggerEdge = FL_LPTIM16_ETR_TRIGGER_EDGE_RISING; + init->encoderMode = FL_LPTIM16_ENCODER_MODE_DISABLE; + init->onePulseMode = FL_LPTIM16_ONE_PULSE_MODE_CONTINUOUS; +} + +/** + * @brief 配置LPTIM16工作在输入捕获模式 + * + * @param LPTIM16x 外设入口地址 + * @param ic_init 为 @ref FL_LPTIM16_IC_InitTypeDef类型的结构体 + * @param Channel LPTIM16输入通道 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS LPTIM16配置成功 + */ +FL_ErrorStatus FL_LPTIM16_IC_Init(LPTIM16_Type *LPTIM16x, uint32_t Channel, FL_LPTIM16_IC_InitTypeDef *ic_init) +{ + /* 参数检查 */ + assert_param(IS_LPTIM16_INSTANCE(LPTIM16x)); + assert_param(IS_FL_LPTIM16_CHANNEL(Channel)); + assert_param(IS_FL_LPTIM16_IC_EDGE(ic_init->ICEdge)); + assert_param(IS_FL_LPTIM16_IC_POLARITY(ic_init->ICInputPolarity)); + assert_param(IS_FL_LPTIM16_IC1_CAPTURE_SOURCE(ic_init->channel1CaptureSource)); + /* 通道1捕获源 & 预分频 */ + if(Channel == FL_LPTIM16_CHANNEL_1) + { + FL_LPTIM16_IC_WriteChannel1Prescaler(LPTIM16x, ic_init->channel1Prescaler); + FL_LPTIM16_IC_SetChannel1CaptureSource(LPTIM16x, ic_init->channel1CaptureSource); + } + if(ic_init->ICInputDigitalFilter == FL_DISABLE) + { + FL_LPTIM16_DisableDigitalFilter(LPTIM16, Channel); + } + else + { + FL_LPTIM16_EnableDigitalFilter(LPTIM16, Channel); + } + /* 捕获通道极性 */ + FL_LPTIM16_IC_SetInputPolarity(LPTIM16x, ic_init->ICInputPolarity, Channel); + /* 配置捕获边沿 */ + FL_LPTIM16_IC_SetCaptureEdge(LPTIM16x, ic_init->ICEdge, Channel); + /* 通道输入捕获使能 */ + FL_LPTIM16_SetChannelMode(LPTIM16x, FL_LPTIM16_CHANNEL_MODE_INPUT, Channel); + return FL_PASS; +} + +/** + * @brief 设置 LPTIM16_IC_InitStruct 为默认配置 + * @param ic_init 为 @ref FL_LPTIM16_IC_InitTypeDef类型的结构体 + * + * @retval None + */ +void FL_LPTIM16_IC_StructInit(FL_LPTIM16_IC_InitTypeDef *ic_init) +{ + ic_init->ICInputPolarity = FL_LPTIM16_IC_POLARITY_NORMAL; + ic_init->ICInputDigitalFilter = FL_DISABLE; + ic_init->ICEdge = FL_LPTIM16_IC_EDGE_RISING; + ic_init->channel1Prescaler = 1 - 1; + ic_init->channel1CaptureSource = FL_LPTIM16_IC1_CAPTURE_SOURCE_GROUP0; +} + +/** + * @brief 根据需要功能配置LPTIM16寄存器工作在输出比较模式 + * + * @param LPTIM16x 外设入口地址 + * @param oc_init 为 @ref FL_LPTIM16_OC_InitTypeDef类型的结构体 + * @param Channel LPTIM16输出通道 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS LPTIM16配置成功 + */ +FL_ErrorStatus FL_LPTIM16_OC_Init(LPTIM16_Type *LPTIM16x, uint32_t Channel, FL_LPTIM16_OC_InitTypeDef *oc_init) +{ + /* 参数检查 */ + assert_param(IS_LPTIM16_INSTANCE(LPTIM16x)); + assert_param(IS_FL_LPTIM16_CHANNEL(Channel)); + assert_param(IS_FL_LPTIM16_OC_POLARITY(oc_init->OCPolarity)); + /* 比较通道极性 */ + FL_LPTIM16_OC_SetPolarity(LPTIM16x, oc_init->OCPolarity, Channel); + /* 设置比较值 */ + switch(Channel) + { + case FL_LPTIM16_CHANNEL_1: + FL_LPTIM16_WriteCompareCH1(LPTIM16x, oc_init->compareValue); + break; + case FL_LPTIM16_CHANNEL_2: + FL_LPTIM16_WriteCompareCH2(LPTIM16x, oc_init->compareValue); + break; + default : + return FL_FAIL; + } + /* 通道输出比较使能 */ + FL_LPTIM16_SetChannelMode(LPTIM16x, FL_LPTIM16_CHANNEL_MODE_OUTPUT, Channel); + return FL_PASS; +} + +/** + * @brief 设置 LPTIM16_OC_InitStruct 为默认配置 + * @param oc_init 为 @ref FL_LPTIM16_OC_InitTypeDef类型的结构体 + * + * @retval None + */ +void FL_LPTIM16_OC_StructInit(FL_LPTIM16_OC_InitTypeDef *oc_init) +{ + oc_init->compareValue = 0; + oc_init->OCPolarity = FL_LPTIM16_OC_POLARITY_NORMAL; +} + +/** + * @} + */ + +#endif /* FL_LPTIM16_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lptim32.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lptim32.c new file mode 100644 index 0000000..9b0d9b7 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lptim32.c @@ -0,0 +1,348 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_lptim32.c + * @author FMSH Application Team + * @brief Src file of LPTIM32 FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup LPTIM32 + * @{ + */ + +#ifdef FL_LPTIM32_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup LPTIM32_FL_Private_Macros + * @{ + */ + +#define IS_LPTIM32_INSTANCE(INSTANCE) ((INSTANCE) == LPTIM32) + +#define IS_FL_LPTIM32_CHANNEL(__VALUE__) (((__VALUE__) == FL_LPTIM32_CHANNEL_1)||\ + ((__VALUE__) == FL_LPTIM32_CHANNEL_2)||\ + ((__VALUE__) == FL_LPTIM32_CHANNEL_3)||\ + ((__VALUE__) == FL_LPTIM32_CHANNEL_4)) + +#define IS_FL_LPTIM32_CMU_CLK_SOURCE(__VALUE__) (((__VALUE__) == FL_CMU_LPTIM32_CLK_SOURCE_RCLF)||\ + ((__VALUE__) == FL_CMU_LPTIM32_CLK_SOURCE_RCLP)||\ + ((__VALUE__) == FL_CMU_LPTIM32_CLK_SOURCE_LSCLK)||\ + ((__VALUE__) == FL_CMU_LPTIM32_CLK_SOURCE_APBCLK)) + +#define IS_FL_LPTIM32_CLK_SOURCE(__VALUE__) (((__VALUE__) == FL_LPTIM32_CLK_SOURCE_INTERNAL)||\ + ((__VALUE__) == FL_LPTIM32_CLK_SOURCE_EXTERNAL)) + +#define IS_FL_LPTIM32_PSC(__VALUE__) (((__VALUE__) == FL_LPTIM32_PSC_DIV1)||\ + ((__VALUE__) == FL_LPTIM32_PSC_DIV2)||\ + ((__VALUE__) == FL_LPTIM32_PSC_DIV4)||\ + ((__VALUE__) == FL_LPTIM32_PSC_DIV8)||\ + ((__VALUE__) == FL_LPTIM32_PSC_DIV16)||\ + ((__VALUE__) == FL_LPTIM32_PSC_DIV32)||\ + ((__VALUE__) == FL_LPTIM32_PSC_DIV64)||\ + ((__VALUE__) == FL_LPTIM32_PSC_DIV128)) + +#define IS_FL_LPTIM32_OPERATION_MODE(__VALUE__) (((__VALUE__) == FL_LPTIM32_OPERATION_MODE_NORMAL)||\ + ((__VALUE__) == FL_LPTIM32_OPERATION_MODE_EXTERNAL_TRIGGER_CNT)||\ + ((__VALUE__) == FL_LPTIM32_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT)||\ + ((__VALUE__) == FL_LPTIM32_OPERATION_MODE_TIMEOUT)) + +#define IS_FL_LPTIM32_ETR_TRIGGER_EDGE(__VALUE__) (((__VALUE__) == FL_LPTIM32_ETR_TRIGGER_EDGE_RISING)||\ + ((__VALUE__) == FL_LPTIM32_ETR_TRIGGER_EDGE_FALLING)||\ + ((__VALUE__) == FL_LPTIM32_ETR_TRIGGER_EDGE_BOTH)) + +#define IS_FL_LPTIM32_ETR_COUNT_EDGE(__VALUE__) (((__VALUE__) == FL_LPTIM32_ETR_COUNT_EDGE_RISING)||\ + ((__VALUE__) == FL_LPTIM32_ETR_COUNT_EDGE_FALLING)) + +#define IS_FL_LPTIM32_ONE_PULSE_MODE(__VALUE__) (((__VALUE__) == FL_LPTIM32_ONE_PULSE_MODE_CONTINUOUS)||\ + ((__VALUE__) == FL_LPTIM32_ONE_PULSE_MODE_SINGLE)) + +#define IS_FL_LPTIM32_IC_EDGE(__VALUE__) (((__VALUE__) == FL_LPTIM32_IC_EDGE_RISING)||\ + ((__VALUE__) == FL_LPTIM32_IC_EDGE_FALLING)||\ + ((__VALUE__) == FL_LPTIM32_IC_EDGE_BOTH)) + +#define IS_FL_LPTIM32_OC_POLARITY(__VALUE__) (((__VALUE__) == FL_LPTIM32_OC_POLARITY_NORMAL)||\ + ((__VALUE__) == FL_LPTIM32_OC_POLARITY_INVERT)) + +#define IS_FL_LPTIM32_IC1_CAPTURE_SOURCE(__VALUE__) (((__VALUE__) == FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP0)||\ + ((__VALUE__) == FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP1)||\ + ((__VALUE__) == FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP2)||\ + ((__VALUE__) == FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP3)) + +#define IS_FL_LPTIM32_TRGO_SOURCE(__VALUE__) (((__VALUE__) == FL_LPTIM32_TRGO_ENABLE)||\ + ((__VALUE__) == FL_LPTIM32_TRGO_UPDATE)||\ + ((__VALUE__) == FL_LPTIM32_TRGO_OC1_CMP_PULSE)||\ + ((__VALUE__) == FL_LPTIM32_TRGO_IC1_EVENT)||\ + ((__VALUE__) == FL_LPTIM32_TRGO_IC2_EVENT)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup LPTIM32_FL_EF_Init + * @{ + */ + +/** + * @brief 复位LPTIM32 外设 + * @param 外设入口地址 + * @retval 返回错误状态,可能值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_LPTIM32_DeInit(LPTIM32_Type *LPTIM32x) +{ + /* 参数检查 */ + assert_param(IS_LPTIM32_INSTANCE(LPTIM32x)); + /* 使能外设复位 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 复位外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_LPTIM32); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_LPTIM32); + /* 关闭外设总线时钟和工作时钟 */ + FL_CMU_DisableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_LPTIM32); + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_LPTIM32); + /* 锁定外设复位 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} + +/** + * @brief 根据需要功能配置LPTIM32寄存器使之工作在定时器功能模式下 + * + * @note 需要使用ETR作为计数源时,建议根据需求配置为异步脉冲计数模式 + * @ref FL_LPTIM32_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT 或外部触发计数模式 + * @ref FL_LPTIM32_OPERATION_MODE_EXTERNAL_TRIGGER_CNT + * + * @param LPTIM32x 外设入口地址 + * @param init 为 @ref FL_LPTIM32_InitTypeDef类型的结构体 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS LPTIM32配置成功 + */ +FL_ErrorStatus FL_LPTIM32_Init(LPTIM32_Type *LPTIM32x, FL_LPTIM32_InitTypeDef *init) +{ + /* 参数检查 */ + assert_param(IS_LPTIM32_INSTANCE(LPTIM32x)); + assert_param(IS_FL_LPTIM32_CMU_CLK_SOURCE(init->clockSource)); + assert_param(IS_FL_LPTIM32_CLK_SOURCE(init->prescalerClockSource)); + assert_param(IS_FL_LPTIM32_PSC(init->prescaler)); + assert_param(IS_FL_LPTIM32_OPERATION_MODE(init->mode)); + assert_param(IS_FL_LPTIM32_ONE_PULSE_MODE(init->onePulseMode)); + assert_param(IS_FL_LPTIM32_ETR_TRIGGER_EDGE(init->triggerEdge)); + assert_param(IS_FL_LPTIM32_ETR_COUNT_EDGE(init->countEdge)); + /* 时钟配置 */ + if(LPTIM32x == LPTIM32) + { + /* 使能总线时钟 */ + FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_LPTIM32); + /* 除了异步计数模式,其他模式都需要使能工作时钟 */ + if(init->mode != FL_LPTIM32_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT) + { + /* 使能工作时钟 */ + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_LPTIM32); + /* 设置工作时钟时钟源 */ + FL_CMU_SetLPTIM32ClockSource(init->clockSource); + } + } + /* 配置分频器的时钟源 */ + FL_LPTIM32_SetClockSource(LPTIM32x, init->prescalerClockSource); + /* 配置时钟分频 */ + FL_LPTIM32_SetPrescaler(LPTIM32x, init->prescaler); + /* 配置定时器工作模式 */ + FL_LPTIM32_SetOperationMode(LPTIM32x, init->mode); + /* 配置定时器不同模式下的特殊寄存器 */ + switch(init->mode) + { + case FL_LPTIM32_OPERATION_MODE_NORMAL: + { + if(init->prescalerClockSource == FL_LPTIM32_CLK_SOURCE_EXTERNAL) + { + /* 配置外部计数边沿 */ + FL_LPTIM32_SetETRCountEdge(LPTIM32x, init->countEdge); + /* 开启外部输入滤波 */ + FL_LPTIM32_EnableETRFilter(LPTIM32x); + } + } + break; + case FL_LPTIM32_OPERATION_MODE_EXTERNAL_TRIGGER_CNT: + { + /* 配置外部输入有效边沿 */ + FL_LPTIM32_SetETRTriggerEdge(LPTIM32x, init->triggerEdge); + } + break; + case FL_LPTIM32_OPERATION_MODE_EXTERNAL_ASYNC_PULSE_CNT: + { + /* 配置外部计数边沿 */ + FL_LPTIM32_SetETRCountEdge(LPTIM32x, init->countEdge); + /* 开启外部输入滤波 */ + FL_LPTIM32_EnableETRFilter(LPTIM32x); + } + break; + case FL_LPTIM32_OPERATION_MODE_TIMEOUT: + { + /* 配置外部输入有效边沿 */ + FL_LPTIM32_SetETRTriggerEdge(LPTIM32x, init->triggerEdge); + } + break; + } + /* 单次计数模式 */ + FL_LPTIM32_SetOnePulseMode(LPTIM32x, init->onePulseMode); + /* 设置重装载值 */ + FL_LPTIM32_WriteAutoReload(LPTIM32x, init->autoReload); + return FL_PASS; +} + +/** + * @brief 设置 LPTIM32_InitStruct 为默认配置 + * @param init 为 @ref FL_LPTIM32_InitTypeDef类型的结构体 + * + * @retval None + */ +void FL_LPTIM32_StructInit(FL_LPTIM32_InitTypeDef *init) +{ + init->clockSource = FL_CMU_LPTIM32_CLK_SOURCE_APBCLK; + init->prescalerClockSource = FL_LPTIM32_CLK_SOURCE_INTERNAL; + init->prescaler = FL_LPTIM32_PSC_DIV1; + init->autoReload = 0; + init->mode = FL_LPTIM32_OPERATION_MODE_NORMAL; + init->countEdge = FL_LPTIM32_ETR_COUNT_EDGE_RISING; + init->triggerEdge = FL_LPTIM32_ETR_TRIGGER_EDGE_RISING; + init->onePulseMode = FL_LPTIM32_ONE_PULSE_MODE_CONTINUOUS; +} + +/** + * @brief 配置LPTIM32工作在输入捕获模式 + * + * @param LPTIM32x 外设入口地址 + * @param ic_init 为 @ref FL_LPTIM32_IC_InitTypeDef类型的结构体 + * @param Channel LPTIM32输入通道 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS LPTIM32配置成功 + */ +//输入捕获配置 +FL_ErrorStatus FL_LPTIM32_IC_Init(LPTIM32_Type *LPTIM32x, uint32_t Channel, FL_LPTIM32_IC_InitTypeDef *ic_init) +{ + FL_ErrorStatus result = FL_PASS; + /* 参数检查 */ + assert_param(IS_LPTIM32_INSTANCE(LPTIM32x)); + assert_param(IS_FL_LPTIM32_CHANNEL(Channel)); + assert_param(IS_FL_LPTIM32_IC_EDGE(ic_init->ICEdge)); + assert_param(IS_FL_LPTIM32_IC1_CAPTURE_SOURCE(ic_init->ICSource)); + /* 通道1捕获源 */ + if(Channel == FL_LPTIM32_CHANNEL_1) + { + FL_LPTIM32_IC_SetChannel1CaptureSource(LPTIM32, ic_init->ICSource); + } + /* 捕获通道边沿 */ + FL_LPTIM32_IC_SetCaptureEdge(LPTIM32, ic_init->ICEdge, Channel); + /* 通道输入捕获使能 */ + FL_LPTIM32_SetChannelMode(LPTIM32, FL_LPTIM32_CHANNEL_MODE_INPUT, Channel); + return result; +} + +/** + * @brief 设置 LPTIM32_IC_InitStruct 为默认配置 + * @param ic_init为 @ref FL_LPTIM32_IC_InitTypeDef类型的结构体 + * + * @retval None + */ +void FL_LPTIM32_IC_StructInit(FL_LPTIM32_IC_InitTypeDef *ic_init) +{ + ic_init->ICEdge = FL_LPTIM32_IC_EDGE_RISING; + ic_init->ICSource = FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP0; +} + +/** + * @brief 根据需要功能配置LPTIM32寄存器工作在输出比较模式 + * + * @param LPTIM32x 外设入口地址 + * @param oc_init 为 @ref FL_LPTIM32_OC_InitTypeDef类型的结构体 + * @param Channel LPTIM32输出通道 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS LPTIM32配置成功 + */ +FL_ErrorStatus FL_LPTIM32_OC_Init(LPTIM32_Type *LPTIM32x, uint32_t Channel, FL_LPTIM32_OC_InitTypeDef *oc_init) +{ + FL_ErrorStatus result = FL_PASS; + /* 参数检查 */ + assert_param(IS_LPTIM32_INSTANCE(LPTIM32x)); + assert_param(IS_FL_LPTIM32_CHANNEL(Channel)); + assert_param(IS_FL_LPTIM32_OC_POLARITY(oc_init->OCPolarity)); + /* 比较通道极性 */ + FL_LPTIM32_OC_SetPolarity(LPTIM32x, oc_init->OCPolarity, Channel); + /* 设置比较值 */ + switch(Channel) + { + case FL_LPTIM32_CHANNEL_1: + FL_LPTIM32_WriteCompareCH1(LPTIM32x, oc_init->compareValue); + break; + case FL_LPTIM32_CHANNEL_2: + FL_LPTIM32_WriteCompareCH2(LPTIM32x, oc_init->compareValue); + break; + case FL_LPTIM32_CHANNEL_3: + FL_LPTIM32_WriteCompareCH3(LPTIM32x, oc_init->compareValue); + break; + case FL_LPTIM32_CHANNEL_4: + FL_LPTIM32_WriteCompareCH4(LPTIM32x, oc_init->compareValue); + break; + default : + result = FL_FAIL; + break; + } + /* 通道输出比较使能 */ + FL_LPTIM32_SetChannelMode(LPTIM32x, FL_LPTIM32_CHANNEL_MODE_OUTPUT, Channel); + return result; +} + +/** + * @brief 设置 LPTIM32_OC_InitStruct 为默认配置 + * @param oc_init为 @ref FL_LPTIM32_OC_InitTypeDef类型的结构体 + * + * @retval None + */ +void FL_LPTIM32_OC_StructInit(FL_LPTIM32_OC_InitTypeDef *oc_init) +{ + oc_init->compareValue = 0; + oc_init->OCPolarity = FL_LPTIM32_OC_POLARITY_NORMAL; +} + +/** + * @} + */ + +#endif /* FL_LPTIM32_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lpuart.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lpuart.c new file mode 100644 index 0000000..f67dcae --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_lpuart.c @@ -0,0 +1,281 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_lpuart.c + * @author FMSH Application Team + * @brief Src file of LPUART FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup LPUART + * @{ + */ + +#ifdef FL_LPUART_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup LPUART_FL_Private_Macros + * @{ + */ +#define IS_LPUART_INSTANCE(INSTANCE) (((INSTANCE) == LPUART0)||\ + ((INSTANCE) == LPUART1)||\ + ((INSTANCE) == LPUART2)) + +#define IS_FL_LPUART_CLKSRC(__VALUE__) (((__VALUE__) == FL_CMU_LPUART_CLK_SOURCE_LSCLK)||\ + ((__VALUE__) == FL_CMU_LPUART_CLK_SOURCE_RCHF)||\ + ((__VALUE__) == FL_CMU_LPUART_CLK_SOURCE_RCLF)) + +#define IS_FL_LPUART_BAUDRATE(__VALUE__) (((__VALUE__) == FL_LPUART_BAUDRATE_300)||\ + ((__VALUE__) == FL_LPUART_BAUDRATE_600)||\ + ((__VALUE__) == FL_LPUART_BAUDRATE_1200)||\ + ((__VALUE__) == FL_LPUART_BAUDRATE_2400)||\ + ((__VALUE__) == FL_LPUART_BAUDRATE_4800)||\ + ((__VALUE__) == FL_LPUART_BAUDRATE_9600)) + +#define IS_FL_LPUART_DATAWIDTH(__VALUE__) (((__VALUE__) == FL_LPUART_DATA_WIDTH_6B)||\ + ((__VALUE__) == FL_LPUART_DATA_WIDTH_7B)||\ + ((__VALUE__) == FL_LPUART_DATA_WIDTH_8B)||\ + ((__VALUE__) == FL_LPUART_DATA_WIDTH_9B)) + +#define IS_FL_LPUART_STOPBITS(__VALUE__) (((__VALUE__) == FL_LPUART_STOP_BIT_WIDTH_1B)||\ + ((__VALUE__) == FL_LPUART_STOP_BIT_WIDTH_2B)) + +#define IS_FL_LPUART_PARITY(__VALUE__) (((__VALUE__) == FL_LPUART_PARITY_NONE)||\ + ((__VALUE__) == FL_LPUART_PARITY_EVEN)||\ + ((__VALUE__) == FL_LPUART_PARITY_ODD)) + +#define IS_FL_LPUART_DIRECTION(__VALUE__) (((__VALUE__) == FL_LPUART_DIRECTION_NONE)||\ + ((__VALUE__) == FL_LPUART_DIRECTION_RX)||\ + ((__VALUE__) == FL_LPUART_DIRECTION_TX)||\ + ((__VALUE__) == FL_LPUART_DIRECTION_TX_RX)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup LPUART_FL_EF_Init + * @{ + */ + +/** + * @brief 复位LPUART 外设 + * @param 外设入口地址 + * @retval 返回错误状态,可能值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_LPUART_DeInit(LPUART_Type *LPUARTx) +{ + FL_ErrorStatus status = FL_PASS; + /* 入口参数合法性断言 */ + assert_param(IS_LPUART_INSTANCE(LPUARTx)); + /* 外设复位使能 */ + FL_RMU_EnablePeripheralReset(RMU); + if(LPUARTx == LPUART0) + { + /*复位LPUART*/ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_LPUART0); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_LPUART0); + /* 外设总线时钟关闭 */ + FL_CMU_IsEnabledGroup3BusClock(FL_CMU_GROUP3_BUSCLK_LPUART0); + /* 外设工作时钟关闭 */ + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_LPUART0); + } + else + if(LPUARTx == LPUART1) + { + /*复位LPUART*/ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_LPUART1); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_LPUART1); + /* 外设总线时钟关闭 */ + FL_CMU_IsEnabledGroup3BusClock(FL_CMU_GROUP3_BUSCLK_LPUART1); + /* 外设工作时钟关闭 */ + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_LPUART1); + } + else + if(LPUARTx == LPUART2) + { + /*复位LPUART*/ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_LPUART2); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_LPUART2); + /* 外设总线时钟关闭 */ + FL_CMU_IsEnabledGroup3BusClock(FL_CMU_GROUP3_BUSCLK_LPUART2); + /* 外设工作时钟关闭 */ + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_LPUART2); + } + else + { + status = FL_FAIL; + } + /* 锁定外设复位功能 */ + FL_RMU_DisablePeripheralReset(RMU); + return (status); +} + +/** + * @brief 根据需要功能配置LPUART寄存器 + * + * @note 波特率调制寄存器中的MCTL值,默认为工作时钟为32768Hz的频率下的调制值,用户如果外设工作时钟不是此前 + * 提则可能需要手动调整这个寄存器的值,以达到更好的通信效果。 + * @param LPUARTx 外设入口地址 + * @param initStruct 指向一个 @ref FL_LPUART_InitTypeDef类型的结构体,它包含指定LPUART外设的配置信息 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS LPUART配置成功 + */ +FL_ErrorStatus FL_LPUART_Init(LPUART_Type *LPUARTx, FL_LPUART_InitTypeDef *initStruct) +{ + FL_ErrorStatus status = FL_FAIL; + uint16_t MCTLVel; + /* 参数合法性检查 */ + assert_param(IS_LPUART_INSTANCE(LPUARTx)); + assert_param(IS_FL_LPUART_CLKSRC(initStruct->clockSrc)); + assert_param(IS_FL_LPUART_BAUDRATE(initStruct->baudRate)); + assert_param(IS_FL_LPUART_DATAWIDTH(initStruct->dataWidth)); + assert_param(IS_FL_LPUART_STOPBITS(initStruct->stopBits)); + assert_param(IS_FL_LPUART_PARITY(initStruct->parity)); + assert_param(IS_FL_LPUART_DIRECTION(initStruct->transferDirection)); + if(LPUARTx == LPUART0) + { + /*总线时钟使能*/ + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_LPUART0); + /*操作时钟使能*/ + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_LPUART0); + /*时钟源选择*/ + FL_CMU_SetLPUART0ClockSource(initStruct->clockSrc << CMU_OPCCR1_LPUART0CKS_Pos); + } + else + if(LPUARTx == LPUART1) + { + /*总线时钟使能*/ + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_LPUART1); + /*操作时钟使能*/ + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_LPUART1); + /*时钟源选择*/ + FL_CMU_SetLPUART1ClockSource(initStruct->clockSrc << CMU_OPCCR1_LPUART1CKS_Pos); + } + else + { + /*总线时钟使能*/ + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_LPUART2); + /*操作时钟使能*/ + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_LPUART2); + /*时钟源选择*/ + FL_CMU_SetLPUART2ClockSource(initStruct->clockSrc << CMU_OPCCR1_LPUART2CKS_Pos); + } + if(initStruct->clockSrc == FL_CMU_LPUART_CLK_SOURCE_RCLF)//RCLF时钟 + { + FL_CMU_RCLF_SetPrescaler(FL_CMU_RCLF_PSC_DIV16); + FL_CMU_RCLF_Enable(); + FL_LPUART_DisableBaudRateModulation(LPUARTx); + } + else + { + FL_LPUART_EnableBaudRateModulation(LPUARTx); + } + /*发送接收配置*/ + if(initStruct->transferDirection & FL_LPUART_DIRECTION_TX) + { + do + { + FL_LPUART_EnableTX(LPUARTx); + } while(FL_LPUART_IsEnabledTX(LPUARTx) != FL_SET); + } + if(initStruct->transferDirection & FL_LPUART_DIRECTION_RX) + { + do + { + FL_LPUART_EnableRX(LPUARTx); + } while(FL_LPUART_IsEnabledRX(LPUARTx) != FL_SET); + } + /*配置波特率*/ + FL_LPUART_SetBaudRate(LPUARTx, initStruct->baudRate); + /*配置停止位*/ + FL_LPUART_SetStopBitsWidth(LPUARTx, initStruct->stopBits); + /*配置数据位宽*/ + FL_LPUART_SetDataWidth(LPUARTx, initStruct->dataWidth); + /*配置波特率*/ + FL_LPUART_SetParity(LPUARTx, initStruct->parity); + /*根据波特率配置MCTL值*/ + switch(initStruct->baudRate) + { + case FL_LPUART_BAUDRATE_9600: + MCTLVel = 0x0552; + break; + case FL_LPUART_BAUDRATE_4800: + MCTLVel = 0x1EFB; + break; + case FL_LPUART_BAUDRATE_2400: + MCTLVel = 0x16DB; + break; + case FL_LPUART_BAUDRATE_1200: + MCTLVel = 0x0492; + break; + case FL_LPUART_BAUDRATE_600: + MCTLVel = 0x16D6; + break; + case FL_LPUART_BAUDRATE_300: + MCTLVel = 0x0842; + break; + default: + MCTLVel = 0x0552; + break; + } + FL_LPUART_WriteBitModulation(LPUARTx, MCTLVel); + status = FL_PASS; + return status; +} + +/** + * @brief initStruct 为默认配置 + * @param initStruct 指向需要将值设置为默认配置的结构体 @ref FL_LPUART_InitTypeDef structure + * 结构体 + * @retval None + */ + +void FL_LPUART_StructInit(FL_LPUART_InitTypeDef *initStruct) +{ + initStruct->baudRate = FL_LPUART_BAUDRATE_9600; + initStruct->dataWidth = FL_LPUART_DATA_WIDTH_8B; + initStruct->stopBits = FL_LPUART_STOP_BIT_WIDTH_1B; + initStruct->parity = FL_LPUART_PARITY_NONE ; + initStruct->transferDirection = FL_LPUART_DIRECTION_TX_RX; + initStruct->clockSrc = FL_CMU_LPUART_CLK_SOURCE_LSCLK; +} + +/** + * @} + */ + +#endif /* FL_LPUART_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_pmu.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_pmu.c new file mode 100644 index 0000000..ae63696 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_pmu.c @@ -0,0 +1,174 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_pmu.c + * @author FMSH Application Team + * @brief Src file of PMU FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup PMU + * @{ + */ + +#ifdef FL_PMU_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup UART_FL_Private_Macros + * @{ + */ + + + +#define IS_FL_PMU_INSTANCE(INSTANCE) (((INSTANCE) == PMU)) + +#define IS_FL_PMU_MODE(__VALUE__) (((__VALUE__) == FL_PMU_POWER_MODE_ACTIVE_OR_LPACTIVE)||\ + ((__VALUE__) == FL_PMU_POWER_MODE_LPRUN_ONLY)||\ + ((__VALUE__) == FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP)) + +#define IS_FL_PMU_COREVOLTAGESCALING(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_PMU_DEEPSLEEP(__VALUE__) (((__VALUE__) == FL_PMU_SLEEP_MODE_DEEP)||\ + ((__VALUE__) == FL_PMU_SLEEP_MODE_NORMAL)) + +#define IS_FL_PMU_WAKEUPFREQUENCY(__VALUE__) (((__VALUE__) == FL_PMU_RCHF_WAKEUP_FREQ_8MHZ)||\ + ((__VALUE__) == FL_PMU_RCHF_WAKEUP_FREQ_16MHZ)||\ + ((__VALUE__) == FL_PMU_RCHF_WAKEUP_FREQ_24MHZ)) + +#define IS_FL_PMU_LDOLOWMODE(__VALUE__) (((__VALUE__) == FL_PMU_LDO_LPM_DISABLE)||\ + ((__VALUE__) == FL_PMU_LDO_LPM_ENABLE)) + +#define IS_FL_PMU_WAKEUPDELAY(__VALUE__) (((__VALUE__) == FL_PMU_WAKEUP_DELAY_0US)||\ + ((__VALUE__) == FL_PMU_WAKEUP_DELAY_2US)||\ + ((__VALUE__) == FL_PMU_WAKEUP_DELAY_4US)||\ + ((__VALUE__) == FL_PMU_WAKEUP_DELAY_8US)) + +/** + *@} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PMU_FL_EF_Init + * @{ + */ + +/** + * @brief 复位pmu外设 + * + * @param 外设入口地址 + * + * @retval 返回错误状态,可能值: + * -FL_PASS 外设寄存器值回复复位值 + * -FL_FAIL 位成功执行 + */ +FL_ErrorStatus FL_PMU_Sleep_DeInit(PMU_Type *PMUx) +{ + FL_ErrorStatus status = FL_FAIL; + /* 参数合法性检测 */ + assert_param(IS_FL_PMU_INSTANCE(PMUx)); + PMUx->CR = 0x00060000U; + PMUx->WKTR = 0xC0000001U; + PMUx->IER = 0x00000000U; + status = FL_PASS; + return status; +} + + +/** + * @brief 根据lpm_initstruct结构体包含的配置信息配置pmu寄存器 + * + * @note 为更好的睡眠功耗用户可能需要根据实际应用,调用 @ref fm33lg0xx_fl_pmu.h中的其他接口 + * 来完成睡眠前的模式配置,包括睡眠行为和唤醒后的行为(注:此函数会关闭BOR) + * @param PMUx 外设入口地址 + * @param LPM_InitStruct 指向一个 @ref FL_PMU_SleepInitTypeDef 类型的结构体,它包含指定PMU外设的配置信息 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS PMU配置成功 + */ +FL_ErrorStatus FL_PMU_Sleep_Init(PMU_Type *PMUx, FL_PMU_SleepInitTypeDef *LPM_InitStruct) +{ + FL_ErrorStatus status = FL_FAIL; + /* 参数合法性检查 */ + assert_param(IS_FL_PMU_INSTANCE(PMUx)); + assert_param(IS_FL_PMU_MODE(LPM_InitStruct->powerMode)); + assert_param(IS_FL_PMU_COREVOLTAGESCALING(LPM_InitStruct->coreVoltageScaling)); + assert_param(IS_FL_PMU_LDOLOWMODE(LPM_InitStruct->LDOLowPowerMode)); + assert_param(IS_FL_PMU_DEEPSLEEP(LPM_InitStruct->deepSleep)); + assert_param(IS_FL_PMU_WAKEUPFREQUENCY(LPM_InitStruct->wakeupFrequency)); + assert_param(IS_FL_PMU_WAKEUPDELAY(LPM_InitStruct->wakeupDelay)); + /* 唤醒时间 */ + FL_PMU_SetWakeupDelay(PMUx, LPM_InitStruct->wakeupDelay); + /* 唤醒后RCHF的频率 */ + FL_PMU_SetRCHFWakeupFrequency(PMUx, LPM_InitStruct->wakeupFrequency); + /* 睡眠下内核电压配置 */ + if(LPM_InitStruct->coreVoltageScaling == FL_ENABLE) + { + FL_PMU_EnableCoreVoltageScaling(PMUx); + } + else + { + FL_PMU_DisableCoreVoltageScaling(PMUx); + } + /* LDO低功耗配置 */ + FL_PMU_SetLDOLowPowerMode(PMUx,LPM_InitStruct->LDOLowPowerMode); + /* M0系统控制器,一般配置为0即可*/ + SCB->SCR = 0; + /* 睡眠模式 */ + FL_PMU_SetSleepMode(PMUx, LPM_InitStruct->deepSleep); + + status = FL_PASS; + return status; +} + +/** + * @brief LPM_InitStruct 为默认配置 + * @param LPM_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_PMU_SleepInitTypeDef structure + * 结构体 + * @retval None + */ +void FL_PMU_StructInit(FL_PMU_SleepInitTypeDef *LPM_InitStruct) +{ + LPM_InitStruct->powerMode = FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP; + LPM_InitStruct->deepSleep = FL_PMU_SLEEP_MODE_NORMAL; + LPM_InitStruct->LDOLowPowerMode = FL_PMU_LDO_LPM_DISABLE; + LPM_InitStruct->wakeupFrequency = FL_PMU_RCHF_WAKEUP_FREQ_8MHZ; + LPM_InitStruct->wakeupDelay = FL_PMU_WAKEUP_DELAY_2US; + LPM_InitStruct->coreVoltageScaling = FL_DISABLE; +} + +/** + * @} + */ + +#endif /* FL_PMU_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_rng.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_rng.c new file mode 100644 index 0000000..c1fbaa9 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_rng.c @@ -0,0 +1,201 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_rng.c + * @author FMSH Application Team + * @brief Src file of RNG FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup RNG + * @{ + */ + +#ifdef FL_RNG_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup RNG_FL_Private_Macros +* @{ +*/ +#define IS_FL_RNG_INSTANCE(INTANCE) ((INTANCE) == RNG) + +#define IS_FL_RNG_CLOCK_PRESCALER(__VALUE__) (((__VALUE__) == FL_CMU_RNG_PSC_DIV1)||\ + ((__VALUE__) == FL_CMU_RNG_PSC_DIV2)||\ + ((__VALUE__) == FL_CMU_RNG_PSC_DIV4)||\ + ((__VALUE__) == FL_CMU_RNG_PSC_DIV8)||\ + ((__VALUE__) == FL_CMU_RNG_PSC_DIV16)||\ + ((__VALUE__) == FL_CMU_RNG_PSC_DIV32)) +/** + *@} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RNG_FL_EF_Init + * @{ + */ +/** + * @brief 复位对应RNG寄存器. + * + * @param RNGx 外设入口地址 + * + * @retval ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_RNG_DeInit(RNG_Type *RNGx) +{ + assert_param(IS_FL_RNG_INSTANCE(RNGx)); + /* 使能外设复位 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 复位外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_RNG); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_RNG); + /* 关闭外设总线始时钟和工作时钟 */ + FL_CMU_DisableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_RNG); + /* 锁定外设复位 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} +/** + * @brief 根据 InitStruct 的配置信息初始化对应外设入口地址的寄存器值. + * @param RNGx 外设入口地址 + * + * @param initStruct 指向一个 @ref FL_RNG_InitTypeDef 结构体 其中包含了外设的相关配置信息. + * + * @note RNG使用RCHF默认的8M作为时钟输入,经2分频后4M提供给RNG + * + * @retval ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_RNG_Init(RNG_Type *RNGx) +{ + assert_param(IS_FL_RNG_INSTANCE(RNGx)); + /* RNG 使用RCHF作为工作时钟因此必须确认RCHF使能*/ + if(FL_CMU_RCHF_IsEnabled() != FL_SET) + { + FL_CMU_RCHF_Enable(); + } + /* RNG 总线时钟使能 */ + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_RNG); + /* RNG 工作时钟预分频*/ + switch(FL_CMU_GetRCHFClockFreq()) + { + case FL_CMU_RCHF_FREQUENCY_8MHZ: + FL_CMU_SetRNGPrescaler(FL_CMU_RNG_PSC_DIV2); + break; + case FL_CMU_RCHF_FREQUENCY_16MHZ: + FL_CMU_SetRNGPrescaler(FL_CMU_RNG_PSC_DIV4); + break; + case FL_CMU_RCHF_FREQUENCY_24MHZ: + FL_CMU_SetRNGPrescaler(FL_CMU_RNG_PSC_DIV8); + break; + case FL_CMU_RCHF_FREQUENCY_32MHZ: + FL_CMU_SetRNGPrescaler(FL_CMU_RNG_PSC_DIV8); + break; + default: + FL_CMU_SetRNGPrescaler(FL_CMU_RNG_PSC_DIV2); + break; + } + /* RNG 工作时钟使能*/ + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_RNG); + return FL_PASS; +} + +/** + * @brief 获取一次随机数 + * + * @param None + * + * @note 如果返回值为0xFFFFFFFF 则说明随机数生成失败,请用户检查此函数的返回值,失败时重新生成 + * + * @retval 成功返回随机数,失败返回0xFFFFFFFF + * + */ +uint32_t GetRandomNumber(void) +{ + uint32_t rn32; + FL_RNG_ClearFlag_RandomFail(RNG); + FL_RNG_Enable(RNG); + /* 由于LFSR循环移位周期是32cycle,为保证随机数质量,应用应保证两次读取RNGOUT之间的间隔大于32个TRNG_CLK周期 */ + FL_DelayUs(12); + FL_RNG_Disable(RNG); + rn32 = FL_RNG_ReadData(RNG); + if(FL_RNG_IsActiveFlag_RandomFail(RNG)) + { + FL_RNG_ClearFlag_RandomFail(RNG); + return 0xFFFFFFFF; + } + return rn32; +} + +/** + * @brief 获取CRC32 + * + * @param dataIn 待计算的数据 + * + * @note None + * + * @retval 成功返回CRC32,失败返回0xFFFFFFFF + * + */ +uint32_t GetCrc32(uint32_t dataIn) +{ + uint32_t i = 0; + uint32_t crc32 = 0; + FL_RNG_CRC_WriteData(RNG, dataIn); + FL_RNG_ClearFlag_CRCComplete(RNG); + FL_RNG_CRC_Enable(RNG); + while(0 == FL_RNG_IsActiveFlag_CRCComplete(RNG)) + { + i++; + if(i > 600) + { break; } + } + if(i >= 600) + { + FL_RNG_ClearFlag_CRCComplete(RNG); + FL_RNG_Disable(RNG); + return 0xFFFFFFFF; + } + FL_RNG_ClearFlag_CRCComplete(RNG); + crc32 = FL_RNG_ReadData(RNG); + FL_RNG_Disable(RNG); + return crc32; +} + +/** + * @} + */ + +#endif /* FL_RNG_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_rtca.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_rtca.c new file mode 100644 index 0000000..0fcf61d --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_rtca.c @@ -0,0 +1,187 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_rtca.c + * @author FMSH Application Team + * @brief Src file of RTCA FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup RTCA + * @{ + */ + +#ifdef FL_RTCA_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup RTCA_FL_Private_Macros + * @{ + */ +#define IS_RTCA_INSTANCE(RTCAx) ((RTCAx) == RTCA) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RTCA_FL_EF_Init + * @{ + */ +/** + * @brief 复位对应RTCAx寄存器. + * @param RTCAx + * @retval ErrorStatus枚举值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_RTCA_DeInit(RTCA_Type *RTCAx) +{ + FL_ErrorStatus result = FL_PASS; + /* Check the parameters */ + assert_param(IS_RTCA_INSTANCE(RTCAx)); + RTCAx->IER = 0x00000000U; + RTCAx->WER = 0xACACACACU; + RTCAx->ADJUST = 0x00000000U; + RTCAx->ADSIGN = 0x00000000U; + RTCAx->ALARM = 0x00000000U; + RTCAx->BCDDAY = 0x00000000U; + RTCAx->BCDHOUR = 0x00000000U; + RTCAx->BCDMIN = 0x00000000U; + RTCAx->BCDMONTH = 0x00000000U; + RTCAx->BCDSEC = 0x00000000U; + RTCAx->BCDWEEK = 0x00000000U; + RTCAx->BCDYEAR = 0x00000000U; + RTCAx->SBSCNT = 0x00000000U; + RTCAx->TMSEL = 0x00000000U; + RTCAx->CR = 0x00000000U; + RTCAx->WER = 0x00000000U; + return result; +} +/** + * @brief 配置实时时钟相关. + * @param RTCAx Timer Instance + * @param initStruct 指向一个 @ref FL_RTCA_InitTypeDef(时基配置结构体) + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_RTCA_Init(RTCA_Type *RTCAx, FL_RTCA_InitTypeDef *initStruct) +{ + /* 参数检查 */ + assert_param(IS_RTCA_INSTANCE(RTCAx)); + /* 时钟总线使能配置 */ + FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_RTCA); + /* 配置时间 */ + FL_RTCA_ConfigTime(RTCAx, initStruct); + return FL_PASS; +} + +/** + * @brief 设置实时时钟 + * @param RTCAx Timer Instance + * @param initStruct 指向一个 @ref FL_RTCA_InitTypeDef(时基配置结构体) + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_RTCA_ConfigTime(RTCA_Type *RTCAx, FL_RTCA_InitTypeDef *initStruct) +{ + /* 使能时间配置 */ + FL_RTCA_WriteEnable(RTCAx); + /* 配置秒 */ + FL_RTCA_WriteSecond(RTCAx, initStruct->second); + /* 配置分钟 */ + FL_RTCA_WriteMinute(RTCAx, initStruct->minute); + /* 配置小时 */ + FL_RTCA_WriteHour(RTCAx, initStruct->hour); + /* 配置日期 */ + FL_RTCA_WriteDay(RTCAx, initStruct->day); + /* 配置周 */ + FL_RTCA_WriteWeek(RTCAx, initStruct->week); + /* 配置月 */ + FL_RTCA_WriteMonth(RTCAx, initStruct->month); + /* 配置年 */ + FL_RTCA_WriteYear(RTCAx, initStruct->year); + /* 锁定时间配置 */ + FL_RTCA_WriteDisable(RTCAx); + return FL_PASS; +} +/** + * @brief 获取实时时间并保存到指定结构体中 + * @param RTCAx Timer Instance + * @param initStruct 指向一个 @ref FL_RTCA_InitTypeDef(时基配置结构体) + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 成功 + */ +FL_ErrorStatus FL_RTCA_GetTime(RTCA_Type *RTCAx, FL_RTCA_InitTypeDef *initStruct) +{ + /* 配置秒 */ + initStruct->second = FL_RTCA_ReadSecond(RTCAx); + /* 配置分钟 */ + initStruct->minute = FL_RTCA_ReadMinute(RTCAx); + /* 配置小时 */ + initStruct->hour = FL_RTCA_ReadHour(RTCAx); + /* 配置日期 */ + initStruct->day = FL_RTCA_ReadDay(RTCAx); + /* 配置周 */ + initStruct->week = FL_RTCA_ReadWeek(RTCAx); + /* 配置月 */ + initStruct->month = FL_RTCA_ReadMonth(RTCAx); + /* 配置年 */ + initStruct->year = FL_RTCA_ReadYear(RTCAx); + return FL_PASS; +} +/** + * @brief 设置 initStruct 为默认配置 + * @param initStruct 指向需要将值设置为默认配置的结构体 @ref FL_RTCA_InitTypeDef 结构体 + * + * @retval None + */ + +void FL_RTCA_StructInit(FL_RTCA_InitTypeDef *initStruct) +{ + /* */ + initStruct->year = 0x00; + initStruct->month = 0x00; + initStruct->day = 0x00; + initStruct->week = 0x00; + initStruct->hour = 0x00; + initStruct->minute = 0x00; + initStruct->second = 0x00; +} + +/** + * @} + */ + +#endif /* FL_RTCA_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_spi.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_spi.c new file mode 100644 index 0000000..ca018c5 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_spi.c @@ -0,0 +1,229 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_spi.c + * @author FMSH Application Team + * @brief Src file of SPI FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup SPI + * @{ + */ + +#ifdef FL_SPI_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup SPI_FL_Private_Macros + * @{ + */ +#define IS_FL_SPI_INSTANCE(INTANCE) (((INTANCE) == SPI0)||\ + ((INTANCE) == SPI1)||\ + ((INTANCE) == SPI2)) + +#define IS_FL_SPI_MODE(__VALUE__) (((__VALUE__) == FL_SPI_WORK_MODE_SLAVE)||\ + ((__VALUE__) == FL_SPI_WORK_MODE_MASTER)) + +#define IS_FL_SPI_BITORDER(__VALUE__) (((__VALUE__) == FL_SPI_BIT_ORDER_MSB_FIRST)||\ + ((__VALUE__) == FL_SPI_BIT_ORDER_LSB_FIRST)) + +#define IS_FL_SPI_DATAWIDT(__VALUE__) (((__VALUE__) == FL_SPI_DATA_WIDTH_8B)||\ + ((__VALUE__) == FL_SPI_DATA_WIDTH_16B)||\ + ((__VALUE__) == FL_SPI_DATA_WIDTH_24B)||\ + ((__VALUE__) == FL_SPI_DATA_WIDTH_32B)) + +#define IS_FL_SPI_CLOCK_PHASE(__VALUE__) (((__VALUE__) == FL_SPI_PHASE_EDGE1)||\ + ((__VALUE__) == FL_SPI_PHASE_EDGE2)) + +#define IS_FL_SPI_CLOCK_POLARITY(__VALUE__) (((__VALUE__) == FL_SPI_POLARITY_NORMAL)||\ + ((__VALUE__) == FL_SPI_POLARITY_INVERT)) + +#define IS_FL_SPI_BAUDRATE(__VALUE__) (((__VALUE__) == FL_SPI_BAUDRATE_DIV2)||\ + ((__VALUE__) == FL_SPI_BAUDRATE_DIV4)||\ + ((__VALUE__) == FL_SPI_BAUDRATE_DIV8)||\ + ((__VALUE__) == FL_SPI_BAUDRATE_DIV16)||\ + ((__VALUE__) == FL_SPI_BAUDRATE_DIV32)||\ + ((__VALUE__) == FL_SPI_BAUDRATE_DIV64)||\ + ((__VALUE__) == FL_SPI_BAUDRATE_DIV128)||\ + ((__VALUE__) == FL_SPI_BAUDRATE_DIV256)) + + +#define IS_FL_SPI_TANSFERMODE(__VALUE__) (((__VALUE__) == FL_SPI_TRANSFER_MODE_FULL_DUPLEX)||\ + ((__VALUE__) == FL_SPI_TRANSFER_MODE_HALF_DUPLEX)) + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup SPI_FL_EF_Init + * @{ + */ + +/** + * @brief 复位对应SPI寄存器. + * @param SPIx + * @retval ErrorStatus枚举值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_SPI_DeInit(SPI_Type *SPIx) +{ + assert_param(IS_FL_SPI_INSTANCE(SPIx)); + /* 使能外设复位 */ + FL_RMU_EnablePeripheralReset(RMU); + if(SPIx == SPI0) + { + /* 复位SPI外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SPI0); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SPI0); + /* 关闭外设总线始时钟和工作时钟 */ + FL_CMU_DisableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_SPI0); + } + else + if(SPIx == SPI1) + { + /* 复位SPI外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SPI1); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SPI1); + /* 关闭外设总线始时钟和工作时钟 */ + FL_CMU_DisableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_SPI1); + } + else + if(SPIx == SPI2) + { + /* 复位SPI外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SPI2); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SPI2); + /* 关闭外设总线始时钟和工作时钟 */ + FL_CMU_DisableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_SPI2); + } + else + { + FL_RMU_DisablePeripheralReset(RMU); + return FL_FAIL; + } + /* 锁定外设复位 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} +/** + * @brief 根据 SPI_InitStruct 的配置信息初始化对应外设入口地址的寄存器值. + * @param SPIx SPIx + * @param SPI_InitStruct 指向一个 @ref FL_SPI_InitTypeDef 结构体 + * 其中包含了外设的相关配置信息. + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS SPI配置成功 + */ +FL_ErrorStatus FL_SPI_Init(SPI_Type *SPIx, FL_SPI_InitTypeDef *initStruct) +{ + assert_param(IS_FL_SPI_INSTANCE(SPIx)); + assert_param(IS_FL_SPI_MODE(initStruct->mode)); + assert_param(IS_FL_SPI_BITORDER(initStruct->bitOrder)); + assert_param(IS_FL_SPI_DATAWIDT(initStruct->dataWidth)); + assert_param(IS_FL_SPI_BAUDRATE(initStruct->baudRate)); + assert_param(IS_FL_SPI_CLOCK_PHASE(initStruct->clockPhase)); + assert_param(IS_FL_SPI_CLOCK_POLARITY(initStruct->clockPolarity)); + if(SPIx == SPI0) + { + /* 外设总线始时钟 */ + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_SPI0); + } + else + if(SPIx == SPI1) + { + /* 外设总线始时钟 */ + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_SPI1); + } + else + if(SPIx == SPI2) + { + /* 外设总线始时钟 */ + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_SPI2); + } + else + { + return FL_FAIL; + } + /* 选择NSS脚控制模式 */ + if(initStruct->softControl == FL_ENABLE) + { + FL_SPI_EnableSSNSoftControl(SPIx); + } + else + { + FL_SPI_DisableSSNSoftControl(SPIx); + } + /* 外设工作主从模式 */ + FL_SPI_SetWorkMode(SPIx, initStruct->mode); + /* 总线通讯速率 */ + FL_SPI_SetClockDivision(SPIx, initStruct->baudRate); + /* 数据bit方向 */ + FL_SPI_SetBitOrder(SPIx, initStruct->bitOrder); + /* 总线数据位宽 */ + FL_SPI_SetDataWidth(SPIx, initStruct->dataWidth); + /* 时钟相位 */ + FL_SPI_SetClockPhase(SPIx, initStruct->clockPhase); + /* 传输模式 双工半双工 */ + FL_SPI_SetTransferMode(SPIx, initStruct->transferMode); + /* 时钟极性 */ + FL_SPI_SetClockPolarity(SPIx, initStruct->clockPolarity); + /* 使能 外设*/ + FL_SPI_Enable(SPIx); + return FL_PASS; +} +/** + * @brief 设置 SPI_InitStruct 为默认配置 + * @param SPI_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_SPI_InitTypeDef 结构体 + * + * @retval None + */ + +void FL_SPI_StructInit(FL_SPI_InitTypeDef *initStruct) +{ + initStruct->softControl = FL_DISABLE; + initStruct->mode = FL_SPI_WORK_MODE_MASTER; + initStruct->baudRate = FL_SPI_CLK_DIV8; + initStruct->bitOrder = FL_SPI_BIT_ORDER_MSB_FIRST; + initStruct->dataWidth = FL_SPI_DATA_WIDTH_8B; + initStruct->clockPolarity = FL_SPI_POLARITY_NORMAL; + initStruct->clockPhase = FL_SPI_PHASE_EDGE1; + initStruct->transferMode = FL_SPI_TRANSFER_MODE_FULL_DUPLEX; +} + +/** + * @} + */ + +#endif /* FL_SPI_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_svd.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_svd.c new file mode 100644 index 0000000..2aaa1e0 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_svd.c @@ -0,0 +1,191 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_svd.c + * @author FMSH Application Team + * @brief Src file of SVD FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup SVD + * @{ + */ + +#ifdef FL_SVD_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup SVD_FL_Private_Macros + * @{ + */ + +#define IS_SVD_INSTANCE(INSTANCE) (((INSTANCE) == SVD)) + +#define IS_FL_SVD_REFERENCE_VOLTAGE(__VALUE__) (((__VALUE__) == FL_SVD_REFERENCE_1P0V)||\ + ((__VALUE__) == FL_SVD_REFERENCE_0P95V)||\ + ((__VALUE__) == FL_SVD_REFERENCE_0P9V)) + +#define IS_FL_SVD_WARNING_THRESHOLD_LEVEL(__VALUE__) (((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP0)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP1)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP2)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP3)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP4)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP5)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP6)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP7)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP8)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP9)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP10)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP11)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP12)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP13)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP14)||\ + ((__VALUE__) == FL_SVD_WARNING_THRESHOLD_GROUP15)) + +#define IS_FL_SVD_WORK_MODE(__VALUE__) (((__VALUE__) == FL_SVD_WORK_MODE_CONTINUOUS)||\ + ((__VALUE__) == FL_SVD_WORK_MODE_PERIODIC)) + +#define IS_FL_SVD_ENABLE_PERIOD(__VALUE__) (((__VALUE__) == FL_SVD_ENABLE_PERIOD_62P5MS)||\ + ((__VALUE__) == FL_SVD_ENABLE_PERIOD_256MS)||\ + ((__VALUE__) == FL_SVD_ENABLE_PERIOD_1000MS)||\ + ((__VALUE__) == FL_SVD_ENABLE_PERIOD_4000MS)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup SVD_FL_EF_Init + * @{ + */ + +/** + * @brief 复位SVD外设 + * @param 外设入口地址 + * @retval 返回错误状态,可能值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_SVD_DeInit(SVD_Type *SVDx) +{ + /* 参数检查 */ + assert_param(IS_SVD_INSTANCE(SVDx)); + /* 使能复位 */ + FL_RMU_EnablePeripheralReset(RMU); + /* 复位外设寄存器 */ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SVD); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SVD); + /* 关闭外设总线时钟 */ + FL_CMU_DisableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_SVD); + /* 关闭复位 */ + FL_RMU_DisablePeripheralReset(RMU); + return FL_PASS; +} + +/** + * @brief 根据需要功能配置SVD寄存器 + * + * @param SVDx 外设入口地址 + * @param init @ref FL_SVD_InitTypeDef类型的结构体 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS SVD配置成功 + */ +FL_ErrorStatus FL_SVD_Init(SVD_Type *SVDx, FL_SVD_InitTypeDef *init) +{ + /* 参数检查 */ + assert_param(IS_SVD_INSTANCE(SVDx)); + assert_param(IS_FL_SVD_REFERENCE_VOLTAGE(init->referenceVoltage)); + assert_param(IS_FL_SVD_WARNING_THRESHOLD_LEVEL(init->warningThreshold)); + assert_param(IS_FL_SVD_WORK_MODE(init->workMode)); + assert_param(IS_FL_SVD_ENABLE_PERIOD(init->enablePeriod)); + /* 开启SVD时钟 */ + if(SVDx == SVD) + { + FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_SVD); + } + else + { + return FL_FAIL; + } + /* 设置参考基准 */ + FL_SVD_EnableReference(SVDx, init->referenceVoltage); + /* 设置报警阈值 */ + FL_SVD_SetWarningThreshold(SVDx, init->warningThreshold); + /* 数字滤波 */ + if(init->digitalFilter == FL_ENABLE) + { + FL_SVD_EnableDigitalFilter(SVDx); + } + else + { + FL_SVD_DisableDigitalFilter(SVDx); + } + /* 工作模式 */ + FL_SVD_SetWorkMode(SVDx, init->workMode); + if(init->workMode == FL_SVD_WORK_MODE_PERIODIC) + { + /* 间歇使能间隔 */ + FL_SVD_SetEnablePeriod(SVDx, init->enablePeriod); + } + /* SVS通道 */ + if(init->SVSChannel == FL_ENABLE) + { + FL_SVD_EnableSVSChannel(SVDx); + } + else + { + FL_SVD_DisableSVSChannel(SVDx); + } + return FL_PASS; +} + +/** + * @brief 设置 SVD_InitStruct 为默认配置 + * @param init @ref FL_SVD_InitTypeDef类型的结构体 + * + * @retval None + */ +void FL_SVD_StructInit(FL_SVD_InitTypeDef *init) +{ + init->referenceVoltage = FL_SVD_REFERENCE_1P0V; + init->SVSChannel = FL_DISABLE; + init->digitalFilter = FL_DISABLE; + init->workMode = FL_SVD_WORK_MODE_CONTINUOUS; + init->enablePeriod = FL_SVD_ENABLE_PERIOD_62P5MS; + init->warningThreshold = FL_SVD_WARNING_THRESHOLD_GROUP0; +} + +/** + * @} + */ + +#endif /* FL_SVD_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/********************** (C) COPYRIGHT Fudan Microelectronics **** END OF FILE ***********************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_uart.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_uart.c new file mode 100644 index 0000000..7dfeb71 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_uart.c @@ -0,0 +1,375 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_uart.c + * @author FMSH Application Team + * @brief Src file of UART FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2020] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under the Mulan PSL v1. + * can use this software according to the terms and conditions of the Mulan PSL v1. + * You may obtain a copy of Mulan PSL v1 at: + * http://license.coscl.org.cn/MulanPSL + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v1 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup UART + * @{ + */ + +#ifdef FL_UART_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup UART_FL_Private_Macros + * @{ + */ + + +#define IS_UART_INSTANCE(INSTANCE) (((INSTANCE) == UART0)||\ + ((INSTANCE) == UART1)||\ + ((INSTANCE) == UART3)||\ + ((INSTANCE) == UART4)||\ + ((INSTANCE) == UART5)) + +#define IS_FL_UART_CLKSRC(__VALUE__) (((__VALUE__) == FL_CMU_UART0_CLK_SOURCE_APBCLK)||\ + ((__VALUE__) == FL_CMU_UART0_CLK_SOURCE_RCHF)||\ + ((__VALUE__) == FL_CMU_UART0_CLK_SOURCE_SYSCLK)||\ + ((__VALUE__) == FL_CMU_UART0_CLK_SOURCE_XTHF)||\ + ((__VALUE__) == FL_CMU_UART1_CLK_SOURCE_APBCLK)||\ + ((__VALUE__) == FL_CMU_UART1_CLK_SOURCE_RCHF)||\ + ((__VALUE__) == FL_CMU_UART1_CLK_SOURCE_SYSCLK)||\ + ((__VALUE__) == FL_CMU_UART1_CLK_SOURCE_XTHF)) + + +#define IS_FL_UART_DATAWIDTH(__VALUE__) (((__VALUE__) == FL_UART_DATA_WIDTH_6B)||\ + ((__VALUE__) == FL_UART_DATA_WIDTH_7B)||\ + ((__VALUE__) == FL_UART_DATA_WIDTH_8B)||\ + ((__VALUE__) == FL_UART_DATA_WIDTH_9B)) + +#define IS_FL_UART_STOPBITS(__VALUE__) (((__VALUE__) == FL_UART_STOP_BIT_WIDTH_1B)||\ + ((__VALUE__) == FL_UART_STOP_BIT_WIDTH_2B)) + +#define IS_FL_UART_PARITY(__VALUE__) (((__VALUE__) == FL_UART_PARITY_NONE)||\ + ((__VALUE__) == FL_UART_PARITY_EVEN)||\ + ((__VALUE__) == FL_UART_PARITY_ODD)) + +#define IS_FL_UART_DIRECTION(__VALUE__) (((__VALUE__) == FL_UART_DIRECTION_NONE)||\ + ((__VALUE__) == FL_UART_DIRECTION_RX)||\ + ((__VALUE__) == FL_UART_DIRECTION_TX)||\ + ((__VALUE__) == FL_UART_DIRECTION_TX_RX)) + +#define IS_FL_UART_INFRA_MODULATION(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + + +#define IS_FL_UART_INFRARED_POLARITY(__VALUE__) (((__VALUE__) == FL_UART_INFRARED_POLARITY_NORMAL)||\ + ((__VALUE__) == FL_UART_INFRARED_POLARITY_INVERT)) + +#define IS_FL_UART_INFRARED_MODULATION_DUTY(__VALUE__) (((__VALUE__) <= 100)) + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup UART_FL_EF_Init + * @{ + */ + +/** + * @brief 复位UART 外设寄存器值为复位值 + * @param 外设入口地址 + * @retval 返回错误状态,可能值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 复位未成功 + */ +FL_ErrorStatus FL_UART_DeInit(UART_Type *UARTx) +{ + FL_ErrorStatus status = FL_PASS; + /* 参数入口合法性 */ + assert_param(IS_UART_INSTANCE(UARTx)); + /* 外设复位使能 */ + FL_RMU_EnablePeripheralReset(RMU); + if(UARTx == UART0) + { + /*复位UART*/ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_UART0); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_UART0); + /* 外设总线时钟关闭 */ + FL_CMU_DisableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_UART0); + /* 外设工作时钟关闭 */ + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_UART0); + } + else + if(UARTx == UART1) + { + /*复位UART*/ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_UART1); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_UART1); + /* 外设总线时钟关闭 */ + FL_CMU_DisableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_UART1); + /* 外设工作时钟关闭 */ + FL_CMU_DisableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_UART1); + } + else + if(UARTx == UART3) + { + /*复位UART*/ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_UART3); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_UART3); + /* UART3、4、5为单时钟,关闭总线时钟 */ + FL_CMU_DisableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_UART3); + } + else + if(UARTx == UART4) + { + /*复位UART*/ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_UART4); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_UART4); + /* 总线、工作时钟关闭 */ + FL_CMU_DisableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_UART4); + } + else + if(UARTx == UART5) + { + /*复位UART*/ + FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_UART5); + FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_UART5); + /* 总线(工作)时钟关闭 */ + FL_CMU_DisableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_UART5); + } + else + { + status = FL_FAIL; + } + /* 锁定外设复位功能 */ + FL_RMU_DisablePeripheralReset(RMU); + return (status); +} + +/** + * @brief 根据需要配置UART + * + * @param UARTx 外设入口地址 + * @param UART_InitStruct指向一个FL_UART_InitTypeDef类型的结构体,它包含外设UART的配置信息 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS UART配置成功 + */ +FL_ErrorStatus FL_UART_Init(UART_Type *UARTx, FL_UART_InitTypeDef *initStruct) +{ + FL_ErrorStatus status = FL_FAIL; + uint32_t Fclk = 0, BaudRate = 0; + /* 参数合法性检查 */ + assert_param(IS_UART_INSTANCE(UARTx)); + assert_param(IS_FL_UART_CLKSRC(initStruct->clockSrc)); + assert_param(IS_FL_UART_DATAWIDTH(initStruct->dataWidth)); + assert_param(IS_FL_UART_PARITY(initStruct->parity)); + assert_param(IS_FL_UART_STOPBITS(initStruct->stopBits)); + assert_param(IS_FL_UART_DIRECTION(initStruct->transferDirection)); + if(UARTx == UART0) + { + /*时钟源选择*/ + FL_CMU_SetUART0ClockSource(initStruct->clockSrc); + /* 根据不同的时钟源计算baudrate 寄存器值,并配置 */ + switch(initStruct->clockSrc) + { + case FL_CMU_UART0_CLK_SOURCE_APBCLK: + Fclk = FL_CMU_GetAPBClockFreq(); + break; + case FL_CMU_UART0_CLK_SOURCE_RCHF: + Fclk = FL_CMU_GetRCHFClockFreq(); + break; + case FL_CMU_UART0_CLK_SOURCE_SYSCLK: + Fclk = FL_CMU_GetSystemClockFreq(); + break; + case FL_CMU_UART0_CLK_SOURCE_XTHF: + Fclk = XTHFClock; + break; + default: + Fclk = FL_CMU_GetAPBClockFreq(); + break; + } + BaudRate = Fclk / initStruct->baudRate - 1; + } + if(UARTx == UART1) + { + /*时钟源选择*/ + FL_CMU_SetUART1ClockSource(initStruct->clockSrc); + /* 根据不同的时钟源计算baudrate 寄存器值,并配置 */ + switch(initStruct->clockSrc) + { + case FL_CMU_UART1_CLK_SOURCE_APBCLK: + Fclk = FL_CMU_GetAPBClockFreq(); + break; + case FL_CMU_UART1_CLK_SOURCE_RCHF: + Fclk = FL_CMU_GetRCHFClockFreq(); + break; + case FL_CMU_UART1_CLK_SOURCE_SYSCLK : + Fclk = FL_CMU_GetSystemClockFreq(); + break; + case FL_CMU_UART1_CLK_SOURCE_XTHF: + Fclk = XTHFClock; + break; + default: + Fclk = FL_CMU_GetAPBClockFreq(); + break; + } + BaudRate = Fclk / initStruct->baudRate - 1; + } + if(UARTx == UART0) + { + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_UART0); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_UART0); + } + else + if(UARTx == UART1) + { + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_UART1); + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_UART1); + } + else + if(UARTx == UART3) + { + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_UART3); + Fclk = FL_CMU_GetAPBClockFreq(); + BaudRate = Fclk / initStruct->baudRate - 1; + } + else + if(UARTx == UART4) + { + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_UART4); + Fclk = FL_CMU_GetAPBClockFreq(); + BaudRate = Fclk / initStruct->baudRate - 1; + } + else + if(UARTx == UART5) + { + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_UART5); + Fclk = FL_CMU_GetAPBClockFreq(); + BaudRate = Fclk / initStruct->baudRate - 1; + } + /*发送接收控制*/ + if(initStruct->transferDirection & FL_UART_DIRECTION_TX) + { + FL_UART_EnableTX(UARTx); + } + if(initStruct->transferDirection & FL_UART_DIRECTION_RX) + { + FL_UART_EnableRX(UARTx); + } + /*配置波特率*/ + FL_UART_WriteBaudRate(UARTx, BaudRate); + /*配置停止位长度*/ + FL_UART_SetStopBitsWidth(UARTx, initStruct->stopBits); + /*数据长度*/ + FL_UART_SetDataWidth(UARTx, initStruct->dataWidth); + /*配置奇偶校验*/ + FL_UART_SetParity(UARTx, initStruct->parity); + status = FL_PASS; + return status; +} +/** + * @brief 根据需要配置红外调制寄存器 + * + * @param UARTx 外设入口地址 + * + * @param initStruct指向FL_UART_InitTypeDef类型的结构体,包含UART外设信息 + * + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程出现错误 + * -FL_PASS UART配置成功 + */ +FL_ErrorStatus FL_UART_InfraRed_Init(UART_Type *UARTx, FL_UART_InfraRed_InitTypeDef *initStruct) +{ + FL_ErrorStatus status = FL_FAIL; + uint32_t tempTZBRG = 0, tempTH = 0; + /* 参数合法性检查 */ + assert_param(IS_UART_INSTANCE(UARTx)); + assert_param(IS_FL_UART_INFRARED_POLARITY(initStruct->polarity)); + assert_param(IS_FL_UART_INFRARED_MODULATION_DUTY(initStruct->modulationDuty)); + /*红外发送总线时钟使能*/ + FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_UARTIR); + /*红外发送使能*/ + FL_UART_EnableIRModulation(UARTx); + /*红外调制极性*/ + FL_UART_SetIRPolarity(UART, initStruct->polarity); + /*红外调制频率*/ + tempTZBRG = (uint32_t)((FL_CMU_GetAPBClockFreq() * 1.0) / initStruct->modulationFrequency - 1); + /* 调制占空比 */ + if((tempTZBRG >> 4) != 0) + { + tempTH = (uint32_t)(((float)initStruct->modulationDuty / 100.0f) * ((float)(tempTZBRG + 1) / (float)(tempTZBRG >> 4)) + 0.5f); + } + else + { + tempTH = (uint32_t)(((float)initStruct->modulationDuty / 100.0f) * (float)(tempTZBRG + 1) + 0.5f); + } + /* 占空比限位到小于95%,否则结果会有问题 */ + tempTH = ((float)((tempTZBRG >> 4) * tempTH) / (float)(tempTZBRG + 1)) < 0.95f ? tempTH : tempTH - 1; + /* 占空比和调制频率配置 */ + FL_UART_WriteIRModulationDuty(UART, tempTH); + FL_UART_WriteIRModulationFrequency(UART, tempTZBRG); + status = FL_PASS; + return status; +} + +/** + * @brief UART_InitStruct 为默认配置 + * @param UART_InitStruct 指向需要将值设置为默认配置 的结构体@ref FL_UART_InitTypeDef structure 结构体 + * + * @retval None + */ +void FL_UART_InfraRed_StructInit(FL_UART_InfraRed_InitTypeDef *initStruct) +{ + initStruct->polarity = FL_UART_INFRARED_POLARITY_NORMAL; + initStruct->modulationDuty = 50; + initStruct->modulationFrequency = 38000; +} + +/** + * @brief UART_InitStruct 为默认配置 + * @param UART_InitStruct 指向需要将值设置为默认配置 的结构体@ref FL_UART_InitTypeDef structure 结构体 + * 结构体 + * @retval None + */ +void FL_UART_StructInit(FL_UART_InitTypeDef *initStruct) +{ + initStruct->baudRate = 115200; + initStruct->dataWidth = FL_UART_DATA_WIDTH_8B; + initStruct->stopBits = FL_UART_STOP_BIT_WIDTH_1B; + initStruct->parity = FL_UART_PARITY_EVEN ; + initStruct->transferDirection = FL_UART_DIRECTION_TX_RX; + initStruct->clockSrc = 0; +} + +/** + * @} + */ + +#endif /* FL_UART_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_vao.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_vao.c new file mode 100644 index 0000000..413d3ea --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_vao.c @@ -0,0 +1,226 @@ +/** + ******************************************************************************************************* + * @file fm33lg0xx_fl_vao.c + * @author FMSH Application Team + * @brief Src file of DMA FL Module + ******************************************************************************************************* + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + ******************************************************************************************************* + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup VAO + * @{ + */ + +#ifdef FL_VAO_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup VAO_FL_Private_Macros + * @{ + */ +#define IS_FL_VAO_INSTANCE(INTANCE) ((INTANCE) == VAO) + +#define IS_FL_VAO_OUTPUT_DRIVE_ABILITY(__VALUE__) (((__VALUE__) == FL_VAO_XTLF_DRIVE_LEVEL_NONE)||\ + ((__VALUE__) == FL_VAO_XTLF_DRIVE_LEVEL_1)||\ + ((__VALUE__) == FL_VAO_XTLF_DRIVE_LEVEL_2)||\ + ((__VALUE__) == FL_VAO_XTLF_DRIVE_LEVEL_3)||\ + ((__VALUE__) == FL_VAO_XTLF_DRIVE_LEVEL_4)||\ + ((__VALUE__) == FL_VAO_XTLF_DRIVE_LEVEL_5)||\ + ((__VALUE__) == FL_VAO_XTLF_DRIVE_LEVEL_6)||\ + ((__VALUE__) == FL_VAO_XTLF_DRIVE_LEVEL_7)) + +#define IS_FL_VAO_WORKING_CURRENT(__VALUE__) (((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_850NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_800NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_750NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_700NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_650NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_600NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_550NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_500NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_450NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_400NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_350NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_300NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_250NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_200NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_150NA)||\ + ((__VALUE__) == FL_VAO_XTLF_WORK_CURRENT_100NA)) + +#define IS_FL_VAO_PH15_INPUT(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_VAO_PH15_PULL_UP(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + + +#define IS_FL_VAO_PH15_OPENDRAIN_OUTPUT(__VALUE__) (((__VALUE__) == FL_DISABLE)||\ + ((__VALUE__) == FL_ENABLE)) + +#define IS_FL_VAO_PH15_MODE(__VALUE__) (((__VALUE__) == FL_VAO_PH15_MODE_INPUT)||\ + ((__VALUE__) == FL_VAO_PH15_MODE_OUTPUT)||\ + ((__VALUE__) == FL_VAO_PH15_MODE_RTCOUT)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup VAO_FL_EF_Init + * @{ + */ + +/** + * @brief 复位对应VAO寄存器 + * @param VAOx VAO Port + * @retval ErrorStatus枚举值: + * -FL_PASS 外设寄存器值恢复复位值 + * -FL_FAIL 未成功执行 + */ +FL_ErrorStatus FL_VAO_DeInit(VAO_Type *VAOx) +{ + /* 入口参数检查 */ + assert_param(IS_FL_VAO_INSTANCE(VAOx)); + /* 使能vao复位 */ + FL_VAO_EnableReset(VAOx); + /*失能CDIF*/ + FL_CDIF_DisableVAOToCPU(CDIF); + FL_CDIF_DisableCPUToVAO(CDIF); + return FL_PASS; +} + +/** + * @brief 根据 VAO_IO_StructInit 的配置信息初始化对应外设入口地址的寄存器值 + * @param VAOx VAOx + * @param VAO_IO_StructInit 指向一个 @ref FL_VAO_IO_InitTypeDef 结构体 + * 其中包含了外设的相关配置信息. + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 配置成功 + */ +FL_ErrorStatus FL_VAO_IO_Init(VAO_Type *VAOx, FL_VAO_IO_InitTypeDef *VAO_IO_InitStruct) +{ + /* 参数检查 */ + assert_param(IS_FL_VAO_INSTANCE(VAOx)); + assert_param(IS_FL_VAO_PH15_INPUT(VAO_IO_InitStruct->input)); + assert_param(IS_FL_VAO_PH15_PULL_UP(VAO_IO_InitStruct->pullup)); + assert_param(IS_FL_VAO_PH15_OPENDRAIN_OUTPUT(VAO_IO_InitStruct->opendrainOutput)); + assert_param(IS_FL_VAO_PH15_MODE(VAO_IO_InitStruct->mode)); + /*使能CDIF*/ + FL_CDIF_EnableVAOToCPU(CDIF); + FL_CDIF_EnableCPUToVAO(CDIF); + /*! PH15功能选择 */ + FL_VAO_GPIO_SetPH15Mode(VAOx, VAO_IO_InitStruct->mode); + /*! PH15输入使能 */ + if(VAO_IO_InitStruct->input == FL_ENABLE) + { + FL_VAO_GPIO_EnablePH15Input(VAOx); + } + else + { + FL_VAO_GPIO_DisablePH15Input(VAOx); + } + /*! PH15上拉使能 */ + if(VAO_IO_InitStruct->pullup == FL_ENABLE) + { + FL_VAO_GPIO_EnablePH15Pullup(VAOx); + } + else + { + FL_VAO_GPIO_DisablePH15Pullup(VAOx); + } + /*! PH15开漏输出使能 */ + if(VAO_IO_InitStruct->opendrainOutput == FL_ENABLE) + { + FL_VAO_GPIO_EnablePH15OpenDrain(VAOx); + } + else + { + FL_VAO_GPIO_DisablePH15OpenDrain(VAOx); + } + return FL_PASS; +} + +/** + * @brief 根据 VAO_XTLF_StructInit 的配置信息初始化对应外设入口地址的寄存器值 + * @param VAOx VAOx + * @param VAO_XTLF_StructInit 指向一个 @ref FL_VAO_XTLF_InitTypeDef 结构体 + * 其中包含了外设的相关配置信息. + * @retval ErrorStatus枚举值 + * -FL_FAIL 配置过程发生错误 + * -FL_PASS 配置成功 + */ +FL_ErrorStatus FL_VAO_XTLF_Init(VAO_Type *VAOx, FL_VAO_XTLF_InitTypeDef *VAO_XTLF_InitStruct) +{ + /* 参数检查 */ + assert_param(IS_FL_VAO_INSTANCE(VAOx)); + assert_param(IS_FL_VAO_OUTPUT_DRIVE_ABILITY(VAO_XTLF_InitStruct->driveMode)); + assert_param(IS_FL_VAO_WORKING_CURRENT(VAO_XTLF_InitStruct->workingCurrentMode)); + /*使能CDIF*/ + FL_CDIF_EnableVAOToCPU(CDIF); + FL_CDIF_EnableCPUToVAO(CDIF); + /*! XTLF工作电流选择 */ + FL_VAO_XTLF_SetWorkCurrent(VAOx, VAO_XTLF_InitStruct->workingCurrentMode); + /*! XTLF输出级驱动能力配置 */ + FL_VAO_XTLF_SetDriveLevel(VAOx, VAO_XTLF_InitStruct->driveMode); + return FL_PASS; +} + +/** +* @brief 设置 VAO_IO_StructInit 为默认配置 +* @param VAO_IO_StructInit 指向需要将值设置为默认配置的结构体 @ref FL_VAO_IO_InitTypeDef 结构体 +* +* @retval None +*/ + +void FL_VAO_IO_StructInit(FL_VAO_IO_InitTypeDef *VAO_IO_InitStruct) +{ + VAO_IO_InitStruct->mode = FL_VAO_PH15_MODE_INPUT; + VAO_IO_InitStruct->input = FL_ENABLE; + VAO_IO_InitStruct->pullup = FL_ENABLE; + VAO_IO_InitStruct->opendrainOutput = FL_DISABLE; +} +/** +* @brief 设置 VAO_XTLF_StructInit 为默认配置 +* @param VAO_XTLF_StructInit 指向需要将值设置为默认配置的结构体 @ref FL_VAO_XTLF_InitTypeDef 结构体 +* +* @retval None +*/ + +void FL_VAO_XTLF_StructInit(FL_VAO_XTLF_InitTypeDef *VAO_XTLF_InitStruct) +{ + VAO_XTLF_InitStruct->driveMode = FL_VAO_XTLF_DRIVE_LEVEL_1; + VAO_XTLF_InitStruct->workingCurrentMode = FL_VAO_XTLF_WORK_CURRENT_450NA; +} + +/** + * @} + */ + +#endif /* FL_VAO_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_vrefp.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_vrefp.c new file mode 100644 index 0000000..9c77c2b --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_vrefp.c @@ -0,0 +1,167 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_vrefp.c + * @author FMSH Application Team + * @brief Src file of VREFP FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup VREFP + * @{ + */ + + +#ifdef FL_VREFP_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup VREFP_FL_Private_Macros + * @{ + */ +#define IS_VREFP_INSTANCE(INTANCE) ((INTANCE) == VREFP) + +#define IS_FL_VREFP_VOLTAGETRIM(__VALUE__) (((__VALUE__) == FL_VREFP_OUTPUT_VOLTAGE_2P0V_TRIM)||\ + ((__VALUE__) == FL_VREFP_OUTPUT_VOLTAGE_2P5V_TRIM)||\ + ((__VALUE__) == FL_VREFP_OUTPUT_VOLTAGE_3P0V_TRIM)||\ + ((__VALUE__) == FL_VREFP_OUTPUT_VOLTAGE_4P5V_TRIM)||\ + ((__VALUE__) == FL_VREFP_OUTPUT_VOLTAGE_1P5V_TRIM)) + +#define IS_FL_VREFP_OUTPUTVOLTAGE(__VALUE__) (((__VALUE__) == FL_VREFP_OUTPUT_VOLTAGE_2P0V)||\ + ((__VALUE__) == FL_VREFP_OUTPUT_VOLTAGE_2P5V)||\ + ((__VALUE__) == FL_VREFP_OUTPUT_VOLTAGE_3P0V)||\ + ((__VALUE__) == FL_VREFP_OUTPUT_VOLTAGE_4P5V)||\ + ((__VALUE__) == FL_VREFP_OUTPUT_VOLTAGE_1P5V)) + +#define IS_FL_VREFP_ENABLEPERIOD(__VALUE__) (((__VALUE__) == FL_VREFP_ENABLE_PERIOD_1MS)||\ + ((__VALUE__) == FL_VREFP_ENABLE_PERIOD_4MS)||\ + ((__VALUE__) == FL_VREFP_ENABLE_PERIOD_16MS)||\ + ((__VALUE__) == FL_VREFP_ENABLE_PERIOD_32MS)||\ + ((__VALUE__) == FL_VREFP_ENABLE_PERIOD_64MS)||\ + ((__VALUE__) == FL_VREFP_ENABLE_PERIOD_256MS)||\ + ((__VALUE__) == FL_VREFP_ENABLE_PERIOD_1000MS)||\ + ((__VALUE__) == FL_VREFP_ENABLE_PERIOD_4000MS)) + +#define IS_FL_VREFP_DRIVINGTIME(__VALUE__) (((__VALUE__) == FL_VREFP_DRIVING_TIME_4LSCLK)||\ + ((__VALUE__) == FL_VREFP_DRIVING_TIME_8LSCLK)||\ + ((__VALUE__) == FL_VREFP_DRIVING_TIME_16LSCLK)||\ + ((__VALUE__) == FL_VREFP_DRIVING_TIME_32LSCLK)||\ + ((__VALUE__) == FL_VREFP_DRIVING_TIME_64LSCLK)||\ + ((__VALUE__) == FL_VREFP_DRIVING_TIME_128LSCLK)||\ + ((__VALUE__) == FL_VREFP_DRIVING_TIME_256LSCLK)||\ + ((__VALUE__) == FL_VREFP_DRIVING_TIME_512LSCLK)) + +#define IS_FL_VREFP_WORKMODE(__VALUE__) (((__VALUE__) == FL_VREFP_WORK_MODE_CONTINUOUS)||\ + ((__VALUE__) == FL_VREFP_WORK_MODE_PERIODIC)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup VREFP_FL_EF_Init + * @{ + */ + +/** + * @brief 关闭VREFP外设总线时钟 + * + * @param VREFPx 外设入口地址 + * + * @retval ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_VREFP_DeInit(VREFP_Type *VREFPx) +{ + assert_param(IS_VREFP_INSTANCE(VREFPx)); + return FL_PASS; +} +/** + * @brief 根据 VREFP_InitStruct初始化对应外设入口地址的寄存器值. + * + * @note WWTD使能后将无法关闭,直到下一次芯片复位 + * + * @param VREFPx 外设入口地址 + * + * @param VREFP_InitStruct 指向 @ref FL_VREFP_InitTypeDef 结构体的指针 + * + * @retval ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_VREFP_Init(VREFP_Type *VREFPx, FL_VREFP_InitTypeDef *VREFP_InitStruct) +{ + FL_ErrorStatus status = FL_PASS; + /* 入口参数检查 */ + assert_param(IS_VREFP_INSTANCE(VREFPx)); + assert_param(IS_FL_VREFP_VOLTAGETRIM(VREFP_InitStruct->voltageTrim)); + assert_param(IS_FL_VREFP_OUTPUTVOLTAGE(VREFP_InitStruct->outputVoltage)); + assert_param(IS_FL_VREFP_ENABLEPERIOD(VREFP_InitStruct->timeOfPeriod)); + assert_param(IS_FL_VREFP_DRIVINGTIME(VREFP_InitStruct->timeOfDriving)); + assert_param(IS_FL_VREFP_WORKMODE(VREFP_InitStruct->mode)); + /* 开启总线时钟 */ + FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_PMU); + /* 配置VREFP输出电压TRIM值 */ + FL_VREFP_WriteOutputVoltageTrim(VREFPx, VREFP_InitStruct->voltageTrim); + /* 配置VREFP输出电压 */ + FL_VREFP_SetOutputVoltage(VREFPx, VREFP_InitStruct->outputVoltage); + /* 配置输出模式 */ + FL_VREFP_SetWorkMode(VREFPx, VREFP_InitStruct->mode); + /* 间歇模式下使能周期 */ + FL_VREFP_SetEnablePeriod(VREFPx, VREFP_InitStruct->timeOfPeriod); + /* 间歇模式下单次驱动时间 */ + FL_VREFP_SetDrivingTime(VREFPx, VREFP_InitStruct->timeOfDriving); + /* 启动VREFP */ + FL_VREFP_Enable(VREFPx); + return status; +} +/** + * @brief 设置 VREFP_InitStruct 为默认配置 + * + * @param VREFP_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_VREFP_InitTypeDef 结构体 + * + * @retval None + */ +void FL_VREFP_StructInit(FL_VREFP_InitTypeDef *VREFP_InitStruct) +{ + VREFP_InitStruct->voltageTrim = FL_VREFP_OUTPUT_VOLTAGE_3P0V_TRIM; + VREFP_InitStruct->outputVoltage = FL_VREFP_OUTPUT_VOLTAGE_3P0V; + VREFP_InitStruct->mode = FL_VREFP_WORK_MODE_CONTINUOUS; + VREFP_InitStruct->timeOfPeriod = FL_VREFP_ENABLE_PERIOD_1MS; + VREFP_InitStruct->timeOfDriving = FL_VREFP_DRIVING_TIME_4LSCLK; +} + +/** + * @} + */ + +#endif /* FL_VREFP_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ + diff --git a/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_wwdt.c b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_wwdt.c new file mode 100644 index 0000000..1272a12 --- /dev/null +++ b/LIN Slave/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_wwdt.c @@ -0,0 +1,128 @@ +/** + **************************************************************************************************** + * @file fm33lg0xx_fl_wwdt.c + * @author FMSH Application Team + * @brief Src file of WWDT FL Module + **************************************************************************************************** + * @attention + * + * Copyright (c) [2021] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + * + **************************************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "fm33lg0xx_fl.h" + +/** @addtogroup FM33LG0XX_FL_Driver + * @{ + */ + +/** @addtogroup WWDT + * @{ + */ + + +#ifdef FL_WWDT_DRIVER_ENABLED + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup WWDT_FL_Private_Macros + * @{ + */ +#define IS_WWDT_INSTANCE(INTANCE) ((INTANCE) == WWDT) + +#define IS_FL_WWDT_OVERFLOWPERIOD(__VALUE__) (((__VALUE__) == FL_WWDT_PERIOD_1CNT)||\ + ((__VALUE__) == FL_WWDT_PERIOD_4CNT)||\ + ((__VALUE__) == FL_WWDT_PERIOD_16CNT)||\ + ((__VALUE__) == FL_WWDT_PERIOD_64CNT)||\ + ((__VALUE__) == FL_WWDT_PERIOD_128CNT)||\ + ((__VALUE__) == FL_WWDT_PERIOD_256CNT)||\ + ((__VALUE__) == FL_WWDT_PERIOD_512CNT)||\ + ((__VALUE__) == FL_WWDT_PERIOD_1024CNT)) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup WWDT_FL_EF_Init + * @{ + */ + +/** + * @brief 关闭WWDT外设总线时钟 + * + * @note WWDT开启不能再关闭,直到下一次复位。低功耗休眠模式下 WWDT 停止运行 + * + * @param WWDTx 外设入口地址 + * + * @retval FL_ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_WWDT_DeInit(WWDT_Type *WWDTx) +{ + assert_param(IS_WWDT_INSTANCE(WWDTx)); + return FL_PASS; +} +/** + * @brief 根据 WWDT_InitStruct初始化对应外设入口地址的寄存器值. + * + * @note WWTD使能后将无法关闭,直到下一次芯片复位 + * + * @param WWDTx 外设入口地址 + * + * @param WWDT_InitStruct 指向 @ref FL_WWDT_InitTypeDef 结构体的指针 + * + * @retval FL_ErrorStatus枚举值 + * -FL_PASS 配置成功 + * -FL_FAIL 配置过程发生错误 + */ +FL_ErrorStatus FL_WWDT_Init(WWDT_Type *WWDTx, FL_WWDT_InitTypeDef *WWDT_InitStruct) +{ + FL_ErrorStatus status = FL_PASS; + /* 入口参数检查 */ + assert_param(IS_WWDT_INSTANCE(WWDTx)); + assert_param(IS_FL_WWDT_OVERFLOWPERIOD(WWDT_InitStruct->overflowPeriod)); + /* 开启总线时钟 */ + FL_CMU_EnableGroup2BusClock(FL_CMU_GROUP2_BUSCLK_WWDT); + /* 配置独立看门狗溢出周期 */ + FL_WWDT_SetPeriod(WWDTx, WWDT_InitStruct->overflowPeriod); + /* 启动看门狗 */ + FL_WWDT_Enable(WWDTx); + return status; +} +/** + * @brief 设置 WWDT_InitStruct 为默认配置 + * + * @param WWDT_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_WWDT_InitTypeDef 结构体 + * + * @retval None + */ +void FL_WWDT_StructInit(FL_WWDT_InitTypeDef *WWDT_InitStruct) +{ + /* 默认最长溢出周期 */ + WWDT_InitStruct->overflowPeriod = FL_WWDT_PERIOD_1024CNT; +} + +/** + * @} + */ + +#endif /* FL_WWDT_DRIVER_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/ diff --git a/LIN Slave/EWARM/Backup of Example.ewd b/LIN Slave/EWARM/Backup of Example.ewd new file mode 100644 index 0000000..36fbb07 --- /dev/null +++ b/LIN Slave/EWARM/Backup of Example.ewd @@ -0,0 +1,1374 @@ + + + + 2 + + Example + + ARM + + 1 + + C-SPY + 2 + + 26 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + CMSISDAP_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 1 + 1 + 1 + + + + + + + + + IJET_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + MACRAIGOR_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + PEMICRO_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + STLINK_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + XDS100_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\middleware\HCCWare\HCCWare.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\AVIX\AVIX.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\MQX\MQXRtosPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Quadros\Quadros_EWB7_Plugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + + diff --git a/LIN Slave/EWARM/Backup of Example.ewp b/LIN Slave/EWARM/Backup of Example.ewp new file mode 100644 index 0000000..608ed81 --- /dev/null +++ b/LIN Slave/EWARM/Backup of Example.ewp @@ -0,0 +1,1095 @@ + + + + 2 + + Example + + ARM + + 1 + + General + 3 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Application + + IAR + + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Source\Templates\iar\startup_fm33lg0xx.s + + + + MF-config + + $PROJ_DIR$\..\MF-config\Src\mf_config.c + + + + User + + $PROJ_DIR$\..\Src\lin.c + + + $PROJ_DIR$\..\Src\main.c + + + $PROJ_DIR$\..\Src\sleep.c + + + $PROJ_DIR$\..\Src\uart.c + + + $PROJ_DIR$\..\Src\user_init.c + + + + + Drivers + + CMSIS + + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Source\system_fm33lg0xx.c + + + + FM33LG0xx_FL_Driver + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_adc.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_aes.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_atim.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_bstim16.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_bstim32.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_can.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_cmu.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_comp.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_crc.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_dac.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_divas.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_dma.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_exti.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_flash.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_gpio.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_gptim.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_i2c.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_iwdt.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lcd.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lptim16.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lptim32.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lpuart.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_pmu.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_rng.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_rtca.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_spi.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_svd.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_uart.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_vao.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_vrefp.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_wwdt.c + + + + + + diff --git a/LIN Slave/EWARM/Backup of Example.ewt b/LIN Slave/EWARM/Backup of Example.ewt new file mode 100644 index 0000000..db19398 --- /dev/null +++ b/LIN Slave/EWARM/Backup of Example.ewt @@ -0,0 +1,1196 @@ + + + + 2 + + Example + + ARM + + 1 + + C-STAT + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Application + + IAR + + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Source\Templates\iar\startup_fm33lg0xx.s + + + + MF-config + + $PROJ_DIR$\..\MF-config\Src\mf_config.c + + + + User + + $PROJ_DIR$\..\Src\lin.c + + + $PROJ_DIR$\..\Src\main.c + + + $PROJ_DIR$\..\Src\sleep.c + + + $PROJ_DIR$\..\Src\uart.c + + + $PROJ_DIR$\..\Src\user_init.c + + + + + Drivers + + CMSIS + + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Source\system_fm33lg0xx.c + + + + FM33LG0xx_FL_Driver + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_adc.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_aes.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_atim.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_bstim16.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_bstim32.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_can.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_cmu.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_comp.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_crc.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_dac.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_divas.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_dma.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_exti.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_flash.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_gpio.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_gptim.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_i2c.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_iwdt.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lcd.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lptim16.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lptim32.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lpuart.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_pmu.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_rng.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_rtca.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_spi.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_svd.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_uart.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_vao.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_vrefp.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_wwdt.c + + + + + + diff --git a/LIN Slave/EWARM/Example.dep b/LIN Slave/EWARM/Example.dep new file mode 100644 index 0000000..557d854 --- /dev/null +++ b/LIN Slave/EWARM/Example.dep @@ -0,0 +1,1142 @@ + + + + 2 + 613699902 + + Example + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_rtca.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_pmu.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_rng.c + $TOOLKIT_DIR$\inc\c\DLib_Config_Full.h + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Include\fm33lg0xx.h + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_lcd.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_iwdt.pbi + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Include\core_cmInstr.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_aes.h + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_gpio.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_exti.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_i2c.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_comp.pbi + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_atim.h + $TOOLKIT_DIR$\inc\c\cmsis_iar.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_dac.pbi + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_crc.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_flash.pbi + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33_assert.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_adc.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_dma.pbi + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl.h + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_def.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_exti.h + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_gptim.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_divas.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_lptim16.pbi + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $TOOLKIT_DIR$\inc\c\stdint.h + $PROJ_DIR$\Example\Obj\main.pbi + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_crc.h + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_wwdt.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_vrefp.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_rng.pbi + $PROJ_DIR$\Example\Exe\Example.hex + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_lpuart.pbi + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_can.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_cmu.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_dac.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_cdif.h + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_rtca.pbi + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_conf.h + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_svd.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_uart.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_rtca.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_vrefp.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_lptim32.pbi + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_bstim16.h + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_wwdt.o + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_comp.h + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_vao.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_spi.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_pmu.pbi + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_bstim32.h + $PROJ_DIR$\Example\Obj\Example.pbd + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_adc.pbi + $TOOLKIT_DIR$\inc\c\stdio.h + $PROJ_DIR$\..\Inc\main.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Include\core_cmFunc.h + $TOOLKIT_DIR$\config\linker\FMSH\FM33LG04x.icf + $TOOLKIT_DIR$\lib\shb_l.a + $TOOLKIT_DIR$\lib\dl6M_tlf.a + $PROJ_DIR$\..\Inc\lin.h + $PROJ_DIR$\..\Inc\uart.h + $TOOLKIT_DIR$\lib\rt6M_tl.a + $TOOLKIT_DIR$\inc\c\ystdio.h + $PROJ_DIR$\Example\List\Example.map + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\..\Inc\sleep.h + $TOOLKIT_DIR$\lib\m6M_tl.a + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\..\Inc\user_init.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_iwdt.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_svd.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_lptim32.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_vao.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_rtca.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_uart.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_wwdt.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_lptim16.h + $TOOLKIT_DIR$\inc\c\stdbool.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_spi.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_flash.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_rng.h + $TOOLKIT_DIR$\inc\c\stddef.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_lcd.h + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Include\system_fm33lg0xx.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_i2c.h + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Include\core_cm0plus.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_lpuart.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_pmu.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_vref.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_gpio.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_gptim.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_vrefp.h + $PROJ_DIR$\..\MF-config\Inc\mf_config.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_rmu.h + $PROJ_DIR$\..\Src\main.c + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Source\system_fm33lg0xx.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_divas.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_adc.c + $PROJ_DIR$\..\Src\sleep.c + $PROJ_DIR$\..\MF-config\Src\mf_config.c + $PROJ_DIR$\..\Src\lin.c + $PROJ_DIR$\..\Src\uart.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_atim.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_can.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_flash.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_gptim.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_comp.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_bstim16.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_bstim32.c + $PROJ_DIR$\..\Src\user_init.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_cmu.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_crc.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_dac.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_dma.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_gpio.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_aes.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_iwdt.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_i2c.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lcd.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lptim16.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lptim32.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_exti.c + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Source\Templates\iar\startup_fm33lg0xx.s + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lpuart.c + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_rng.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_flash.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_lcd.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_uart.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_comp.o + $PROJ_DIR$\Example\Obj\startup_fm33lg0xx.o + $PROJ_DIR$\Example\Obj\lin.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_lptim32.o + $PROJ_DIR$\Example\Obj\lin.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_aes.pbi + $PROJ_DIR$\Example\Obj\uart.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_cmu.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_lptim16.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_aes.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_crc.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_svd.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_vao.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl.pbi + $PROJ_DIR$\Example\Obj\user_init.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_iwdt.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_bstim32.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_dma.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_spi.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_lpuart.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_gptim.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_gpio.o + $PROJ_DIR$\Example\Obj\user_init.o + $PROJ_DIR$\Example\Obj\sleep.pbi + $PROJ_DIR$\Example\Obj\system_fm33lg0xx.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_adc.o + $PROJ_DIR$\Example\Obj\uart.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_pmu.o + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_dma.h + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_bstim32.pbi + $PROJ_DIR$\Example\Obj\main.o + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_svd.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_spi.c + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_atim.pbi + $PROJ_DIR$\Example\Obj\sleep.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_atim.o + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_vrefp.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Inc\fm33lg0xx_fl_divas.h + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_uart.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_vao.c + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_wwdt.c + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_can.pbi + $PROJ_DIR$\Example\Exe\Example.out + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_bstim16.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_dac.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_i2c.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_divas.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_cmu.pbi + $PROJ_DIR$\Example\Obj\system_fm33lg0xx.o + $PROJ_DIR$\Example\Obj\mf_config.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_bstim16.pbi + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_exti.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl.o + $PROJ_DIR$\Example\Obj\fm33lg0xx_fl_can.o + $PROJ_DIR$\Example\Obj\mf_config.pbi + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_rtca.c + + + BICOMP + 46 + + + ICCARM + 50 + + + + + BICOMP + 27 4 47 88 3 15 92 26 33 18 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 21 34 96 94 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_pmu.c + + + BICOMP + 58 + + + ICCARM + 167 + + + + + BICOMP + 27 4 47 88 3 15 92 26 33 18 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 21 34 96 94 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_rng.c + + + BICOMP + 39 + + + ICCARM + 136 + + + + + BICOMP + 27 18 7 32 33 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + [ROOT_NODE] + + + ILINK + 182 73 + + + + + $PROJ_DIR$\..\Src\main.c + + + BICOMP + 35 + + + ICCARM + 170 + + + + + BICOMP + 47 32 33 26 21 64 18 3 27 69 62 25 8 16 34 7 63 70 78 77 103 80 72 74 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 4 92 88 96 94 65 15 23 75 + + + ICCARM + 63 34 18 32 80 3 8 26 33 62 16 72 77 64 74 103 25 47 22 27 4 96 7 15 23 65 94 21 92 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 70 69 78 75 + + + + + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Source\system_fm33lg0xx.c + + + BICOMP + 164 + + + ICCARM + 188 + + + + + BICOMP + 34 80 18 7 94 4 32 26 33 3 8 96 65 15 23 + + + ICCARM + 94 34 18 32 80 3 8 26 33 4 96 7 15 23 65 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_divas.c + + + BICOMP + 30 + + + ICCARM + 186 + + + + + BICOMP + 32 7 33 27 18 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_adc.c + + + BICOMP + 61 + + + ICCARM + 165 + + + + + BICOMP + 27 18 7 32 33 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Src\sleep.c + + + BICOMP + 163 + + + ICCARM + 174 + + + + + BICOMP + 82 16 42 27 77 28 85 65 18 9 36 95 91 86 4 75 80 72 32 53 43 177 100 93 98 89 99 88 96 15 70 34 103 74 22 14 59 45 55 44 168 90 101 79 87 97 104 84 81 83 102 92 94 23 63 78 69 62 64 25 21 26 33 3 8 47 7 + + + ICCARM + 63 34 18 32 80 3 8 26 33 62 16 72 77 64 74 103 25 47 22 27 4 96 7 15 23 65 94 21 92 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 78 70 69 75 + + + + + $PROJ_DIR$\..\MF-config\Src\mf_config.c + + + BICOMP + 194 + + + ICCARM + 189 + + + + + BICOMP + 15 26 27 4 16 47 21 8 32 34 7 33 3 23 18 25 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 103 + + + ICCARM + 103 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Src\lin.c + + + BICOMP + 144 + + + ICCARM + 142 + + + + + BICOMP + 64 18 27 32 33 26 47 21 3 69 62 25 8 16 34 7 78 70 77 103 80 72 74 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 4 92 88 96 94 65 15 23 63 + + + ICCARM + 63 34 18 32 80 3 8 26 33 62 16 72 77 64 74 103 25 47 22 27 4 96 7 15 23 65 94 21 92 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 78 69 70 + + + + + $PROJ_DIR$\..\Src\uart.c + + + BICOMP + 146 + + + ICCARM + 166 + + + + + BICOMP + 82 16 42 77 28 85 65 27 18 9 36 95 91 86 4 80 72 32 53 43 177 100 93 98 89 99 88 96 15 63 69 34 103 74 22 14 59 45 55 44 168 90 101 79 87 97 104 84 81 83 102 92 94 23 70 78 62 64 25 21 26 33 3 8 47 7 + + + ICCARM + 63 34 18 32 80 3 8 26 33 62 16 72 77 64 74 103 25 47 22 27 4 96 7 15 23 65 94 21 92 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 70 69 78 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_atim.c + + + BICOMP + 173 + + + ICCARM + 175 + + + + + BICOMP + 4 27 47 88 3 15 25 92 26 33 18 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 21 34 96 94 7 32 8 16 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_can.c + + + BICOMP + 181 + + + ICCARM + 193 + + + + + BICOMP + 22 27 102 101 94 55 104 59 168 87 81 18 14 45 44 90 79 97 84 83 92 80 9 53 42 43 36 177 28 100 95 93 82 98 91 89 85 99 86 4 88 96 65 34 32 47 21 7 26 33 3 8 15 23 16 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_flash.c + + + BICOMP + 20 + + + ICCARM + 137 + + + + + BICOMP + 27 18 7 32 33 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_gptim.c + + + BICOMP + 29 + + + ICCARM + 160 + + + + + BICOMP + 27 18 7 32 33 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_comp.c + + + BICOMP + 13 + + + ICCARM + 140 + + + + + BICOMP + 27 18 7 32 33 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_bstim16.c + + + BICOMP + 190 + + + ICCARM + 183 + + + + + BICOMP + 34 36 91 9 95 86 42 28 82 85 27 53 43 177 100 93 98 89 99 94 3 15 22 14 59 45 55 44 168 90 101 79 87 97 104 84 81 83 102 21 96 26 33 18 47 4 92 88 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl.c + + + BICOMP + 153 + + + ICCARM + 192 + + + + + BICOMP + 32 7 33 27 18 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_bstim32.c + + + BICOMP + 169 + + + ICCARM + 156 + + + + + BICOMP + 88 47 27 4 3 15 92 26 33 18 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 21 34 96 94 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Src\user_init.c + + + BICOMP + 154 + + + ICCARM + 162 + + + + + BICOMP + 77 28 65 85 63 16 42 82 27 18 9 36 95 91 86 4 80 72 32 53 43 177 100 93 98 89 99 88 96 15 69 34 103 74 22 14 59 45 55 44 168 90 101 79 87 97 104 84 81 83 102 92 94 23 70 62 64 25 21 26 33 3 8 47 7 78 + + + ICCARM + 78 63 34 18 32 80 3 8 26 33 62 16 72 77 64 74 103 25 47 22 27 4 96 7 15 23 65 94 21 92 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 70 69 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_cmu.c + + + BICOMP + 187 + + + ICCARM + 147 + + + + + BICOMP + 32 7 33 27 18 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_crc.c + + + BICOMP + 19 + + + ICCARM + 150 + + + + + BICOMP + 92 27 3 15 47 4 88 26 33 18 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 21 34 96 94 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_dac.c + + + BICOMP + 17 + + + ICCARM + 184 + + + + + BICOMP + 27 92 3 15 47 4 88 26 33 18 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 21 34 96 94 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_dma.c + + + BICOMP + 24 + + + ICCARM + 157 + + + + + BICOMP + 34 36 91 9 95 86 42 28 82 85 27 53 43 177 100 93 98 89 99 94 3 15 22 14 59 45 55 44 168 90 101 79 87 97 104 84 81 83 102 21 96 26 33 18 47 4 92 88 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_gpio.c + + + BICOMP + 10 + + + ICCARM + 161 + + + + + BICOMP + 90 27 83 45 97 14 44 79 84 96 22 59 55 168 101 87 104 81 102 21 3 15 9 53 42 43 36 177 28 100 95 93 82 98 91 89 85 99 86 34 94 26 33 18 25 47 4 92 88 7 32 8 16 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_aes.c + + + BICOMP + 145 + + + ICCARM + 149 + + + + + BICOMP + 47 88 27 4 3 15 92 26 33 18 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 21 34 96 94 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_iwdt.c + + + BICOMP + 6 + + + ICCARM + 155 + + + + + BICOMP + 32 7 33 27 18 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_i2c.c + + + BICOMP + 12 + + + ICCARM + 185 + + + + + BICOMP + 27 92 3 15 47 4 88 26 33 18 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 21 34 96 94 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lcd.c + + + BICOMP + 5 + + + ICCARM + 138 + + + + + BICOMP + 27 18 7 32 33 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lptim16.c + + + BICOMP + 31 + + + ICCARM + 148 + + + + + BICOMP + 27 18 7 32 33 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lptim32.c + + + BICOMP + 52 + + + ICCARM + 143 + + + + + BICOMP + 27 18 7 32 33 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_exti.c + + + BICOMP + 11 + + + ICCARM + 191 + + + + + BICOMP + 97 45 27 90 83 14 44 79 84 96 22 59 55 168 101 87 104 81 102 21 3 15 9 53 42 43 36 177 28 100 95 93 82 98 91 89 85 99 86 34 94 26 33 18 47 4 92 88 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Source\Templates\iar\startup_fm33lg0xx.s + + + AARM + 141 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lpuart.c + + + BICOMP + 41 + + + ICCARM + 159 + + + + + BICOMP + 88 47 27 4 3 15 92 26 33 18 25 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 21 34 96 94 7 32 8 16 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_svd.c + + + BICOMP + 48 + + + ICCARM + 151 + + + + + BICOMP + 27 4 47 88 3 15 92 26 33 18 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 21 34 96 94 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_spi.c + + + BICOMP + 57 + + + ICCARM + 158 + + + + + BICOMP + 91 36 34 9 95 86 42 28 82 85 27 53 43 177 100 93 98 89 99 94 3 15 22 14 59 45 55 44 168 90 101 79 87 97 104 84 81 83 102 21 96 26 33 18 47 4 92 88 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_vrefp.c + + + BICOMP + 38 + + + ICCARM + 51 + + + + + BICOMP + 92 27 3 15 47 4 88 26 33 18 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 21 34 96 94 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_uart.c + + + BICOMP + 49 + + + ICCARM + 139 + + + + + BICOMP + 27 4 25 47 88 3 15 92 26 33 18 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 21 34 7 32 8 16 96 94 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_vao.c + + + BICOMP + 56 + + + ICCARM + 152 + + + + + BICOMP + 43 98 100 99 53 177 93 89 94 27 9 42 36 28 95 82 91 85 86 34 3 15 22 14 59 45 55 44 168 90 101 79 87 97 104 84 81 83 102 21 96 26 33 18 47 4 92 88 7 32 8 16 25 65 80 23 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_wwdt.c + + + BICOMP + 37 + + + ICCARM + 54 + + + + + BICOMP + 32 7 33 27 18 15 34 3 23 47 21 26 8 4 16 22 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 92 88 96 94 65 80 25 + + + ICCARM + 25 47 22 27 4 96 34 18 32 80 3 8 26 33 7 15 23 65 94 21 92 16 88 9 14 53 59 42 45 43 55 36 44 177 168 28 90 100 101 95 79 93 87 82 97 98 104 91 84 89 81 85 83 99 102 86 + + + + + $PROJ_DIR$\Example\Exe\Example.out + + + ILINK + 73 + + + OBJCOPY + 40 + + + + + ILINK + 66 192 165 149 175 183 156 193 147 140 150 184 186 157 191 137 161 160 185 155 138 148 143 159 167 136 50 158 151 139 152 51 54 142 170 189 174 141 188 166 162 67 71 76 68 + + + + + + + diff --git a/LIN Slave/EWARM/Example.ewd b/LIN Slave/EWARM/Example.ewd new file mode 100644 index 0000000..c1e0fa1 --- /dev/null +++ b/LIN Slave/EWARM/Example.ewd @@ -0,0 +1,1615 @@ + + + 4 + + Example + + ARM + + 1 + + C-SPY + 2 + + 33 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + E2_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm9a.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/LIN Slave/EWARM/Example.ewp b/LIN Slave/EWARM/Example.ewp new file mode 100644 index 0000000..626a1c6 --- /dev/null +++ b/LIN Slave/EWARM/Example.ewp @@ -0,0 +1,1234 @@ + + + 4 + + Example + + ARM + + 1 + + General + 3 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 38 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 12 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + ILINK + 0 + + 27 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BUILDACTION + 2 + + + + + Application + + IAR + + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Source\Templates\iar\startup_fm33lg0xx.s + + + + MF-config + + $PROJ_DIR$\..\MF-config\Src\mf_config.c + + + + User + + $PROJ_DIR$\..\Src\lin.c + + + $PROJ_DIR$\..\Src\main.c + + + $PROJ_DIR$\..\Src\sleep.c + + + $PROJ_DIR$\..\Src\uart.c + + + $PROJ_DIR$\..\Src\user_init.c + + + + + Drivers + + CMSIS + + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Source\system_fm33lg0xx.c + + + + FM33LG0xx_FL_Driver + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_adc.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_aes.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_atim.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_bstim16.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_bstim32.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_can.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_cmu.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_comp.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_crc.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_dac.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_divas.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_dma.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_exti.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_flash.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_gpio.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_gptim.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_i2c.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_iwdt.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lcd.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lptim16.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lptim32.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lpuart.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_pmu.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_rng.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_rtca.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_spi.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_svd.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_uart.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_vao.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_vrefp.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_wwdt.c + + + + diff --git a/LIN Slave/EWARM/Example.ewt b/LIN Slave/EWARM/Example.ewt new file mode 100644 index 0000000..20ad5a7 --- /dev/null +++ b/LIN Slave/EWARM/Example.ewt @@ -0,0 +1,1570 @@ + + + 4 + + Example + + ARM + + 1 + + C-STAT + 517 + + 517 + + 0 + + 1 + 600 + 1 + 4 + 0 + 1 + 100 + Example/C-STAT + + + 2.5.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Application + + IAR + + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Source\Templates\iar\startup_fm33lg0xx.s + + + + MF-config + + $PROJ_DIR$\..\MF-config\Src\mf_config.c + + + + User + + $PROJ_DIR$\..\Src\lin.c + + + $PROJ_DIR$\..\Src\main.c + + + $PROJ_DIR$\..\Src\sleep.c + + + $PROJ_DIR$\..\Src\uart.c + + + $PROJ_DIR$\..\Src\user_init.c + + + + + Drivers + + CMSIS + + $PROJ_DIR$\..\Drivers\CMSIS\Device\FM\FM33xx\Source\system_fm33lg0xx.c + + + + FM33LG0xx_FL_Driver + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_adc.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_aes.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_atim.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_bstim16.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_bstim32.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_can.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_cmu.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_comp.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_crc.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_dac.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_divas.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_dma.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_exti.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_flash.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_gpio.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_gptim.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_i2c.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_iwdt.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lcd.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lptim16.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lptim32.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_lpuart.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_pmu.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_rng.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_rtca.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_spi.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_svd.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_uart.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_vao.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_vrefp.c + + + $PROJ_DIR$\..\Drivers\FM33LG0xx_FL_Driver\Src\fm33lg0xx_fl_wwdt.c + + + + diff --git a/LIN Slave/EWARM/Project.eww b/LIN Slave/EWARM/Project.eww new file mode 100644 index 0000000..119dcef --- /dev/null +++ b/LIN Slave/EWARM/Project.eww @@ -0,0 +1,7 @@ + + + + $WS_DIR$\Example.ewp + + + \ No newline at end of file diff --git a/LIN Slave/EWARM/settings/Example.Example.cspy.bat b/LIN Slave/EWARM/settings/Example.Example.cspy.bat new file mode 100644 index 0000000..575a320 --- /dev/null +++ b/LIN Slave/EWARM/settings/Example.Example.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"E:\Program Files\IAR Systems\Embedded Workbench 9.2\common\bin\cspybat" -f "F:\FCB_project\RP-01\anmo\code\LIN Slave\EWARM\settings\Example.Example.general.xcl" --backend -f "F:\FCB_project\RP-01\anmo\code\LIN Slave\EWARM\settings\Example.Example.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"E:\Program Files\IAR Systems\Embedded Workbench 9.2\common\bin\cspybat" -f "F:\FCB_project\RP-01\anmo\code\LIN Slave\EWARM\settings\Example.Example.general.xcl" "--debug_file=%~1" --backend -f "F:\FCB_project\RP-01\anmo\code\LIN Slave\EWARM\settings\Example.Example.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/LIN Slave/EWARM/settings/Example.Example.cspy.ps1 b/LIN Slave/EWARM/settings/Example.Example.cspy.ps1 new file mode 100644 index 0000000..cda50f5 --- /dev/null +++ b/LIN Slave/EWARM/settings/Example.Example.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "E:\Program Files\IAR Systems\Embedded Workbench 9.2\common\bin\cspybat" -f "F:\FCB_project\RP-01\anmo\code\LIN Slave\EWARM\settings\Example.Example.general.xcl" --backend -f "F:\FCB_project\RP-01\anmo\code\LIN Slave\EWARM\settings\Example.Example.driver.xcl" +} +else +{ +& "E:\Program Files\IAR Systems\Embedded Workbench 9.2\common\bin\cspybat" -f "F:\FCB_project\RP-01\anmo\code\LIN Slave\EWARM\settings\Example.Example.general.xcl" --debug_file=$debugfile --backend -f "F:\FCB_project\RP-01\anmo\code\LIN Slave\EWARM\settings\Example.Example.driver.xcl" +} diff --git a/LIN Slave/EWARM/settings/Example.Example.driver.xcl b/LIN Slave/EWARM/settings/Example.Example.driver.xcl new file mode 100644 index 0000000..ebe642a --- /dev/null +++ b/LIN Slave/EWARM/settings/Example.Example.driver.xcl @@ -0,0 +1,29 @@ +"--endian=little" + +"--cpu=SC000" + +"--fpu=None" + +"-p" + +"E:\Program Files\IAR Systems\Embedded Workbench 9.2\arm\config\debugger\FMSH\FM33LG02x.ddf" + +"--semihosting" + +"--device=FM33LG02x" + +"--drv_communication=USB0" + +"--drv_interface_speed=auto" + +"--jlink_initial_speed=10000" + +"--jlink_reset_strategy=0,2" + +"--drv_interface=SWD" + +"--drv_catch_exceptions=0x000" + + + + diff --git a/LIN Slave/EWARM/settings/Example.Example.general.xcl b/LIN Slave/EWARM/settings/Example.Example.general.xcl new file mode 100644 index 0000000..202e334 --- /dev/null +++ b/LIN Slave/EWARM/settings/Example.Example.general.xcl @@ -0,0 +1,13 @@ +"E:\Program Files\IAR Systems\Embedded Workbench 9.2\arm\bin\armPROC.dll" + +"E:\Program Files\IAR Systems\Embedded Workbench 9.2\arm\bin\armJLINK.dll" + +"F:\FCB_project\RP-01\anmo\code\LIN Slave\EWARM\Example\Exe\Example.out" + +--plugin="E:\Program Files\IAR Systems\Embedded Workbench 9.2\arm\bin\armbat.dll" + +--flash_loader="E:\Program Files\IAR Systems\Embedded Workbench 9.2\arm\config\flashloader\FMSH\FM33LG02x.board" + + + + diff --git a/LIN Slave/EWARM/settings/Example.crun b/LIN Slave/EWARM/settings/Example.crun new file mode 100644 index 0000000..d71ea55 --- /dev/null +++ b/LIN Slave/EWARM/settings/Example.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/LIN Slave/EWARM/settings/Example.dbgdt b/LIN Slave/EWARM/settings/Example.dbgdt new file mode 100644 index 0000000..9c04742 --- /dev/null +++ b/LIN Slave/EWARM/settings/Example.dbgdt @@ -0,0 +1,930 @@ + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + + + + + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + + Disassembly + _I0 + + + 500 + 20 + + 1 + 1 + + + 14 + 32 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 2B000000080040E1000001000000108600000600000048810000020000000C81000006000000558400000300000000810000010000000E810000150000001186000003000000 + + + 2E000D8400000F84000008840000FFFFFFFF54840000328100001C81000009840000D6840000D7840000D8840000D9840000DA840000DB840000DC840000DD840000DE840000DF840000E0840000E1840000E9840000EA8400002481000040E100000C84000033840000788400001184000012DE000002DE000003DE00000BDE000005DE000006DE000004DE0000259200001E920000249200001D920000778400000784000086840000808C000044D500004881000001000000 + 1900048400004D000000048100009F020000268100003E020000318400005400000020810000CA0100000F810000C201000000900000E70100000C810000BF010000068400004F000000038400004C00000044920000B30100000E8400005100000030840000530000001F810000C90100000E810000C10100001F920000B00100000B8100001E000000D1840000AF010000058400004E000000028400004B00000005810000A0020000108400005200000032840000550000000A840000500000000D81000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000001A030000000600002B030000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 4294967295 + 00000000CB010000000600007C020000 + 00000000B40100000006000065020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34051 + 00000000170000000601000078010000 + FE04000030000000FC05000000030000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 00000000170000000601000078010000 + FE04000030000000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 00000000170000000601000078010000 + FE04000030000000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 00000000170000000601000078010000 + FE04000030000000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 00000000170000000601000078010000 + FE04000030000000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 00000000170000000601000078010000 + FE04000030000000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 00000000170000000601000078010000 + FE04000030000000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34077 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34053 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 34060 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34064 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34065 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34066 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34084 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34087 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34096 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 00000000170000000601000078010000 + 0400000030000000020100004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 00000000170000000601000078010000 + 0400000030000000020100004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 00000000170000000601000078010000 + 0400000030000000020100004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34058 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + 00000000170000000601000078010000 + FE04000030000000FC0500004B020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 00000000170000000601000078010000 + FE04000030000000FC0500004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + 00000000170000000601000078010000 + FA040000320000000006000065020000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34062 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 000000001700000022010000C8000000 + 04000000CC010000FC0500004B020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + 000000001700000022010000C8000000 + 04000000CC010000FC0500004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 000000001700000022010000C8000000 + 04000000CC010000FC0500004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 000000001700000022010000C8000000 + 04000000CC010000FC0500004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34067 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 00000000170000000601000078010000 + FE04000030000000FC0500004B020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 00000000170000000601000078010000 + FE04000030000000FC0500004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 00000000170000000601000078010000 + FE04000030000000FC0500004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 00000000170000000601000078010000 + FE04000030000000FC0500004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 00000000170000000601000078010000 + FE04000030000000FC0500004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 000000001700000022010000C8000000 + 04000000CC010000FC0500004B020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 000000001700000022010000C8000000 + 04000000CC010000FC0500004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 000000001700000022010000C8000000 + 04000000CC010000FC0500004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 000000001700000022010000C8000000 + 04000000CC010000FC0500004B020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34091 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 00000000170000000601000078010000 + 00000000320000000601000065020000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000030000000000000000010000001000000FFFFFFFFFFFFFFFF06010000320000000A01000065020000010000000200001004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001E85000000000000000000000000000000000000010000001E850000010000001E850000000000000080000000000000FFFFFFFFFFFFFFFF00000000B001000000060000B4010000000000000100000004000000010000000000000000000000FFFFFFFF04000000198500001A8500001B8500001C850000FFFF02000B004354616262656450616E65008000000000000000000000CB010000000600007C02000000000000B40100000006000065020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001985000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001A85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001B85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001C85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1985000001000000FFFFFFFF19850000000000000040000000000000FFFFFFFFFFFFFFFFF604000018000000FA04000065020000000000000200000004000000010000000000000000000000FFFFFFFF05000000188500001F85000020850000218500002285000001800040000000000000FA0400002F000000000600007C020000FA040000180000000006000065020000000000004040004605000000FFFEFF124D006100630072006F00200052006500670069007300740072006100740069006F006E00000000001885000001000000FFFFFFFFFFFFFFFFFFFEFF0B52006500670069007300740065007200730020003100000000001F85000001000000FFFFFFFFFFFFFFFFFFFEFF0B52006500670069007300740065007200730020003200000000002085000001000000FFFFFFFFFFFFFFFFFFFEFF0B52006500670069007300740065007200730020003300000000002185000001000000FFFFFFFFFFFFFFFFFFFEFF0B52006500670069007300740065007200730020003400000000002285000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1885000001000000FFFFFFFF18850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000138500000000000000000000000000000000000001000000138500000100000013850000000000000080000000000000FFFFFFFFFFFFFFFF00000000B001000000060000B4010000000000000100000004000000010000000000000000000000FFFFFFFF040000000F8500001485000025850000268500000180008000000000000000000000CB010000000600007C02000000000000B40100000006000065020000000000004080004604000000FFFEFF09530057004F00200054007200610063006500000000000F85000001000000FFFFFFFFFFFFFFFFFFFEFF11460069006E006400200049006E002000530057004F00200054007200610063006500000000001485000001000000FFFFFFFFFFFFFFFFFFFEFF12450054004D002000460075006E006300740069006F006E00200054007200610063006500000000002585000001000000FFFFFFFFFFFFFFFFFFFEFF09450054004D00200054007200610063006500000000002685000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF0F85000001000000FFFFFFFF0F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000040000001000000FFFFFFFFFFFFFFFFF604000032000000FA040000650200000100000002000010040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000040000000000000FFFFFFFFFFFFFFFFF604000018000000FA04000065020000000000000200000004000000010000000000000000000000FFFFFFFF020000000B8500001785000001800040000000000000FA0400002F000000000600007C020000FA040000180000000006000065020000000000004040004602000000FFFEFF0F4400650062007500670067006500720020004D006100630072006F007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF114D006100630072006F00200051007500690063006B006C00610075006E0063006800000000001785000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF0B85000001000000FFFFFFFF0B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000088500000000000000000000000000000000000001000000088500000100000008850000000000000010000000000000FFFFFFFFFFFFFFFF06010000180000000A01000065020000000000000200000004000000010000000000000000000000FFFFFFFF0300000007850000298500002A85000001800010000000000000000000002F000000060100007C02000000000000180000000601000065020000000000004010004603000000FFFEFF0A430061006C006C00200053007400610063006B00000000000785000001000000FFFFFFFFFFFFFFFFFFFEFF0753007400610063006B0020003100000000002985000001000000FFFFFFFFFFFFFFFFFFFEFF0753007400610063006B0020003200000000002A85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF0785000001000000FFFFFFFF07850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF00000000650200000006000069020000010000000100001004000000010000000000000000000000FFFFFFFF08000000058500000C85000010850000118500001285000024850000278500003085000001800080000001000000000000008002000000060000310300000000000069020000000600001A030000000000004080005608000000FFFEFF054200750069006C006400010000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000C85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001185000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001285000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000002485000001000000FFFFFFFFFFFFFFFFFFFEFF1153006F0075007200630065002000420072006F0077007300650020004C006F006700000000002785000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000003085000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000650200000006000069020000000000000100000004000000010000000000000000000000FFFFFFFF02000000048500001D85000001800080000000000000000000008002000000060000310300000000000069020000000600001A030000000000004080004602000000FFFEFF0B42007200650061006B0070006F0069006E0074007300000000000485000001000000FFFFFFFFFFFFFFFFFFFEFF1042007200650061006B0070006F0069006E007400200055007300610067006500000000001D85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000040000000000000FFFFFFFFFFFFFFFFF604000018000000FA0400001A030000000000000200000004000000010000000000000000000000FFFFFFFF0700000003850000168500002C8500003185000032850000338500003485000001800040000000000000FA0400002F0000000006000031030000FA04000018000000000600001A030000000000004040004607000000FFFEFF044100750074006F00000000000385000001000000FFFFFFFFFFFFFFFFFFFEFF064C006F00630061006C007300000000001685000001000000FFFFFFFFFFFFFFFFFFFEFF0A4C00690076006500200057006100740063006800000000002C85000001000000FFFFFFFFFFFFFFFFFFFEFF075700610074006300680020003100000000003185000001000000FFFFFFFFFFFFFFFFFFFEFF075700610074006300680020003200000000003285000001000000FFFFFFFFFFFFFFFFFFFEFF075700610074006300680020003300000000003385000001000000FFFFFFFFFFFFFFFFFFFEFF075700610074006300680020003400000000003485000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF0385000001000000FFFFFFFF03850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED18400000200000011020000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + 2D040000000000005B0400001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E56860000020000002C020000FFFEFF0000000000000000000000000001000000010000000180138600000200000028020000FFFEFF00000000000000000000000000010000000100000001805E860000020000002E020000FFFEFF0000000000000000000000000001000000010000000180608600000200000030020000FFFEFF00000000000000000000000000010000000100000001805D860000020000002D020000FFFEFF0000000000000000000000000001000000010000000180108600000200000026020000FFFEFF0000000000000000000000000001000000010000000180118600000200040027020000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000200000029020000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000040009802B87000000000000FFFFFFFFFFFEFF13440069007300610062006C0065006400200028004E006F0020007200650073006500740029000100000000000000000000000100000001000000000000000000000001000000000009802C87000000000000FFFFFFFFFFFEFF0853006F006600740077006100720065000100000000000000000000000100000001000000000000000000000001000000000009802D87000000000000FFFFFFFFFFFEFF144800610072006400770061007200650020002800520065007300650074002000700069006E0029000100000000000000000000000100000001000000000000000000000001000000000009802F87000000000000FFFFFFFFFFFEFF064E006F0072006D0061006C000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 51030000000000002D0400001A000000 + 8192 + 0 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000073020000FFFEFF000000000000000000000000000100000001000000018001E100000000000074020000FFFEFF000000000000000000000000000100000001000000018003E100000000000076020000FFFEFF0000000000000000000000000001000000010000000180008100000000000053020000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E100000000000079020000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004007B020000FFFEFF000000000000000000000000000100000001000000018022E10000000004007A020000FFFEFF000000000000000000000000000100000001000000018025E10000000000007C020000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE10000000004007D020000FFFEFF00000000000000000000000000010000000100000001802CE10000000004007E020000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF000100000000000000010000000000000001000000B400000002002050FFFFFFFFFFFEFF00960000000000000000000180218100000000040065020000FFFEFF000000000000000000000000000100000001000000018024E10000000000006E020000FFFEFF000000000000000000000000000100000001000000018028E10000000004006D020000FFFEFF000000000000000000000000000100000001000000018029E10000000000006F020000FFFEFF0000000000000000000000000001000000010000000180028100000000000054020000FFFEFF0000000000000000000000000001000000010000000180298100000000000069020000FFFEFF0000000000000000000000000001000000010000000180278100000000000067020000FFFEFF0000000000000000000000000001000000010000000180288100000000000068020000FFFEFF00000000000000000000000000010000000100000001801D8100000000040061020000FFFEFF00000000000000000000000000010000000100000001801E8100000000040062020000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B8100000200000058020000FFFEFF00000000000000000000000000010000000100000001800C8100000200000059020000FFFEFF00000000000000000000000000010000000100000001805F860000020000006C020000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000200000063020000FFFEFF0000000000000000000000000001000000010000000180208100000200000064020000FFFEFF000000000000000000000000000100000001000000018046810000020000006A020000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E003B030000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000510300001A000000 + 8192 + 0 + 0 + 827 + 0 + + + 1 + + + + diff --git a/LIN Slave/EWARM/settings/Example.dni b/LIN Slave/EWARM/settings/Example.dni new file mode 100644 index 0000000..b904b68 --- /dev/null +++ b/LIN Slave/EWARM/settings/Example.dni @@ -0,0 +1,130 @@ +[Stack] +FillEnabled=0 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnLogOnly=1 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[DebugChecksum] +Checksum=-214169912 +[CodeCoverage] +Enabled=_ 0 +[DriverProfiling] +Enabled=0 +Mode=1 +Graph=0 +Symbiont=0 +Exclusions= +[Exceptions] +StopOnUncaught=_ 0 +StopOnThrow=_ 0 +[CallStack] +ShowArgs=0 +[Disassembly] +MixedMode=1 +[Interrupts] +Enabled=1 +[MemConfig] +Base=1 +Manual=0 +Ddf=1 +TypeViol=0 +Stop=1 +[Trace1] +Enabled=0 +ShowSource=1 +[Simulator] +Freq=10000000 +MultiCoreRunAll=1 +[Trace2] +Enabled=0 +ShowSource=0 +[SWOTraceWindow] +PcSampling=0 +InterruptLogs=0 +ForcedTimeStamps=0 +EventCPI=0 +EventEXC=0 +EventFOLD=0 +EventLSU=0 +EventSLEEP=0 +[PowerLog] +Title_0=I0 +Symbol_0=0 4 90 +LogEnabled=0 +GraphEnabled=0 +ShowTimeLog=1 +LiveEnabled=0 +LiveFile=PowerLogLive.log +[DataLog] +LogEnabled=0 +GraphEnabled=0 +ShowTimeLog=1 +SumEnabled=0 +ShowTimeSum=1 +[EventLog] +Title_0=Ch3 +Symbol_0=0 4 1 +Title_1=Ch2 +Symbol_1=0 4 1 +Title_2=Ch1 +Symbol_2=0 4 1 +Title_3=Ch0 +Symbol_3=0 4 1 +LogEnabled=0 +GraphEnabled=0 +ShowTimeLog=1 +SumEnabled=0 +ShowTimeSum=1 +SumSortOrder=0 +[InterruptLog] +LogEnabled=0 +GraphEnabled=0 +ShowTimeLog=1 +SumEnabled=0 +ShowTimeSum=1 +SumSortOrder=0 +[Log file] +LoggingEnabled=_ 0 +LogFile=_ "" +Category=_ 0 +[TermIOLog] +LoggingEnabled=_ 0 +LogFile=_ "" +[CallStackLog] +Enabled=0 +[CallStackStripe] +ShowTiming=1 +[JLinkDriver] +CStepIntDis=_ 0 +[SWOTraceHWSettings] +OverrideDefaultClocks=0 +CpuClock=72000000 +ClockAutoDetect=0 +ClockWanted=2000000 +JtagSpeed=2000000 +Prescaler=36 +TimeStampPrescIndex=0 +TimeStampPrescData=0 +PcSampCYCTAP=1 +PcSampPOSTCNT=15 +PcSampIndex=0 +DataLogMode=0 +ITMportsEnable=0 +ITMportsTermIO=0 +ITMportsLogFile=0 +ITMlogFile=$PROJ_DIR$\ITM.log +[PowerProbe] +Frequency=10000 +Probe0=I0 +ProbeSetup0=2 1 1 2 0 0 +[Disassemble mode] +mode=0 +[Breakpoints2] +Count=0 +[Aliases] +Count=0 +SuppressDialog=0 diff --git a/LIN Slave/EWARM/settings/Example.dnx b/LIN Slave/EWARM/settings/Example.dnx new file mode 100644 index 0000000..d2bf3d0 --- /dev/null +++ b/LIN Slave/EWARM/settings/Example.dnx @@ -0,0 +1,220 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 2134666827 + + + _ 0 + + + 0 + 1 + 0 + 0 + + + + _ 0 + _ 0 + + + 0 + + + 1 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 10000000 + 1 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + I0 + 0 4 90 + 0 + 0 + 1 + 0 + PowerLogLive.log + + + 0 + 0 + 1 + 0 + 1 + + + Ch3 + 0 4 1 + Ch2 + 0 4 1 + Ch1 + 0 4 1 + Ch0 + 0 4 1 + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + _ 0 + _ "" + _ 0 + + + 0 + + + 1 + + + 12 + 2 + _ 0 + _ 0 + + + 0 + 72000000 + 0 + 2000000 + 2000000 + 36 + 0 + 0 + 1 + 15 + 0 + 0 + 0 + 0 + 0 + $PROJ_DIR$\ITM.log + + + 10000 + I0 + 2 1 1 2 0 0 + + + 0 + + + 0 + E:\Program Files\IAR Systems\Embedded Workbench 9.2\arm\config\debugger\FMSH\FM33LG02x.ddf + + + 1 + 0 + + + CMSIS-DAP v2:000000800671FF515256656767161348A5A5A5A597969908 + CMSIS-DAP v1:000000800671ff515256656767161348a5a5a5a597969908:CMSIS-DAP v2:000000800671FF515256656767161348A5A5A5A597969908: + 0 + 0 + 0 + 0 + + + 8192 + 0 + 7597125480082666357 + 7286388 + 0 + 63 + 1 + 0 + $PROJ_DIR$\ITM.log + 1 + 1 + + + Memory Periph 1073741824 98304 2 + Memory SystemSFR 3758096384 1048576 2 + Memory Flash 0 131072 1 + Memory RAM 536870912 32768 0 + + + 0 0 131072 1 2048 + + 0 536870912 32768 0 0 + + 0 1073741824 98304 2 0 + + 0 3758096384 1048576 2 0 + + + + 1 + 10 + $PROJ_DIR$\TermIOInput.txt + 1 + 0 + 2 + 2 + + + 0 + 0 + + + _ 0 + _ "" + + + 0 + + + 0 + + + 0 + 0 + + diff --git a/LIN Slave/EWARM/settings/Example_Example.jlink b/LIN Slave/EWARM/settings/Example_Example.jlink new file mode 100644 index 0000000..f0a02e9 --- /dev/null +++ b/LIN Slave/EWARM/settings/Example_Example.jlink @@ -0,0 +1,39 @@ +[BREAKPOINTS] +ForceImpTypeAny = 0 +ShowInfoWin = 1 +EnableFlashBP = 2 +BPDuringExecution = 0 +[CFI] +CFISize = 0x00 +CFIAddr = 0x00 +[CPU] +MonModeVTableAddr = 0xFFFFFFFF +MonModeDebug = 0 +MaxNumAPs = 0 +LowPowerHandlingMode = 0 +OverrideMemMap = 0 +AllowSimulation = 1 +ScriptFile = "" +[FLASH] +CacheExcludeSize = 0x00 +CacheExcludeAddr = 0x00 +MinNumBytesFlashDL = 0 +SkipProgOnCRCMatch = 1 +VerifyDownload = 1 +AllowCaching = 1 +EnableFlashDL = 2 +Override = 1 +Device = "Cortex-M0" +[GENERAL] +WorkRAMSize = 0x00 +WorkRAMAddr = 0x00 +RAMUsageLimit = 0x00 +[SWO] +SWOLogFile = "" +[MEM] +RdOverrideOrMask = 0x00 +RdOverrideAndMask = 0xFFFFFFFF +RdOverrideAddr = 0xFFFFFFFF +WrOverrideOrMask = 0x00 +WrOverrideAndMask = 0xFFFFFFFF +WrOverrideAddr = 0xFFFFFFFF \ No newline at end of file diff --git a/LIN Slave/EWARM/settings/Project.wsdt b/LIN Slave/EWARM/settings/Project.wsdt new file mode 100644 index 0000000..d7619b9 --- /dev/null +++ b/LIN Slave/EWARM/settings/Project.wsdt @@ -0,0 +1,506 @@ + + + + + Example/Example + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + + + + + 34001 + 33877 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33037 + 34399 + 0 + 33038 + 33039 + 0 + + + + + Log + _I0 + + + 1486 + 20 + + 2 + $PROJ_DIR$\DebugLog.log + 0 + 0 + + + + Example + Example/Application + Example/Application/User + Example/Drivers + + + + 14 + 32 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 24000000080040E1000001000000108600000300000048810000020000000C81000007000000558400000300000000810000010000000E810000160000001186000002000000 + + + 2E000D8400000F84000008840000FFFFFFFF54840000328100001C81000009840000D6840000D7840000D8840000D9840000DA840000DB840000DC840000DD840000DE840000DF840000E0840000E1840000E9840000EA8400002481000040E100000C84000033840000788400001184000012DE000002DE000003DE00000BDE000005DE000006DE000004DE0000259200001E920000249200001D920000778400000784000086840000808C000044D500004881000001000000 + 1900048400004D000000048100009F020000268100003E020000318400005400000020810000CA0100000F810000C201000000900000E70100000C810000BF010000068400004F000000038400004C00000044920000B30100000E8400005100000030840000530000001F810000C90100000E810000C10100001F920000B00100000B8100001E000000D1840000AF010000058400004E000000028400004B00000005810000A0020000108400005200000032840000550000000A840000500000000D81000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000001A030000000600002B030000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34050 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 00000000800200000006000031030000 + 0000000069020000000600001A030000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + + File + Line + Messages + _I0 + + + 475 + 40 + 987 + 20 + + 0 + $WS_DIR$\BuildLog.log + 0 + 0 + + + 34055 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 533 + 76 + 914 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 533 + 76 + 914 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34059 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 533 + 76 + 914 + 2 + + 0 + -1 + + + 34060 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000081020000FC05000000030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34052 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34053 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + F:\FCB_project\RP-01\anmo\code\LIN Slave\EWARM\Example\BrowseInfo\Example.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 00000000170000000601000078010000 + 00000000320000000601000065020000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 000000000E000000000000000010000001000000FFFFFFFFFFFFFFFF06010000320000000A010000650200000100000002000010040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000080000001000000FFFFFFFFFFFFFFFF00000000650200000006000069020000010000000100001004000000010000000000000000000000FFFFFFFF08000000038500000785000008850000098500000A8500000B8500000C8500000E850000FFFF02000B004354616262656450616E650080000001000000000000008002000000060000310300000000000069020000000600001A030000000000004080005608000000FFFEFF054200750069006C006400010000000385000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000785000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF1153006F0075007200630065002000420072006F0077007300650020004C006F006700000000000C85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0385000001000000FFFFFFFF03850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000028500000000000000000000000000000000000001000000028500000100000002850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED18400000200000008000000FFFEFF00000000000000000000000000010000000100000001805584000002000000FFFFFFFFFFFEFF1B44006F0077006E006C006F0061006400200061006300740069007600650020006100700070006C00690063006100740069006F006E00010000000000000001000000000000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0092000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + 3A03000000000000F90300001A000000 + 8192 + 0 + 0 + 146 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000039000000FFFEFF000000000000000000000000000100000001000000018001E10000000000003A000000FFFEFF000000000000000000000000000100000001000000018003E10000000004003C000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E100000000040041000000FFFEFF000000000000000000000000000100000001000000018022E100000000040040000000FFFEFF000000000000000000000000000100000001000000018025E100000000040042000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040043000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040044000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF000000000000000000010000000000000001000000B400000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002B000000FFFEFF000000000000000000000000000100000001000000018024E100000000040034000000FFFEFF000000000000000000000000000100000001000000018028E100000000040033000000FFFEFF000000000000000000000000000100000001000000018029E100000000040035000000FFFEFF000000000000000000000000000100000001000000018002810000000004001A000000FFFEFF000000000000000000000000000100000001000000018029810000000004002F000000FFFEFF000000000000000000000000000100000001000000018027810000000004002D000000FFFEFF000000000000000000000000000100000001000000018028810000000004002E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040027000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040028000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000020004001E000000FFFEFF00000000000000000000000000010000000100000001800D8100000200020020000000FFFEFF00000000000000000000000000010000000100000001805F8600000200000032000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000200000021000000FFFEFF00000000000000000000000000010000000100000001800F8100000200000022000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E0024030000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 00000000000000003A0300001A000000 + 8192 + 0 + 0 + 804 + 0 + + + 1 + + + + + 010000000300000001000000000000000000000001000000010000000200000000000000010000000100000000000000280000002800000001000000040000000000000001000000FFFEFF162400570053005F0044004900520024005C002E002E005C005300720063005C006D00610069006E002E00630001000000FFFF010017004966436F6E74656E7453746F726167654D6663496D706CFFFEFF00FFFEFFFF24013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E0030003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E003200350036003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E003200350036003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF066D00610069006E002E00630000000000FFFFFFFFFFFFFFFFFFFEFF532400570053005F0044004900520024005C002E002E005C0044007200690076006500720073005C0043004D005300490053005C004400650076006900630065005C0046004D005C0046004D0033003300780078005C0053006F0075007200630065005C00540065006D0070006C0061007400650073005C006900610072005C0073007400610072007400750070005F0066006D00330033006C0067003000780078002E007300010000000180FFFEFF00FFFEFFFF27013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E00360030003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E0033003000310039003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E0033003000310039003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF1373007400610072007400750070005F0066006D00330033006C0067003000780078002E00730000000000FFFFFFFFFFFFFFFFFFFEFF3A2400570053005F0044004900520024005C002E002E005C0044007200690076006500720073005C0046004D00330033004C0047003000780078005F0046004C005F004400720069007600650072005C005300720063005C0066006D00330033006C0067003000780078005F0066006C002E006300010000000180FFFEFF00FFFEFFFF27013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E00330038003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E0032003000330032003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E0032003000330032003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF0E66006D00330033006C0067003000780078005F0066006C002E00630000000000FFFFFFFFFFFFFFFFFFFEFF152400570053005F0044004900520024005C002E002E005C005300720063005C006C0069006E002E006300010000000180FFFEFF00FFFEFFFF22013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E003600350033003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E0030003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E0030003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF056C0069006E002E00630000000000FFFFFFFFFFFFFFFF0000000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD5000100000001000000020000000A01000049000000000600007C020000 + + + + diff --git a/LIN Slave/EWARM/settings/Project.wspos b/LIN Slave/EWARM/settings/Project.wspos new file mode 100644 index 0000000..487be34 --- /dev/null +++ b/LIN Slave/EWARM/settings/Project.wspos @@ -0,0 +1,2 @@ +[MainWindow] +WindowPlacement=_ 386 141 1535 900 1 diff --git a/LIN Slave/EWARM/settings/Project_EditorBookmarks.xml b/LIN Slave/EWARM/settings/Project_EditorBookmarks.xml new file mode 100644 index 0000000..38c3485 --- /dev/null +++ b/LIN Slave/EWARM/settings/Project_EditorBookmarks.xml @@ -0,0 +1,2 @@ + + diff --git a/LIN Slave/Inc/lin.h b/LIN Slave/Inc/lin.h new file mode 100644 index 0000000..38dd6aa --- /dev/null +++ b/LIN Slave/Inc/lin.h @@ -0,0 +1,144 @@ +#ifndef __LIN_H__ +#define __LIN_H__ +#include "main.h" + +/* 功能支持 */ +#define SLEEP_SUPPORT 1 /* Lin休眠时是否支持sleep 0-不支持 1-支持 */ +#define AUTOBAUD 0 /* 0-固定波特率 1-自适应波特率 */ + +/* 执行时间优化相关宏定义 */ +#define LIN_GPTIM2_ISR_MASK 6 /* 输入捕获通道1和2中断标志, 写1清0 CC1IF和CC2IF */ +#define LIN_GPTIM2_IER_MASK 2 /* 输入捕获通道1中断使能 */ + +#define LIN_UART_IRQ_PRI 1 +#define LIN_BSTIM_IRQ_PRI 2 +#define LIN_GPITM2_IRQ_PRI 2 +#define LIN_GPIO_IRQ_PRI 2 + +/* LIN 相关宏定义 */ +#define __SYSTEM_CLOCK (8000000) +#define MAIN_CLOCK __SYSTEM_CLOCK /* 主频, 单位Hz */ +#define TIMER_1MS_LOAD (MAIN_CLOCK/1000) /* 定时器1ms, Load值 */ +#define TIMER_1US_LOAD (MAIN_CLOCK/1000000) /* 定时器1us, Load值 */ +#define TIME_BASE_PERIOD 500 /* 接收超时定时器, 单位us */ +#define TIMER_LOAD_VALUE TIMER_1US_LOAD * TIME_BASE_PERIOD +#define LIN_IDLE_TIMEOUT 8000 /* TIME_BASE_PERIOD为单位,休眠周期,此时间段内无通信则进入sleep,有通信则重置超时 */ + +/* 输入捕获定时器的分频系数应保证定时器满值时,支持最小波特率2400的128位长度 +主频fMHz,分频系数为A,定时器满值为0x10000,最小波特率为2400 +A * 65536 / f >= 128/2400 +A >= 128 * f /(2400 * 65536) +*/ +#if (MAIN_CLOCK == 16000000) +#define MAIN_CLOCK_MHZ 16 +#define LIN_CAPTURE_TIMER_PSC 16 +#define LIN_MIN_BREAK_VALUE 650 +#elif (MAIN_CLOCK == 24000000) +#define MAIN_CLOCK_MHZ 24 +#define LIN_CAPTURE_TIMER_PSC 24 +#define LIN_MIN_BREAK_VALUE 650 +#elif (MAIN_CLOCK == 32000000) +#define MAIN_CLOCK_MHZ 32 +#define LIN_CAPTURE_TIMER_PSC 32 +#define LIN_MIN_BREAK_VALUE 650 +#else +#define MAIN_CLOCK_MHZ 8 +#define LIN_CAPTURE_TIMER_PSC 8 +#define LIN_MIN_BREAK_VALUE 650 +#endif + +/* 校验类型 */ +#define CHECKSUM_TYPE_STANDARD 0 +#define CHECKSUM_TYPE_ENHANCED 1 +#define CHECKSUM_TYPE CHECKSUM_TYPE_ENHANCED /* 0-标准型 1-增强型 */ + +typedef enum { + LIN_CMD0 = 0x10, + LIN_CMD1 = 0x20, + LIN_CMD2 = 0x21, + /* 此处增加自定义ID */ +}lin_cmd_t; + +typedef enum { + TRANSMIT, /* 主机发送 */ + RECEIVE /* 主机接收 */ +}lin_packet_type_t; + +typedef struct { + uint8_t cmd; /* 参考LIN_CMD0 */ + lin_packet_type_t type;/* 命令类型 */ + uint8_t length; + uint8_t* data; + uint8_t pid; /* 转换cmd为pid, 初始化时进行 */ +}lin_cmd_packet_t; + +#define LIN_BREAK_BIT 13 /* 同步间隔, 13bit显性电平 */ +#define LIN_BREAK_BYTE 0x00 +#define LIN_SYN_BYTE 0x55 + +/* lin波特率和字节间间隔 */ +#define LIN_BAUDRATE 19200 /* 波特率, 上限20K */ +#define LIN_RECV_BYTE_TIME_SPACE 12 /* 接收字节间间隔, 最大支持255bit */ + +#define LIN_SYN_BYTE_TIME_SPACE 50 /* 收到间隔段之后 */ +#define LIN_BIT_TIMER_LOAD (MAIN_CLOCK / LIN_BAUDRATE) /* 比特定时器Load值, TIME时钟源24MHz */ +#define RESPONSE_SPACE (50 * LIN_BIT_TIMER_LOAD) /* 应答间隔, 5字节长度, 每字节10bit */ + +#define LIN_BREAK_DELIMITER_TIMES 2 /* (1<<2)间隔段和间隔符长度倍数关系,不足则判定为错误 */ +#define LIN_BREAK_BIT_TIMES 10 /* 间隔段和起始位长度倍数关系, 不足则判定为错误 */ +#define LIN_SYN_BIT_GAP_PERCENTAGE 19 >> 7 /* (x/100 = y >> 7, x为期望的差距, y为计算出的值, 如x=15, 则y=19), 同步段各位与起始位差距, 超出则判定为错误 */ + +#define LIN_UART UART4 +#define LIN_UART_RX_GPIO GPIOB +#define LIN_UART_RX_PIN FL_GPIO_PIN_2 +#define LIN_UART_TX_GPIO GPIOB +#define LIN_UART_TX_PIN FL_GPIO_PIN_3 +#define LIN_UART_TX_PIN_IDX 3 +#define LIN_UART_TX_PIN_FCR_MASK 0xC0 /* (3 << (LIN_UART_TX_PIN_IDX << 1)) 便于优化执行时间 */ +#define LIN_UART_TX_PIN_FCR_OUTPUT 0x40 /* (0 << (LIN_UART_TX_PIN_IDX << 1)) */ +#define LIN_UART_TX_PIN_FCR_DIGIT 0x80 /* (2 << (LIN_UART_TX_PIN_IDX << 1)) */ +#define LIN_UART_RX_PIN_IDX 2 +#define LIN_UART_RX_PIN_FCR_MASK 0x30 /* (3 << (LIN_UART_RX_PIN_IDX << 1)) */ +#define LIN_UART_RX_PIN_FCR_INPUT 0x00 /* (0 << (LIN_UART_RX_PIN_IDX << 1)) */ +#define LIN_UART_RX_PIN_FCR_DIGIT 0x20 /* (2 << (LIN_UART_RX_PIN_IDX << 1)) */ +#define LIN_RX_EXTI_LINE FL_GPIO_EXTI_LINE_4 +#define LIN_RX_EXTI_LINE_PIN FL_GPIO_EXTI_LINE_4_PB2 +#define LIN_RX_EXTI_LINE_INDEX 4 +#define LIN_RX_EXTI_EDS_INDEX 8 //24 -> 8 ? +#define LIN_UART_IRQHandler UART4_IRQHandler +#define LIN_UART_IRQType UART4_IRQn + +/*********FM33LG0X8A 80PIN**********/ +//#define LIN_SLP_GPIO GPIOE +//#define LIN_SLP_PIN FL_GPIO_PIN_6 + +/*********FM33LG0X5A 48PIN**********/ +#define LIN_SLP_GPIO GPIOB +#define LIN_SLP_PIN FL_GPIO_PIN_6 +#define LIN_SLP_ENABLE() FL_GPIO_ResetOutputPin(LIN_SLP_GPIO, LIN_SLP_PIN) +#define LIN_SLP_DISABLE() FL_GPIO_SetOutputPin(LIN_SLP_GPIO, LIN_SLP_PIN) + +/* 用户处理 */ +#define LIN_CMD0_LENGTH 8 +#define LIN_CMD1_LENGTH 8 +#define LIN_CMD2_LENGTH 8 + +extern uint8_t LIN_CMD0_Data[8]; +extern uint8_t LIN_CMD1_Data[8]; +extern uint8_t LIN_CMD2_Data[8]; +extern lin_cmd_packet_t scheduleTable[]; +#define TABLE_SIZE (sizeof(scheduleTable)/sizeof(lin_cmd_packet_t)) + +void lin_init(void); + +#if (SLEEP_SUPPORT == 1) +void lin_sleep_init(void); + +void lin_awake_init(void); + +uint8_t lin_is_sleep(void); +#endif + + + +#endif diff --git a/LIN Slave/Inc/main.h b/LIN Slave/Inc/main.h new file mode 100644 index 0000000..1e27210 --- /dev/null +++ b/LIN Slave/Inc/main.h @@ -0,0 +1,83 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) [2019] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under the Mulan PSL v1. + * can use this software according to the terms and conditions of the Mulan PSL v1. + * You may obtain a copy of Mulan PSL v1 at: + * http://license.coscl.org.cn/MulanPSL + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v1 for more details. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include +#include +#include +#include +#include "mf_config.h" +#include "fm33lg0xx_fl.h" + +#if defined(USE_FULL_ASSERT) +#include "fm33_assert.h" +#endif /* USE_FULL_ASSERT */ + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT FMSH *****END OF FILE****/ diff --git a/LIN Slave/Inc/sleep.h b/LIN Slave/Inc/sleep.h new file mode 100644 index 0000000..306b7a7 --- /dev/null +++ b/LIN Slave/Inc/sleep.h @@ -0,0 +1,12 @@ +#ifndef __SLEEP_H__ +#define __SLEEP_H__ + +#include "lin.h" + +#if (SLEEP_SUPPORT == 1) +#include "main.h" + +void sleep(void); +#endif /* End #if (SLEEP_SUPPORT == 1) */ + +#endif diff --git a/LIN Slave/Inc/uart.h b/LIN Slave/Inc/uart.h new file mode 100644 index 0000000..62df884 --- /dev/null +++ b/LIN Slave/Inc/uart.h @@ -0,0 +1,20 @@ +#ifndef __UART_H__ +#define __UART_H__ +#include "main.h" +#include + +struct UARTOpStruct +{ + uint8_t *TxBuf; + uint8_t TxLen; + uint8_t TxOpc; + uint8_t RxBuf[20]; + uint8_t RxLen; +}; + +extern void Uartx_Init(UART_Type *UARTx); +extern void LedInit(void); +extern void UserInit(void); +extern void ClockInit(uint32_t clock); + +#endif diff --git a/LIN Slave/Inc/user_init.h b/LIN Slave/Inc/user_init.h new file mode 100644 index 0000000..cdcb213 --- /dev/null +++ b/LIN Slave/Inc/user_init.h @@ -0,0 +1,120 @@ +#ifndef __USER_INIT_H__ +#define __USER_INIT_H__ + +#include "main.h" +#ifndef MFANG +#include +#endif + +#ifndef MFANG + +#define LED_ENABLE 0 + +#if (LED_ENABLE == 1) +#define LED0_GPIO GPIOB +#define LED0_PIN FL_GPIO_PIN_9 + +#define LED0_ON() FL_GPIO_ResetOutputPin(LED0_GPIO, LED0_PIN) +#define LED0_OFF() FL_GPIO_SetOutputPin(LED0_GPIO, LED0_PIN) +#define LED0_TOG() LED0_GPIO->DO ^= LED0_PIN + +#define LED1_GPIO GPIOB +#define LED1_PIN FL_GPIO_PIN_10 + +#define LED1_ON() FL_GPIO_ResetOutputPin(LED1_GPIO, LED1_PIN) +#define LED1_OFF() FL_GPIO_SetOutputPin(LED1_GPIO, LED1_PIN) +#define LED1_TOG() LED1_GPIO->DO ^= LED1_PIN + +#define LED2_GPIO GPIOB +#define LED2_PIN FL_GPIO_PIN_11 + +#define LED2_ON() FL_GPIO_ResetOutputPin(LED2_GPIO, LED2_PIN) +#define LED2_OFF() FL_GPIO_SetOutputPin(LED2_GPIO, LED2_PIN) +#define LED2_TOG() LED2_GPIO->DO ^= LED2_PIN + +#define LED3_GPIO GPIOB +#define LED3_PIN FL_GPIO_PIN_12 + +#define LED3_ON() FL_GPIO_ResetOutputPin(LED3_GPIO, LED3_PIN) +#define LED3_OFF() FL_GPIO_SetOutputPin(LED3_GPIO, LED3_PIN) +#define LED3_TOG() LED3_GPIO->DO ^= LED3_PIN + +#define LED_R_GPIO GPIOB +#define LED_R_PIN FL_GPIO_PIN_5 + +#define LED_R_ON() FL_GPIO_ResetOutputPin(LED_R_GPIO, LED_R_PIN) +#define LED_R_OFF() FL_GPIO_SetOutputPin(LED_R_GPIO, LED_R_PIN) +#define LED_R_TOG() LED_R_GPIO->DO ^= LED_R_PIN + +#define LED_G_GPIO GPIOB +#define LED_G_PIN FL_GPIO_PIN_6 + +#define LED_G_ON() FL_GPIO_ResetOutputPin(LED_G_GPIO, LED_G_PIN) +#define LED_G_OFF() FL_GPIO_SetOutputPin(LED_G_GPIO, LED_G_PIN) +#define LED_G_TOG() LED_G_GPIO->DO ^= LED_G_PIN + +#define LED_B_GPIO GPIOB +#define LED_B_PIN FL_GPIO_PIN_4 + +#define LED_B_ON() FL_GPIO_ResetOutputPin(LED_B_GPIO, LED_B_PIN) +#define LED_B_OFF() FL_GPIO_SetOutputPin(LED_B_GPIO, LED_B_PIN) +#define LED_B_TOG() LED_B_GPIO->DO ^= LED_B_PIN +#else +#define LED0_GPIO GPIOB +#define LED0_PIN FL_GPIO_PIN_10 + +#define LED0_ON() FL_GPIO_ResetOutputPin(LED0_GPIO, LED0_PIN) +#define LED0_OFF() FL_GPIO_SetOutputPin(LED0_GPIO, LED0_PIN) +#define LED0_TOG() + +#define LED1_GPIO GPIOB +#define LED1_PIN FL_GPIO_PIN_10 + +#define LED1_ON() FL_GPIO_ResetOutputPin(LED1_GPIO, LED1_PIN) +#define LED1_OFF() FL_GPIO_SetOutputPin(LED1_GPIO, LED1_PIN) +#define LED1_TOG() + +#define LED2_GPIO GPIOB +#define LED2_PIN FL_GPIO_PIN_10 + +#define LED2_ON() FL_GPIO_ResetOutputPin(LED2_GPIO, LED2_PIN) +#define LED2_OFF() FL_GPIO_SetOutputPin(LED2_GPIO, LED2_PIN) +#define LED2_TOG() + +#define LED3_GPIO GPIOB +#define LED3_PIN FL_GPIO_PIN_10 + +#define LED3_ON() FL_GPIO_ResetOutputPin(LED3_GPIO, LED3_PIN) +#define LED3_OFF() FL_GPIO_SetOutputPin(LED3_GPIO, LED3_PIN) +#define LED3_TOG() + +#define LED_R_GPIO GPIOB +#define LED_R_PIN FL_GPIO_PIN_10 + +#define LED_R_ON() FL_GPIO_ResetOutputPin(LED_R_GPIO, LED_R_PIN) +#define LED_R_OFF() FL_GPIO_SetOutputPin(LED_R_GPIO, LED_R_PIN) +#define LED_R_TOG() + +#define LED_G_GPIO GPIOB +#define LED_G_PIN FL_GPIO_PIN_10 + +#define LED_G_ON() FL_GPIO_ResetOutputPin(LED_G_GPIO, LED_G_PIN) +#define LED_G_OFF() FL_GPIO_SetOutputPin(LED_G_GPIO, LED_G_PIN) +#define LED_G_TOG() + +#define LED_B_GPIO GPIOB +#define LED_B_PIN FL_GPIO_PIN_10 + +#define LED_B_ON() FL_GPIO_ResetOutputPin(LED_B_GPIO, LED_B_PIN) +#define LED_B_OFF() FL_GPIO_SetOutputPin(LED_B_GPIO, LED_B_PIN) +#define LED_B_TOG() +#endif + +#endif + +extern struct UARTOpStruct UARTxOp; + +void Close_And_ClearIRQ(IRQn_Type IRQn); +void UserInit(void); +void FoutInit(void); +#endif diff --git a/LIN Slave/MF-config/Inc/mf_config.h b/LIN Slave/MF-config/Inc/mf_config.h new file mode 100644 index 0000000..a29382d --- /dev/null +++ b/LIN Slave/MF-config/Inc/mf_config.h @@ -0,0 +1,45 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : mf_config.h + * @brief : Header for mf_config.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) [2019] [Fudan Microelectronics] + * THIS SOFTWARE is licensed under the Mulan PSL v1. + * can use this software according to the terms and conditions of the Mulan PSL v1. + * You may obtain a copy of Mulan PSL v1 at: + * http://license.coscl.org.cn/MulanPSL + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v1 for more details. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MF_CONFIG_H +#define __MF_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported functions prototypes ---------------------------------------------*/ +void MF_Clock_Init(void); +void MF_SystemClock_Config(void); +void MF_Config_Init(void); +void Error_Handler(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* __MF_CONFIG_H */ + +/************************ (C) COPYRIGHT FMSH *****END OF FILE****/ diff --git a/LIN Slave/MF-config/Src/mf_config.c b/LIN Slave/MF-config/Src/mf_config.c new file mode 100644 index 0000000..51ee0f8 --- /dev/null +++ b/LIN Slave/MF-config/Src/mf_config.c @@ -0,0 +1,88 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : mf_config.c + * @brief : MCU FUNCTION CONFIG + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 FMSH. + * All rights reserved.

+ * + * This software component is licensed by FMSH under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "mf_config.h" +#include "fm33lg0xx_fl.h" + +/* Private function prototypes -----------------------------------------------*/ + +/** + * @brief The application entry point. + * @retval int + */ +void MF_Clock_Init(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + FL_CMU_EnableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_RTCA); + FL_RTCA_WriteAdjustValue (RTCA, 0); + FL_CMU_DisableGroup1BusClock(FL_CMU_GROUP1_BUSCLK_RTCA); + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + + /* System interrupt init*/ + + /* Initialize all configured peripherals */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void MF_SystemClock_Config(void) +{ + +} + +void MF_Config_Init(void) +{ + +} + + +/** + * @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 */ + + /* 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 Assert_Failed */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END Assert_Failed */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT FMSH *****END OF FILE****/ diff --git a/LIN Slave/Src/lin.c b/LIN Slave/Src/lin.c new file mode 100644 index 0000000..df7b948 --- /dev/null +++ b/LIN Slave/Src/lin.c @@ -0,0 +1,1075 @@ +#include "main.h" +#include "user_init.h" +#include "lin.h" +#include "uart.h" + +#define FRAME_DATA_MAX_LEN 11 /* 帧最大数据长度 */ +#define SCHEDULE_FRAME_MAX_NUM 255 /* 进度表最大帧数量 */ + +#define FRAME_TYPE_UNCONDITIONAL 0 /* 无条件帧 */ +#define FRAME_TYPE_EVENT_TRIGGER 1 /* 事件触发帧 */ +#define FRAME_TYPE_SPORADIC 2 /* 偶发帧 */ +#define FRAME_TYPE_DIAGNOSTIC 3 /* 诊断帧 */ +#define FRAME_TYPE_RESERVED 4 /* 保留帧 */ +#define FRAME_TYPE_NO_RESPONSE 5 /* 自定义,主机发送无需回应帧 */ + +/* 帧处理状态机 */ +#define FRAME_STATE_IDLE 0 /* 空闲状态 主:等待任务开始 从:固定波特率:等待间隔段 自动波特率:等待间隔段+同步段 */ +#define FRAME_STATE_SEND_SYN 1 /* 主机发送SYN(包括间隔段和同步段) */ +#define FRAME_STATE_RECV_SYN 2 /* 固定波特率:接收同步段0x55 */ +#define FRAME_STATE_RECV_PID 3 /* 接收PID */ +#define FRAME_STATE_RECV_DATA 4 /* 接收数据 */ +#define FRAME_STATE_SEND 5 /* 串口发送 */ +#define FRAME_STATE_SLEEP 6 /* 休眠状态 */ + +/** + * @brief 计算PID + * @param id: 输入id + * @retval 计算后的PID + */ +uint8_t calculatePID(uint8_t id) +{ + uint8_t P0 = 0, P1 = 0; + + P0 = ((id) ^ (id >> 1) ^ (id >> 2) ^ (id >> 4)) & 0x01; + P1 = (~((id >> 1) ^ (id >> 3) ^ (id >> 4) ^ (id >> 5))) & 0x01; + + return ((P1 << 7) | (P0 << 6) | id); +} + +/** + * @brief 计算校验和 + * @param data: 数据指针 + * len: 数据长度 + * @retval checkSum: 校验和 + */ +uint8_t calculateChecksum(uint8_t *data, uint8_t len) +{ + uint8_t i; + uint16_t checkSum = 0; + + for (i = 0; i < len; i++) + { + checkSum += data[i]; + if (checkSum >= 0x100) + { + checkSum -= 0xFF; + } + } + checkSum = (~checkSum) & 0xFF; + + return checkSum; +} + +/** + * @brief LIN slp初始化 + * @param void + * @retval void + */ +void lin_slp_pin_init(void) +{ + FL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + LIN_SLP_DISABLE(); + + GPIO_InitStruct.pin = LIN_SLP_PIN; + GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_DISABLE; + FL_GPIO_Init(LIN_SLP_GPIO, &GPIO_InitStruct); +} + +#define Min(a, b) (((a)<(b))?(a):(b)) +#define lin_calc_max_res_timeout_cnt(bitLength, size) (uint16_t)((14*(1+(size))*((bitLength)/TIMER_1US_LOAD))/TIME_BASE_PERIOD + 3 ) + +#if (AUTOBAUD == 1) +/* 同步处理步骤:目的是不符合要求尽快结束重新判断同步 */ +#define SYN_STEP_WAIT_BREAK 0 /* 等待间隔段,获取间隔段和间隔符时长,与间隔段比较,符合要求转step 1,否则步骤不变 */ +#define SYN_STEP_WAIT_START 1 /* 等待start, 获取起始位长度,与间隔段比较符合要求且占空比为50%转step 2; 否则继续判断是否为间隔段 */ +#define SYN_STEP_WAIT_BIT 2 /* 等待后续bit,4次PWM符合要求之后,转step3,等待stop bit;任意bit不符合要求转step 0 */ +#define SYN_STEP_WAIT_STOP 3 /* 等到stop,判断符合要求结束判断;不符合转step 0 */ + +/* GPTIM中断判断同步相关变量 */ +uint32_t LinSampleValue[20]; /* 记录GPTIM中断来时,当前 sysclk 计数值,需要芯片支持sysclk时钟源为APB */ +uint16_t LinSampleCounter; /* 记录GPTIM PWM中断次数 */ + +uint32_t BitLength; /* 位速率 */ +#endif + +/* 帧格式 [最大11字节] */ +/* data区内容:受保护ID-1字节; 数据段-0-8字节;校验和-1字节 */ +typedef struct s_lin_frame_type +{ + uint8_t tx_len;/* 发送长度 */ + uint8_t rx_len;/* 接收长度 */ + uint8_t data[FRAME_DATA_MAX_LEN]; +} lin_frame_data_type; + +/* 任务处理:等待接收并处理 */ +typedef struct s_lin_task_type +{ + uint8_t frame_state; /* 帧处理状态机,参照 FRAME_STATE_IDLE 定义 */ + #if (AUTOBAUD == 1) + uint8_t syn_step; /* 参照 SYN_STEP_WAIT_BREAK */ + #endif + + /* 帧超时计数,接收到同步段后置起,按照8字节数据计算超时 */ + /* 公式:round((1.4x(10+8x10)xTbit)/Tbase_period) + 3,8为接收字节数,Tbit为单个bit用时,Tbase_period为定时器周期,单位都是us */ + uint16_t frame_timeout_cnt; + /* 响应超时计数,接收到需要响应的ID后置起,按照实际接收长度计算超时 */ + /* 公式:round((1.4x(10+Nx10)xTbit)/Tbase_period) + 3,N为接收字节数,Tbit为单个bit用时,Tbase_period为定时器周期,单位都是us */ + uint16_t res_frame_timeout_cnt; + /* Lin总线IDLE超时计数,减为0进入SLEEP状态 */ + uint16_t idle_timeout_cnt; + lin_frame_data_type lin_frame;/* 帧内容 */ +} lin_task_type; + +lin_task_type g_lin_task; + +uint8_t LIN_CMD0_Data[8]; +uint8_t LIN_CMD1_Data[8] = {0x12, 0x34, 0x56, 0x78}; +uint8_t LIN_CMD2_Data[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; + +lin_cmd_packet_t scheduleTable[] = +{ + /* 用户命令码 */ + {LIN_CMD0, RECEIVE, LIN_CMD0_LENGTH, LIN_CMD0_Data}, + {LIN_CMD1, TRANSMIT, LIN_CMD1_LENGTH, LIN_CMD1_Data}, + {LIN_CMD2, TRANSMIT, LIN_CMD2_LENGTH, LIN_CMD2_Data}, +}; + +/** + * @brief 接收超时定时器初始化 + * @param void + * @retval void + */ +void lin_timeout_init(void) +{ + FL_BSTIM16_InitTypeDef timInit; + + timInit.prescaler = 0; /* 分频系数1 */ + timInit.clockSource = FL_CMU_BSTIM16_CLK_SOURCE_APBCLK; /* 时钟源 */ + timInit.autoReload = TIMER_LOAD_VALUE - 1; /* 自动重装载值 */ + timInit.autoReloadState = FL_DISABLE; /* 预装载preload禁能 */ + FL_BSTIM16_Init(BSTIM16, &timInit); + + FL_BSTIM16_ClearFlag_Update(BSTIM16); + NVIC_ClearPendingIRQ(BSTIM_IRQn); + + /* NVIC中断配置 */ + NVIC_DisableIRQ(BSTIM_IRQn); + NVIC_SetPriority(BSTIM_IRQn, LIN_BSTIM_IRQ_PRI); + NVIC_EnableIRQ(BSTIM_IRQn); + + FL_BSTIM16_EnableIT_Update(BSTIM16); + + /* 使能定时器 */ + FL_BSTIM16_Enable(BSTIM16); +} + +/** + * @brief lin idle + * @param void + * @retval void + */ +void lin_goto_idle(void) +{ + LED2_TOG(); + + g_lin_task.lin_frame.tx_len = 0; + g_lin_task.lin_frame.rx_len = 0; + g_lin_task.frame_state = FRAME_STATE_IDLE; + g_lin_task.idle_timeout_cnt = LIN_IDLE_TIMEOUT; + + UARTxOp.RxLen = 0; + UARTxOp.TxLen = 0; + + #if (AUTOBAUD == 1) + LinSampleCounter = 0; + g_lin_task.syn_step = SYN_STEP_WAIT_BREAK; /* 初始化同步步骤 */ + + LIN_UART_RX_GPIO->DFS |= LIN_UART_RX_PIN; /* 引脚重置为GPTIM输入 */ + GPTIM2->CCER |= GPTIM_CCER_CCIP; + /* 关闭UART接收,使能RX引脚输入捕获中断 */ + FL_UART_DisableRX(LIN_UART); + GPTIM2->ISR = LIN_GPTIM2_ISR_MASK; + NVIC_ClearPendingIRQ(GPTIM2_IRQn); + FL_GPTIM_EnableIT_CC(GPTIM2, FL_GPTIM_CHANNEL_1);/* 使能CC1捕捉中断 */ + NVIC_EnableIRQ(GPTIM2_IRQn); + #else + FL_UART_EnableRX(LIN_UART); /* 非自动波特率打开接收 */ + #endif + + LED2_TOG(); +} + + +/** + * @brief lin idle state初始化 + * @param void + * @retval void + */ +__STATIC_INLINE void lin_init_idle_state(void) +{ + g_lin_task.lin_frame.tx_len = 0; + g_lin_task.lin_frame.rx_len = 0; + g_lin_task.frame_state = FRAME_STATE_IDLE; + g_lin_task.idle_timeout_cnt = LIN_IDLE_TIMEOUT; + + UARTxOp.RxLen = 0; + UARTxOp.TxLen = 0; + + #if (AUTOBAUD == 1) + LinSampleCounter = 0; + g_lin_task.syn_step = SYN_STEP_WAIT_BREAK;/* 初始化同步步骤 */ + #else + + #endif +} + +#if (AUTOBAUD == 1) + +/** + * @brief 判断两个bit长度是否超过BIT_GAP + * @param cmp_value: 比较值 + * base_value: 基础值 + * @retval 1: 超过BIT_GAP + * 0: 不超过BIT_GAP + */ +uint8_t check_bit_gap(uint32_t cmp_value, uint32_t base_value) +{ + uint32_t temp; + + if (cmp_value > base_value) + { + temp = cmp_value - base_value; + } + else + { + temp = base_value - cmp_value; + } + + if (temp > (uint32_t)(base_value * LIN_SYN_BIT_GAP_PERCENTAGE)) + { + return 1; + } + else + { + return 0; + } +} + +#if (SLEEP_SUPPORT == 1) +extern uint8_t g_awake_init; +#endif + +/** + * @brief GPTIM2输入捕获中断 + * @note 判断同步间隔段和同步段,计算通信速率 + * @param void + * @retval void + */ +void GPTIM2_IRQHandler(void) +{ + uint8_t temp, tempFlag; + volatile uint32_t IC1Value = 0; + volatile uint32_t IC2Value = 0; + static uint32_t sumCalcBaud = 0;/* 累计从起始位到第6位的时间 */ + + tempFlag = 0; + + LED0_TOG(); + + GPTIM2->ISR = LIN_GPTIM2_ISR_MASK; + + if (LinSampleCounter) + { + IC1Value = GPTIM2->CCR1; + IC2Value = GPTIM2->CCR2; + } + #if (SLEEP_SUPPORT == 1) + else if (g_awake_init) + { + g_awake_init = 0; + + /* 180us为LSCLK下,使能引脚滤波的情况下,产生中断所需要的时间,然后转换成计数值 */ + IC1Value = 180 * TIMER_1US_LOAD + GPTIM2->CCR1; + IC2Value = 180 * TIMER_1US_LOAD + GPTIM2->CCR2; + + LinSampleCounter = 1; + } + #endif + + if (LinSampleCounter) + { + if ((g_lin_task.frame_state == FRAME_STATE_IDLE) || + (g_lin_task.frame_state == FRAME_STATE_SLEEP)) + { + switch (g_lin_task.syn_step) + { + /* 等待间隔段 */ + case SYN_STEP_WAIT_BREAK: + if (IC2Value < LIN_MIN_BREAK_VALUE) + { + /* 间隔段和间隔符长度倍数关系,不足则判定为错误,下降沿作为间隔段开始 */ + LinSampleCounter = 0; + } + else + { + /* 等待下一个PWM */ + temp = LinSampleCounter - 1; + temp = temp << 1; + + LinSampleValue[temp] = IC2Value; + LinSampleValue[temp + 1] = IC1Value - IC2Value; + + g_lin_task.syn_step = SYN_STEP_WAIT_START; + + sumCalcBaud = 0; + } + break; + /* 等待START */ + case SYN_STEP_WAIT_START: + /* 判断占空比是否符合要求 */ + if (check_bit_gap(IC1Value - IC2Value, IC2Value)) + { + /* 占空比不符合要求 */ + tempFlag = 2; + } + else + { + /* 占空比符合要求 */ + if (LinSampleValue[0] < (IC2Value << LIN_BREAK_DELIMITER_TIMES)) + { + /* 间隔段和起始位长度倍数关系,不足则接着判断是否为新的间隔段 */ + tempFlag = 3; + } + else + { + /* 间隔段和起始位符合逻辑关系,更新数值 */ + temp = LinSampleCounter - 1; + temp = temp << 1; + + LinSampleValue[temp] = IC2Value; + LinSampleValue[temp + 1] = IC1Value - IC2Value; + + g_lin_task.syn_step = SYN_STEP_WAIT_BIT; + + sumCalcBaud += IC1Value; + } + } + + if (tempFlag) + { + if (IC2Value < LIN_MIN_BREAK_VALUE) + { + /* 间隔段和间隔符长度倍数关系,不足则判定为错误,下降沿作为间隔段开始 */ + LinSampleCounter = 0; + g_lin_task.syn_step = SYN_STEP_WAIT_BREAK; + } + else + { + LinSampleCounter = 1; + + /* 等待下一个PWM */ + temp = LinSampleCounter - 1; + temp = temp << 1; + + LinSampleValue[temp] = IC2Value; + LinSampleValue[temp + 1] = IC1Value - IC2Value; + + g_lin_task.syn_step = SYN_STEP_WAIT_START; + + sumCalcBaud = 0; + } + } + + break; + /* 等待后续位 */ + case SYN_STEP_WAIT_BIT: + /* 判断占空比是否符合要求 */ + if (check_bit_gap(IC1Value - IC2Value, IC2Value)) + { + /* 占空比不符合要求 */ + tempFlag = 4; + } + else + { + /* 占空比符合要求, 判断新的bit与起始位的长度关系 */ + if (check_bit_gap(IC2Value, LinSampleValue[2])) + { + /* 超出差距 */ + tempFlag = 5; + } + else + { + /* 间隔段和起始位符合逻辑关系,更新数值 */ + temp = LinSampleCounter - 1; + temp = temp << 1; + + LinSampleValue[temp] = IC2Value; + LinSampleValue[temp + 1] = IC1Value - IC2Value; + + sumCalcBaud += IC1Value; + + if (LinSampleCounter == 5) + { + /* 切换为单次上升沿触发直接计数此刻到下一次上升沿的数值 */ + GPTIM2->CCER &= ~GPTIM_CCER_CCIP; + g_lin_task.syn_step = SYN_STEP_WAIT_STOP; + + LED1_TOG(); + + sumCalcBaud = sumCalcBaud >> 3; + sumCalcBaud = sumCalcBaud * LIN_CAPTURE_TIMER_PSC; + } + else + { + g_lin_task.syn_step = SYN_STEP_WAIT_BIT; + } + } + } + + if (tempFlag) + { + if (IC2Value < LIN_MIN_BREAK_VALUE) + { + /* 间隔段和间隔符长度倍数关系,不足则判定为错误,下降沿作为间隔段开始 */ + LinSampleCounter = 0; + g_lin_task.syn_step = SYN_STEP_WAIT_BREAK; + } + else + { + LinSampleCounter = 1; + + /* 等待下一个PWM */ + temp = LinSampleCounter - 1; + temp = temp << 1; + + LinSampleValue[temp] = IC2Value; + LinSampleValue[temp + 1] = IC1Value - IC2Value; + + g_lin_task.syn_step = SYN_STEP_WAIT_START; + + sumCalcBaud = 0; + } + } + break; + /* 等待stop位 */ + case SYN_STEP_WAIT_STOP: + /* 判断占空比是否符合要求 */ + if (check_bit_gap(IC2Value, LinSampleValue[2])) + { + LinSampleCounter = 0; + g_lin_task.syn_step = SYN_STEP_WAIT_BREAK; + + GPTIM2->CCER |= GPTIM_CCER_CCIP;/* 切换回双沿 */ + } + else + { + /* 检测同步成功 */ + /* 引脚重置为RX接收 */ + LIN_UART_RX_GPIO->DFS &= ~LIN_UART_RX_PIN; + + LED1_TOG(); + + /* 设置串口波特率 */ + BitLength = sumCalcBaud; + + LIN_UART->CSR &= ~UART_CSR_RXEN_Msk; + LIN_UART->CSR &= ~UART_CSR_TXEN_Msk; + LIN_UART->BGR = BitLength - 1; + LIN_UART->CSR |= UART_CSR_TXEN_Msk; + LIN_UART->ISR = UART_ISR_RXBF_Msk; + + /* 切换任务状态机 */ + g_lin_task.lin_frame.rx_len = 0; + g_lin_task.frame_state = FRAME_STATE_RECV_PID; + + /* 初始化串口接收长度等,使能接收等待接收ID */ + UARTxOp.RxLen = 0 ; + LIN_UART->CSR |= UART_CSR_RXEN_Msk; + + LED1_TOG(); + + /* 开始接收,置超时 */ + g_lin_task.frame_timeout_cnt = lin_calc_max_res_timeout_cnt(BitLength, 8); + + LED1_TOG(); + + /* 关闭GPTIM2中断 */ + /* 关闭CC1捕捉中断 */ + GPTIM2->DIER &= ~LIN_GPTIM2_IER_MASK; + //NVIC_DisableIRQ(GPTIM2_IRQn); + + LinSampleCounter = 0; + g_lin_task.syn_step = SYN_STEP_WAIT_BREAK; + } + tempFlag = 6; + break; + default: + break; + } + } + } + + LED1_TOG(); + + LinSampleCounter++; +} +#endif + +/** + * @brief 定时,用于判断字节间超时 + * @note 12位波特率,如1200-10ms 19.2KHz-625us + * @param void + * @retval void + */ +void BSTIM_IRQHandler(void) +{ + if (FL_BSTIM16_IsActiveFlag_Update(BSTIM16)) + { + FL_BSTIM16_ClearFlag_Update(BSTIM16); + + switch (g_lin_task.frame_state) + { + case FRAME_STATE_IDLE: + if (0 == g_lin_task.idle_timeout_cnt) + { + g_lin_task.frame_state = FRAME_STATE_SLEEP; + g_lin_task.idle_timeout_cnt = LIN_IDLE_TIMEOUT; + } + else + { + g_lin_task.idle_timeout_cnt--; + } + break; + case FRAME_STATE_RECV_SYN: + case FRAME_STATE_RECV_PID: + case FRAME_STATE_SEND: + if (0 == g_lin_task.frame_timeout_cnt) + { + LED2_TOG(); + + lin_goto_idle(); + } + else + { + g_lin_task.frame_timeout_cnt--; + } + break; + case FRAME_STATE_RECV_DATA: + if (0 == g_lin_task.res_frame_timeout_cnt) + { + LED3_TOG(); + + if (UARTxOp.RxLen > 1) + { + UARTxOp.RxLen = 0; + } + lin_goto_idle(); + } + else + { + g_lin_task.res_frame_timeout_cnt--; + } + break; + } + + LED3_TOG(); + } +} +/** + * @brief UART-LIN中断 + * @param void + * @retval void + */ +void LIN_UART_IRQHandler(void) +{ + uint8_t tmp08; + static uint8_t PID, i; + + LED2_TOG(); + + /* 接收错误中断处理 需要注意帧类型错误会同时有RXBF标志,用于判定同步段 */ + if (LIN_UART->ISR & UART_ISR_FERR_Msk) + { + tmp08 = LIN_UART->RXBUF; + + if (tmp08 == LIN_BREAK_BYTE) + { + /* 检测到间隔段 */ + g_lin_task.frame_state = FRAME_STATE_RECV_SYN; + + /* 收到间隔段之后置起超时,等待在超时内收到同步字节0x55 */ + g_lin_task.frame_timeout_cnt = lin_calc_max_res_timeout_cnt(LIN_BIT_TIMER_LOAD, 8); + } + else + { + /* 帧错误 */ + + lin_goto_idle(); + } + + LIN_UART->ISR = UART_ISR_FERR_Msk; + } + /* 接收中断处理 */ + else if (LIN_UART->ISR & UART_ISR_RXBF_Msk) + { + switch (g_lin_task.frame_state) + { + /* 固定波特率接收同步阶段 */ + case FRAME_STATE_RECV_SYN: + /* 接收数据 */ + /* 接收中断标志可通过读取rxreg寄存器清除 */ + tmp08 = LIN_UART->RXBUF; + UARTxOp.RxLen = 0; + + if (tmp08 == LIN_SYN_BYTE) + { + /* 间隔段之后的第一个字节是0x55 */ + g_lin_task.frame_state = FRAME_STATE_RECV_PID; + } + else + { + lin_goto_idle(); + } + break; + /* 接收PID阶段,判断PID是否有效如有效判定后续行为是发送还是接收 */ + case FRAME_STATE_RECV_PID: + /* 接收数据 */ + /* 接收中断标志可通过读取rxreg寄存器清除 */ + tmp08 = LIN_UART->RXBUF; + + UARTxOp.RxBuf[UARTxOp.RxLen] = tmp08; + UARTxOp.RxLen++; + + LED2_TOG(); + + for (i = 0; i < TABLE_SIZE; i++) + { + if (scheduleTable[i].pid == tmp08) + { + PID = tmp08; + break; + } + } + + LED2_TOG(); + + if (i == TABLE_SIZE) + { + /* 无对应命令,不做处理 */ + lin_goto_idle(); + + return; + } + else + { + if (scheduleTable[i].type == RECEIVE) + { + /* 主机发送命令,更新待接收长度,转接收数据阶段 */ + g_lin_task.lin_frame.rx_len = scheduleTable[i].length + 1; + g_lin_task.frame_state = FRAME_STATE_RECV_DATA; + + /* 更新响应超时 */ + #if (AUTOBAUD == 1) + g_lin_task.res_frame_timeout_cnt = lin_calc_max_res_timeout_cnt(BitLength, scheduleTable[i].length); + #else + g_lin_task.res_frame_timeout_cnt = lin_calc_max_res_timeout_cnt(LIN_BIT_TIMER_LOAD, scheduleTable[i].length); + #endif + } + else + { + /* 主机接收命令,更新待发送长度,转发送数据阶段 */ + /* 第一时间发送数据,保证负载率 */ + LIN_UART->TXBUF = scheduleTable[i].data[0]; + + LED2_TOG(); + + #if (CHECKSUM_TYPE == CHECKSUM_TYPE_ENHANCED) + g_lin_task.lin_frame.data[0] = PID; + memcpy(&g_lin_task.lin_frame.data[1], scheduleTable[i].data, scheduleTable[i].length); + g_lin_task.lin_frame.data[scheduleTable[i].length + 1] = calculateChecksum(g_lin_task.lin_frame.data, scheduleTable[i].length + 1); + + g_lin_task.lin_frame.tx_len = scheduleTable[i].length + 1; + UARTxOp.TxLen = g_lin_task.lin_frame.tx_len; + UARTxOp.TxOpc = 1; + UARTxOp.TxBuf = &g_lin_task.lin_frame.data[1]; + #else + memcpy(g_lin_task.lin_frame.data, scheduleTable[i].data, scheduleTable[i].length); + g_lin_task.lin_frame.data[scheduleTable[i].length] = calculateChecksum(g_lin_task.lin_frame.data, scheduleTable[i].length); + + g_lin_task.lin_frame.tx_len = scheduleTable[i].length + 1; + UARTxOp.TxLen = g_lin_task.lin_frame.tx_len; + UARTxOp.TxOpc = 1; + UARTxOp.TxBuf = g_lin_task.lin_frame.data; + #endif + g_lin_task.lin_frame.rx_len = 0; + g_lin_task.frame_state = FRAME_STATE_SEND; + } + } + + LED2_TOG(); + + break; + /* 接收数据阶段,直到接收完成才处理 */ + case FRAME_STATE_RECV_DATA: + if (UARTxOp.RxLen >= g_lin_task.lin_frame.rx_len) + { + /* 最后一个字节,第一时间开接收 */ + #if (AUTOBAUD == 1) + + /* 引脚重置为GPTIM输入 */ + LIN_UART_RX_GPIO->DFS |= LIN_UART_RX_PIN; + GPTIM2->CCER |= GPTIM_CCER_CCIP; + + /* 关闭UART接收,使能RX引脚输入捕获中断 */ + GPTIM2->ISR = LIN_GPTIM2_ISR_MASK; + + /* 使能CC1捕捉中断 */ + GPTIM2->DIER = LIN_GPTIM2_IER_MASK; + + /* 关闭UART接收 */ + LIN_UART->CSR &= ~UART_CSR_RXEN_Msk; + #else + LIN_UART->CSR |= UART_CSR_RXEN_Msk; + #endif + + LED2_TOG(); + } + + /* 接收数据 */ + /* 接收中断标志可通过读取rxreg寄存器清除 */ + tmp08 = LIN_UART->RXBUF; + + UARTxOp.RxBuf[UARTxOp.RxLen] = tmp08; + UARTxOp.RxLen++; + + if (UARTxOp.RxLen >= g_lin_task.lin_frame.rx_len + 1) + { + /* 主机主动发送,解析数据 */ + #if (CHECKSUM_TYPE == CHECKSUM_TYPE_ENHANCED) + if (calculateChecksum(UARTxOp.RxBuf, UARTxOp.RxLen - 1) == UARTxOp.RxBuf[UARTxOp.RxLen - 1]) + { + LED2_TOG(); + + /* 通过校验 */ + if (scheduleTable[i].length != (UARTxOp.RxLen - 2)) + { + lin_init_idle_state(); + + return; + } + else + { + memcpy(scheduleTable[i].data, &UARTxOp.RxBuf[1], scheduleTable[i].length); + + LED2_TOG(); + } + } + #else + if (calculateChecksum(&UARTxOp.RxBuf[1], UARTxOp.RxLen - 2) == UARTxOp.RxBuf[UARTxOp.RxLen - 1]) + { + if (scheduleTable[i].length != (UARTxOp.RxLen - 2)) + { + lin_init_idle_state(); + + return; + } + else + { + memcpy(scheduleTable[i].data, &UARTxOp.RxBuf[1], scheduleTable[i].length); + } + } + #endif + lin_init_idle_state(); + } + break; + case FRAME_STATE_SEND: + /* 接收数据 */ + /* 接收中断标志可通过读取rxreg寄存器清除 */ + tmp08 = LIN_UART->RXBUF; + + if (UARTxOp.TxOpc < UARTxOp.TxLen) + { + if (tmp08 != UARTxOp.TxBuf[UARTxOp.TxOpc - 1]) + { + /* bit错误 */ + #if (AUTOBAUD == 1) + LIN_UART_RX_GPIO->DFS |= LIN_UART_RX_PIN;/* 引脚重置为GPTIM输入 */ + GPTIM2->CCER |= GPTIM_CCER_CCIP; + /* 关闭UART接收,使能RX引脚输入捕获中断 */ + GPTIM2->ISR = LIN_GPTIM2_ISR_MASK; + GPTIM2->DIER = LIN_GPTIM2_IER_MASK;/* 使能CC1捕捉中断 */ + + LIN_UART->CSR &= ~UART_CSR_RXEN_Msk;/* 关闭UART接收 */ + #else + LIN_UART->CSR |= UART_CSR_RXEN_Msk; + #endif + + LED2_TOG(); + + lin_init_idle_state(); + } + else + { + LIN_UART->TXBUF = UARTxOp.TxBuf[UARTxOp.TxOpc]; /* 发送一个数据 */ + UARTxOp.TxOpc++; + } + } + else + { + /* 发送完毕,快速切换至接收 */ + #if (AUTOBAUD == 1) + + /* 引脚重置为GPTIM输入 */ + LIN_UART_RX_GPIO->DFS |= LIN_UART_RX_PIN; + GPTIM2->CCER |= GPTIM_CCER_CCIP; + + /* 关闭UART接收,使能RX引脚输入捕获中断 */ + GPTIM2->ISR = LIN_GPTIM2_ISR_MASK; + + /* 使能CC1捕捉中断 */ + GPTIM2->DIER = LIN_GPTIM2_IER_MASK; + + /* 关闭UART接收 */ + LIN_UART->CSR &= ~UART_CSR_RXEN_Msk; + #else + LIN_UART->CSR |= UART_CSR_RXEN_Msk; + #endif + + LED2_TOG(); + + lin_init_idle_state(); + } + break; + default: + /* 接收数据 */ + /* 接收中断标志可通过读取rxreg寄存器清除 */ + tmp08 = LIN_UART->RXBUF; + + break; + } + } + + /* 清除可能的错误中断标志 */ + if (LIN_UART->ISR & UART_ISR_PERR_Msk) + { + LIN_UART->ISR = UART_ISR_PERR_Msk; + } + if (LIN_UART->ISR & UART_ISR_OERR_Msk) + { + LIN_UART->ISR = UART_ISR_OERR_Msk; + } + + LED2_TOG(); +} + +/** + * @brief lin UART初始化 + * @param void + * @retval void + */ +void lin_uart_init(void) +{ + /* 初始化uart配置 */ + Uartx_Init(LIN_UART); + + /* 中断使能 */ + #if (AUTOBAUD == 1) + #else + /* 接收错误中断使能,用于同步判断 */ + FL_UART_EnableIT_RXError(LIN_UART); + #endif + /* 接收中断使能 */ + FL_UART_EnableIT_RXBuffFull(LIN_UART); + + FL_UART_EnableTX(LIN_UART); + #if (AUTOBAUD == 1) + #else + FL_UART_EnableRX(LIN_UART); + #endif +} + +/** + * @brief lin 任务初始化 + * @param void + * @retval void + */ +void lin_task_init(void) +{ + uint8_t i; + + /* 状态机相关初始化 */ + g_lin_task.frame_state = FRAME_STATE_IDLE; + g_lin_task.idle_timeout_cnt = LIN_IDLE_TIMEOUT; + + /* 帧数据初始化 */ + g_lin_task.lin_frame.rx_len = 0; + g_lin_task.lin_frame.tx_len = 0; + + /* 根据cmd计算pid */ + for (i = 0; i < TABLE_SIZE; i++) + { + scheduleTable[i].pid = calculatePID(scheduleTable[i].cmd); + } +} + +#if (AUTOBAUD == 1) +/** + * @brief GPTIM初始化 + * @param void + * @retval void + */ +void GPTIM_Init(void) +{ + FL_GPTIM_InitTypeDef timInit; + FL_GPTIM_IC_InitTypeDef timICInit; + FL_GPTIM_SlaveInitTypeDef timSlaveInit; + FL_GPIO_InitTypeDef gpioInit = {0}; + + gpioInit.pin = FL_GPIO_PIN_0; + gpioInit.mode = FL_GPIO_MODE_DIGITAL; + gpioInit.outputType = FL_GPIO_OUTPUT_PUSHPULL; + gpioInit.pull = FL_DISABLE; + gpioInit.remapPin = FL_ENABLE; + FL_GPIO_Init(GPIOD, &gpioInit); + + timInit.prescaler = LIN_CAPTURE_TIMER_PSC - 1; /* 分频系数1 */ + timInit.counterMode = FL_GPTIM_COUNTER_DIR_UP; /* 向上计数 */ + timInit.autoReload = 65535; /* 自动重装载值65536 */ + timInit.clockDivision = FL_GPTIM_CLK_DIVISION_DIV1; /* 死区和滤波分频 */ + timInit.autoReloadState = FL_ENABLE; /* 预装载preload使能 */ + FL_GPTIM_Init(GPTIM2, &timInit); + + timSlaveInit.slaveMode = FL_GPTIM_SLAVE_MODE_TRGI_RISE_RST; /* 从机复位模式,用于配制PWM输入捕获 */ + timSlaveInit.triggerSrc = FL_GPTIM_TIM_TS_TI1FP1; /* 触发源选择 TI1FP1 */ + timSlaveInit.triggerDelay = FL_DISABLE; /* TRGI延迟禁止 */ + FL_GPTIM_SlaveMode_Init(GPTIM2, &timSlaveInit); + + timICInit.ICPolarity = FL_GPTIM_IC_POLARITY_INVERT; /* 下降沿捕获 */ + timICInit.ICActiveInput = FL_GPTIM_CHANNEL_MODE_INPUT_NORMAL; /* CC1配置为输入,IC1映射到TI1 */ + timICInit.ICPrescaler = FL_GPTIM_IC_PSC_DIV1; /* 输入捕捉分频 */ + timICInit.ICFilter = FL_GPTIM_IC_FILTER_DIV1; /* 输入捕捉滤波配置 */ + timICInit.captureState = FL_ENABLE; /* 使能CC1通道 */ + FL_GPTIM_IC_Init(GPTIM2, FL_GPTIM_CHANNEL_1, &timICInit); + + timICInit.ICPolarity = FL_GPTIM_IC_POLARITY_NORMAL; /* 上升沿捕获 */ + timICInit.ICActiveInput = FL_ATIM_CHANNEL_MODE_INPUT_CROSSOVER; /* CC1配置为输入,IC1映射到TI1 */ + FL_GPTIM_IC_Init(GPTIM2, FL_GPTIM_CHANNEL_2, &timICInit); + + GPTIM2->ISR = LIN_GPTIM2_ISR_MASK; + + /* 中断优先级配置 */ + NVIC_ClearPendingIRQ(GPTIM2_IRQn); + NVIC_DisableIRQ(GPTIM2_IRQn); + NVIC_SetPriority(GPTIM2_IRQn, LIN_GPITM2_IRQ_PRI); + NVIC_EnableIRQ(GPTIM2_IRQn); + + FL_GPTIM_ClearFlag_CC(GPTIM2, FL_GPTIM_CHANNEL_1); /* 清除CC1捕捉标志 */ + FL_GPTIM_EnableIT_CC(GPTIM2, FL_GPTIM_CHANNEL_1); /* 使能CC1捕捉中断 */ + + FL_GPTIM_Enable(GPTIM2); /* 使能定时器 */ +} +#endif + +/** + * @brief LIN初始化 + * @param void + * @retval void + */ +void lin_init(void) +{ + lin_task_init(); + lin_slp_pin_init(); + lin_uart_init(); + #if (AUTOBAUD == 1) + GPTIM_Init(); + #endif + lin_timeout_init(); +} + +#if (SLEEP_SUPPORT == 1) + +/** + * @brief LIN休眠前初始化 + * @param void + * @retval void + */ +void lin_sleep_init(void) +{ + /* 清除和关闭非唤醒源中断 */ + Close_And_ClearIRQ(BSTIM_IRQn); + + /* 关闭UART接收功能 */ + LIN_UART->CSR &= ~UART_CSR_RXEN_Msk; + Close_And_ClearIRQ(LIN_UART_IRQType); + + #if (AUTOBAUD == 1) + + /* 禁能定时器 */ + GPTIM2->CR1 &= ~GPTIM_CR1_CEN_Msk; + /* 提前配置唤醒后状态 */ + GPTIM2->CCER |= GPTIM_CCER_CCIP; + + Close_And_ClearIRQ(GPTIM2_IRQn); + #else + + #endif +} + +/** + * @brief LIN唤醒后初始化 + * @param void + * @retval void + */ +void lin_awake_init(void) +{ + g_lin_task.lin_frame.tx_len = 0; + g_lin_task.lin_frame.rx_len = 0; + g_lin_task.frame_state = FRAME_STATE_IDLE; + g_lin_task.idle_timeout_cnt = LIN_IDLE_TIMEOUT; + + UARTxOp.RxLen = 0; + UARTxOp.TxLen = 0; + + #if (AUTOBAUD == 1) + LinSampleCounter = 0; + + /* 初始化同步步骤 */ + g_lin_task.syn_step = SYN_STEP_WAIT_BREAK; + + g_awake_init = 1; + NVIC_EnableIRQ(LIN_UART_IRQType); + #endif + + /* 使能非唤醒源中断 */ + NVIC_EnableIRQ(BSTIM_IRQn); +} + +/** + * @brief LIN sleep判断 + * @param void + * @retval 1: Sleep + * 0: Wake + */ +uint8_t lin_is_sleep(void) +{ + if (g_lin_task.frame_state == FRAME_STATE_SLEEP) + { + return 1; + } + else + { + return 0; + } +} +#endif /* End #if (SLEEP_SUPPORT == 1) */ + + +void GetMasterData(uint8_t *buf) +{ + +} + diff --git a/LIN Slave/Src/main.c b/LIN Slave/Src/main.c new file mode 100644 index 0000000..e753029 --- /dev/null +++ b/LIN Slave/Src/main.c @@ -0,0 +1,43 @@ +#include "main.h" +#include "uart.h" +#include "lin.h" +#include "user_init.h" +#include "sleep.h" + +int main(void) +{ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + /* SHOULD BE KEPT!!! */ + MF_Clock_Init(); + + /* Configure the system clock */ + /* SHOULD BE KEPT!!! */ + MF_SystemClock_Config(); + + /* Initialize FL Driver Library */ + /* SHOULD BE KEPT!!! */ + FL_Init(); + + /* Initialize all configured peripherals */ + /* SHOULD BE KEPT!!! */ + MF_Config_Init(); + + /* 用户参数配置 */ + UserInit(); + + /* LIN初始化 */ + lin_init(); + + while(1) + { + #if (0) + if (lin_is_sleep()) + { + sleep(); + } + #endif + ; + } +} + + diff --git a/LIN Slave/Src/sleep.c b/LIN Slave/Src/sleep.c new file mode 100644 index 0000000..4bf5642 --- /dev/null +++ b/LIN Slave/Src/sleep.c @@ -0,0 +1,156 @@ +#include "main.h" +#include "user_init.h" +#include "uart.h" +#include "lin.h" +#include "sleep.h" + +#if (SLEEP_SUPPORT == 1) +uint8_t g_awake_init = 0; + +/** + * @brief LIN RX引脚GPIO中断初始化 + * @param void + * @retval void + */ +void GPIO_interrupt_init(void) +{ + FL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* 引脚边沿触发选择 */ + FL_CMU_EnableEXTIOnSleep(); /* 休眠使能外部中断采样 */ + FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_EXTI);/* EXTI工作时钟使能 */ + + /* 用到的GPIO引脚 设为输入 */ + GPIO_InitStruct.pin = LIN_UART_RX_PIN; + GPIO_InitStruct.mode = FL_GPIO_MODE_INPUT; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_DISABLE; + GPIO_InitStruct.remapPin = FL_DISABLE; + FL_GPIO_Init(LIN_UART_RX_GPIO, &GPIO_InitStruct); + + FL_GPIO_SetTriggerEdge0(GPIO, LIN_RX_EXTI_LINE, FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE); /* 关闭边沿触发 */ + + /* 每条LINE只能选择一个引脚 */ + FL_GPIO_SetExtiLine12(GPIO, LIN_RX_EXTI_LINE_PIN); /* 中断引脚选择 */ + FL_GPIO_EnableDigitalFilter(GPIO, LIN_RX_EXTI_LINE); /* EXTI数字滤波功能 */ + FL_GPIO_SetTriggerEdge0(GPIO, LIN_RX_EXTI_LINE, FL_GPIO_EXTI_TRIGGER_EDGE_FALLING); /* 边沿选择 */ + FL_GPIO_ClearFlag_EXTI(GPIO, LIN_RX_EXTI_LINE); /* 清除中断标志 */ + + /* NVIC中断配置 */ + NVIC_DisableIRQ(GPIO_IRQn); + NVIC_SetPriority(GPIO_IRQn, LIN_GPIO_IRQ_PRI); + NVIC_EnableIRQ(GPIO_IRQn); +} + +/** + * @brief LIN Sleep切换 + * @param void + * @retval void + */ +void prepare_sleep(void) +{ + lin_sleep_init(); + + /* 切换Rx引脚为GPIO, 使能中断唤醒 */ + GPIO_interrupt_init(); +} + +/** + * @brief 进入 Sleep + * @param void + * @retval void + */ +void enter_sleep(void) +{ + FL_PMU_SleepInitTypeDef LPM_InitStruct; + + LED_R_ON(); + + LPM_InitStruct.deepSleep = FL_PMU_SLEEP_MODE_NORMAL; + LPM_InitStruct.powerMode = FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP; + LPM_InitStruct.wakeupFrequency = FL_PMU_RCHF_WAKEUP_FREQ_8MHZ; + LPM_InitStruct.wakeupDelay = FL_PMU_WAKEUP_DELAY_2US; + LPM_InitStruct.LDOLowPowerMode = FL_PMU_LDO_LPM_DISABLE; + LPM_InitStruct.coreVoltageScaling = FL_DISABLE; + FL_PMU_Sleep_Init(PMU, &LPM_InitStruct); + + //FL_CMU_RCLF_Enable(); /* 暂开启RCLF */ + FL_RMU_PDR_Enable(RMU); /* 打开PDR */ + FL_RMU_BOR_Disable(RMU); /* 关闭BOR 2uA */ + FL_VREF_Disable(VREF); /* 关闭VREF1p2 */ + FL_CDIF_DisableCPUToVAO(CDIF); /* 关闭CPU到VAO的通道 */ + + /* 睡眠电源模式*/ + FL_PMU_SetLowPowerMode(PMU, FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP); + __WFI(); //休眠 + + FL_VREF_Enable(VREF); //使能VREF1p2 +} + +/** + * @brief GPIO中断 + * @note 唤醒后配置 + * @param void + * @retval void + */ +void GPIO_IRQHandler(void) +{ + if(GPIO->EXTIISR & LIN_RX_EXTI_LINE) + { + LED0_TOG(); + + /* 第一时间将接收引脚切换为数字功能, 开始GPTIM输入捕获*/ + LIN_UART_RX_GPIO->FCR &= ~LIN_UART_RX_PIN_FCR_MASK; + LIN_UART_RX_GPIO->FCR |= LIN_UART_RX_PIN_FCR_DIGIT; + + #if (AUTOBAUD == 1) + /* 引脚重配置为GPTIM输入 */ + LIN_UART_RX_GPIO->DFS |= LIN_UART_RX_PIN; + + /* 清中断标志, 使能GPTIM2中断 */ + GPTIM2->ISR = LIN_GPTIM2_ISR_MASK; + NVIC_ClearPendingIRQ(GPTIM2_IRQn); + NVIC_EnableIRQ(GPTIM2_IRQn); + + /* 使能定时器 */ + GPTIM2->CR1 |= GPTIM_CR1_CEN_Msk; + #else + /* 引脚重置为UART Rx */ + LIN_UART_RX_GPIO->DFS &= ~LIN_UART_RX_PIN; + + /* 清除UART中断标志, 使能UART接收中断 */ + LIN_UART->ISR = LIN_UART->ISR; + NVIC_ClearPendingIRQ(LIN_UART_IRQType); + NVIC_EnableIRQ(LIN_UART_IRQType); + + /* 使能UART接收功能 */ + LIN_UART->CSR |= UART_CSR_RXEN_Msk; + #endif + + LED0_TOG(); + + /* lin唤醒后配置 */ + lin_awake_init(); + + LED_R_OFF(); + LED0_TOG(); + + /* 清中断标志, 关闭GPIO中断 */ + GPIO->EXTIISR = LIN_RX_EXTI_LINE; + FL_GPIO_SetTriggerEdge0(GPIO, LIN_RX_EXTI_LINE, FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE); + NVIC_ClearPendingIRQ(GPIO_IRQn); + } +} + +/** + * @brief lin Sleep + * @param void + * @retval void + */ +void sleep(void) +{ + prepare_sleep(); + enter_sleep(); +} +#endif /* End #if (SLEEP_SUPPORT == 1) */ + diff --git a/LIN Slave/Src/uart.c b/LIN Slave/Src/uart.c new file mode 100644 index 0000000..f512705 --- /dev/null +++ b/LIN Slave/Src/uart.c @@ -0,0 +1,168 @@ +#include "main.h" +#include "uart.h" +#include "lin.h" +#include "user_init.h" + +struct UARTOpStruct UARTxOp; + +/** + * @brief UART初始化 + * @param UARTx: 串口选择 + * @retval void + */ +void Uartx_Init(UART_Type *UARTx) +{ + FL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + FL_UART_InitTypeDef UART_InitStruct = {0}; + + switch ((uint32_t)UARTx) + { + + case UART0_BASE: + /* PA13:UART0-RX PA14:UART0-TX */ + GPIO_InitStruct.pin = FL_GPIO_PIN_13 | FL_GPIO_PIN_14; + GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_OPENDRAIN; /* 推挽输出 */ + GPIO_InitStruct.pull = FL_ENABLE; + GPIO_InitStruct.remapPin = FL_DISABLE; + GPIO_InitStruct.analogSwitch = FL_DISABLE; + FL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* PA2:UART0-RX PA3:UART0-TX */ + // GPIO_InitStruct.pin = FL_GPIO_PIN_2|FL_GPIO_PIN_3; + // GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; + // GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + // GPIO_InitStruct.pull = FL_DISABLE; + // GPIO_InitStruct.remapPin = FL_DISABLE; + // GPIO_InitStruct.analogSwitch = FL_DISABLE; + // FL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + UART_InitStruct.clockSrc = FL_CMU_UART0_CLK_SOURCE_APBCLK; + /* NVIC中断配置 */ + NVIC_DisableIRQ(UART0_IRQn); + NVIC_SetPriority(UART0_IRQn, 2); /* 中断优先级配置 */ + NVIC_EnableIRQ(UART0_IRQn); + break; + + case UART1_BASE: + /* PB13:UART1-RX PB14:UART1-TX */ + // GPIO_InitStruct.pin = FL_GPIO_PIN_13|FL_GPIO_PIN_14; + // GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; + // GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + // GPIO_InitStruct.pull = FL_ENABLE; + // GPIO_InitStruct.remapPin = FL_DISABLE; + // GPIO_InitStruct.analogSwitch = FL_DISABLE; + // FL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* PC2:UART1-RX PC3:UART1-TX */ + GPIO_InitStruct.pin = FL_GPIO_PIN_2 | FL_GPIO_PIN_3; + GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_OPENDRAIN; + GPIO_InitStruct.pull = FL_ENABLE; + GPIO_InitStruct.remapPin = FL_DISABLE; + GPIO_InitStruct.analogSwitch = FL_DISABLE; + FL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + UART_InitStruct.clockSrc = FL_CMU_UART1_CLK_SOURCE_APBCLK; + /* NVIC中断配置 */ + NVIC_DisableIRQ(UART1_IRQn); + NVIC_SetPriority(UART1_IRQn, 2); /* 中断优先级配置 */ + NVIC_EnableIRQ(UART1_IRQn); + break; + + case UART3_BASE: + /* PB0:UART3-RX PB1:UART3-TX */ + GPIO_InitStruct.pin = FL_GPIO_PIN_0 | FL_GPIO_PIN_1; + GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_OPENDRAIN; + GPIO_InitStruct.pull = FL_ENABLE; + GPIO_InitStruct.remapPin = FL_ENABLE; + GPIO_InitStruct.analogSwitch = FL_DISABLE; + FL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* PD7:UART3-RX PD8:UART3-TX */ + // GPIO_InitStruct.pin = FL_GPIO_PIN_7|FL_GPIO_PIN_8; + // GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; + // GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + // GPIO_InitStruct.pull = FL_DISABLE; + // GPIO_InitStruct.remapPin = FL_ENABLE; + // GPIO_InitStruct.analogSwitch = FL_DISABLE; + // FL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* NVIC中断配置 */ + NVIC_DisableIRQ(UART3_IRQn); + NVIC_SetPriority(UART3_IRQn, 2); /* 中断优先级配置 */ + NVIC_EnableIRQ(UART3_IRQn); + break; + + + case UART4_BASE: + /* PB2:UART4-RX PB3:UART4-TX */ + GPIO_InitStruct.pin = FL_GPIO_PIN_2 | FL_GPIO_PIN_3; + GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_OPENDRAIN; + GPIO_InitStruct.pull = FL_ENABLE; + GPIO_InitStruct.remapPin = FL_DISABLE; + GPIO_InitStruct.analogSwitch = FL_DISABLE; + FL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* PA0:UART4-RX PA1:UART4-TX */ + // GPIO_InitStruct.pin = FL_GPIO_PIN_0|FL_GPIO_PIN_1; + // GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; + // GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + // GPIO_InitStruct.pull = FL_DISABLE; + // GPIO_InitStruct.remapPin = FL_DISABLE; + // GPIO_InitStruct.analogSwitch = FL_DISABLE; + // FL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* NVIC中断配置 */ + NVIC_DisableIRQ(UART4_IRQn); + NVIC_SetPriority(UART4_IRQn, 2); /* 中断优先级配置 */ + NVIC_EnableIRQ(UART4_IRQn); + break; + + case UART5_BASE: + /* PD0:UART5-RX PD1:UART5-TX */ + GPIO_InitStruct.pin = FL_GPIO_PIN_0; + GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_ENABLE; + GPIO_InitStruct.remapPin = FL_DISABLE; + GPIO_InitStruct.analogSwitch = FL_DISABLE; + FL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + GPIO_InitStruct.pin = FL_GPIO_PIN_1; + GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_DISABLE; + GPIO_InitStruct.remapPin = FL_DISABLE; + GPIO_InitStruct.analogSwitch = FL_DISABLE; + FL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* PC4:UART5-RX PC5:UART5-TX */ + // GPIO_InitStruct.pin = FL_GPIO_PIN_4|FL_GPIO_PIN_5; + // GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; + // GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + // GPIO_InitStruct.pull = FL_DISABLE; + // GPIO_InitStruct.remapPin = FL_DISABLE; + // GPIO_InitStruct.analogSwitch = FL_DISABLE; + // FL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* NVIC中断配置 */ + NVIC_DisableIRQ(UART5_IRQn); + NVIC_SetPriority(UART5_IRQn, LIN_UART_IRQ_PRI); /* 中断优先级配置 */ + NVIC_EnableIRQ(UART5_IRQn); + break; + + default: + break; + } + + UART_InitStruct.baudRate = LIN_BAUDRATE; /* 波特率 */ + UART_InitStruct.dataWidth = FL_UART_DATA_WIDTH_8B; /* 数据位数 */ + UART_InitStruct.stopBits = FL_UART_STOP_BIT_WIDTH_1B; /* 停止位 */ + UART_InitStruct.parity = FL_UART_PARITY_NONE; /* 奇偶校验 */ + UART_InitStruct.transferDirection = FL_UART_DIRECTION_TX; /* FL_UART_DIRECTION_TX_RX //接收-发送使能 */ + FL_UART_Init(UARTx, &UART_InitStruct); +} + diff --git a/LIN Slave/Src/user_init.c b/LIN Slave/Src/user_init.c new file mode 100644 index 0000000..ebccfdc --- /dev/null +++ b/LIN Slave/Src/user_init.c @@ -0,0 +1,254 @@ +#include "user_init.h" +#include "uart.h" +#include "lin.h" + +/** + * @brief 将RCHF配置为系统时钟源 + * 当系统时钟频率超过32MHz时,必须使能预取指令 + * 当系统时钟频率超过8NHz时,访问跨电源接口(CDIF)外设时钟必须分频 + * @param clock: RCHF振荡频率值 + * @retval void + */ +void ClockInit(uint32_t clock) +{ + FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_2CYCLE); + switch (clock) + { + case FL_CMU_RCHF_FREQUENCY_8MHZ: + FL_CMU_RCHF_WriteTrimValue(RCHF8M_TRIM); + FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_0CYCLE); + FL_CDIF_SetPrescaler(CDIF, FL_CDIF_PSC_DIV1); + break; + + case FL_CMU_RCHF_FREQUENCY_16MHZ: + FL_CMU_RCHF_WriteTrimValue(RCHF16M_TRIM); + FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_0CYCLE); + FL_CDIF_SetPrescaler(CDIF, FL_CDIF_PSC_DIV2); + break; + + case FL_CMU_RCHF_FREQUENCY_24MHZ: + FL_CMU_RCHF_WriteTrimValue(RCHF24M_TRIM); + FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_0CYCLE); + FL_CDIF_SetPrescaler(CDIF, FL_CDIF_PSC_DIV4); + break; + + case FL_CMU_RCHF_FREQUENCY_32MHZ: + FL_CMU_RCHF_WriteTrimValue(RCHF32M_TRIM); + FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_1CYCLE); + FL_CDIF_SetPrescaler(CDIF, FL_CDIF_PSC_DIV4); + break; + + default: + FL_CMU_RCHF_WriteTrimValue(RCHF8M_TRIM); + FL_FLASH_SetReadWait(FLASH, FL_FLASH_READ_WAIT_0CYCLE); + FL_CDIF_SetPrescaler(CDIF, FL_CDIF_PSC_DIV1); + break; + } + + FL_CMU_RCHF_SetFrequency(clock); + FL_CMU_SetSystemClockSource(FL_CMU_SYSTEM_CLK_SOURCE_RCHF); +} + +/** + * @brief 系统时钟输出IO配置: + * 可配置输出为XTLF、RCLP、RCHF和AHB等 + * @param void + * @retval void + */ +void FoutInit(void) +{ + FL_GPIO_InitTypeDef init = {0}; + + init.pin = FL_GPIO_PIN_11; + init.mode = FL_GPIO_MODE_DIGITAL; + init.outputType = FL_GPIO_OUTPUT_PUSHPULL; + init.pull = FL_DISABLE; + FL_GPIO_Init(GPIOD, &init); + + FL_GPIO_SetFOUT0(GPIO, FL_GPIO_FOUT0_SELECT_AHBCLK_DIV64); +} + +#ifndef MFANG + +#ifdef __CC_ARM +#pragma import(__use_no_semihosting) +//标准库需要的支持函数 +struct __FILE +{ + int handle; +}; +FILE __stdout; +#endif + +//定义_sys_exit()以避免使用半主机模式 +void _sys_exit(int x) +{ + x = x; +} + +//重定义fputc函数 +int fputc(int ch, FILE *f) +{ + FL_UART_WriteTXBuff(UART0, (uint8_t)ch); + while (FL_UART_IsActiveFlag_TXBuffEmpty(UART0) != FL_SET); + return ch; +} + +/** + * @brief Debug输出串口配置 + * @param void + * @retval void + */ +void DebugUartInit(void) +{ + FL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + FL_UART_InitTypeDef UART_InitStruct = {0}; + + //PA13:UART0-RX PA14:UART0-TX + GPIO_InitStruct.pin = FL_GPIO_PIN_13 | FL_GPIO_PIN_14; + GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_ENABLE; + GPIO_InitStruct.remapPin = FL_DISABLE; + FL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + UART_InitStruct.clockSrc = FL_CMU_UART0_CLK_SOURCE_APBCLK; + + UART_InitStruct.baudRate = 115200; //波特率 + UART_InitStruct.dataWidth = FL_UART_DATA_WIDTH_8B; //数据位数 + UART_InitStruct.stopBits = FL_UART_STOP_BIT_WIDTH_1B; //停止位 + UART_InitStruct.parity = FL_UART_PARITY_EVEN; //奇偶校验 + UART_InitStruct.transferDirection = FL_UART_DIRECTION_TX_RX; //接收-发送使能 + FL_UART_Init(UART0, &UART_InitStruct); +} + +/** + * @brief LED配置 + * @param void + * @retval void + */ +void LedInit(void) +{ + uint8_t count = 5; + + FL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + FL_GPIO_ResetOutputPin(LED0_GPIO, LED0_PIN); + FL_GPIO_ResetOutputPin(LED1_GPIO, LED1_PIN); + FL_GPIO_ResetOutputPin(LED2_GPIO, LED2_PIN); + FL_GPIO_ResetOutputPin(LED3_GPIO, LED3_PIN); + + GPIO_InitStruct.pin = LED0_PIN; + GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_DISABLE; + FL_GPIO_Init(LED0_GPIO, &GPIO_InitStruct); + + GPIO_InitStruct.pin = LED1_PIN; + GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_DISABLE; + FL_GPIO_Init(LED1_GPIO, &GPIO_InitStruct); + + GPIO_InitStruct.pin = LED2_PIN; + GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_DISABLE; + FL_GPIO_Init(LED2_GPIO, &GPIO_InitStruct); + + GPIO_InitStruct.pin = LED3_PIN; + GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_DISABLE; + FL_GPIO_Init(LED3_GPIO, &GPIO_InitStruct); + + FL_GPIO_SetOutputPin(LED_R_GPIO, LED_R_PIN); + FL_GPIO_SetOutputPin(LED_G_GPIO, LED_G_PIN); + FL_GPIO_SetOutputPin(LED_B_GPIO, LED_B_PIN); + + GPIO_InitStruct.pin = LED_R_PIN; + GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_DISABLE; + FL_GPIO_Init(LED_R_GPIO, &GPIO_InitStruct); + + GPIO_InitStruct.pin = LED_G_PIN; + GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_DISABLE; + FL_GPIO_Init(LED_G_GPIO, &GPIO_InitStruct); + + GPIO_InitStruct.pin = LED_B_PIN; + GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_DISABLE; + FL_GPIO_Init(LED_B_GPIO, &GPIO_InitStruct); + + while (count--) + { + LED0_ON(); + FL_DelayMs(100); + LED0_OFF(); + FL_DelayMs(100); + } +} +#endif + +/** + * @brief 配置系统主频为XTHF + * @param void + * @retval void + */ +void Clockchange(void) +{ + FL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* PC2.3配置成模拟功能,外接XTHF */ + GPIO_InitStruct.pin = FL_GPIO_PIN_2 | FL_GPIO_PIN_3; + GPIO_InitStruct.mode = FL_GPIO_MODE_ANALOG; + GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.pull = FL_DISABLE; + GPIO_InitStruct.remapPin = FL_DISABLE; + FL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* 使能XTHF */ + FL_CMU_XTHF_Enable(); + FL_CMU_XTHF_WriteDriverStrength(0x1F); /* 振荡强度最大 */ + FL_DelayMs(3); + + FL_CMU_SetSystemClockSource(FL_CMU_SYSTEM_CLK_SOURCE_XTHF); + FL_CMU_SetAHBPrescaler(FL_CMU_AHBCLK_PSC_DIV1); + FL_CMU_SetAPBPrescaler(FL_CMU_APBCLK_PSC_DIV1); + +} + +/** + * @brief NVIC中断关闭 + * @param void + * @retval void + */ +void Close_And_ClearIRQ(IRQn_Type IRQn) +{ + NVIC_DisableIRQ(IRQn); + NVIC_ClearPendingIRQ(IRQn); +} + +/** + * @brief 用户参数配置 + * @param void + * @retval void + */ +void UserInit(void) +{ +#ifndef MFANG + #if (MAIN_CLOCK == 16000000) + ClockInit(FL_CMU_RCHF_FREQUENCY_16MHZ); + #elif (MAIN_CLOCK == 24000000) + ClockInit(FL_CMU_RCHF_FREQUENCY_24MHZ); + #elif (MAIN_CLOCK == 32000000) + ClockInit(FL_CMU_RCHF_FREQUENCY_32MHZ); + #endif + LedInit(); + DebugUartInit(); +#endif +}