<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> | |||||
<storageModule moduleId="org.eclipse.cdt.core.settings"> | |||||
<cconfiguration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.384503242"> | |||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.384503242" moduleId="org.eclipse.cdt.core.settings" name="Debug"> | |||||
<externalSettings/> | |||||
<extensions> | |||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> | |||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
</extensions> | |||||
</storageModule> | |||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | |||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.384503242" name="Debug" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug"> | |||||
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.384503242." name="/" resourcePath=""> | |||||
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.1135663255" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug"> | |||||
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.1196330646" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.1062697435" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.278951780" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32F401RETx" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.1869787158" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.1306148405" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.660739989" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1749471754" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.771602116" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="NUCLEO-F401RE" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1323549252" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || NUCLEO-F401RE || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy || || || USE_HAL_DRIVER | STM32F401xE || || Drivers | Core/Startup | Core || || || ${workspace_loc:/${ProjName}/STM32F401RETX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || " valueType="string"/> | |||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.689670736" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/> | |||||
<builder buildPath="${workspace_loc:/RTC}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.801006825" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.92913197" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.728539098" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g3" valueType="enumerated"/> | |||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.606001816" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.620268744" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.1788575843" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g3" valueType="enumerated"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.1957220214" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false"/> | |||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.85362633" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols"> | |||||
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/> | |||||
<listOptionValue builtIn="false" value="STM32F401xE"/> | |||||
<listOptionValue builtIn="false" value="DEBUG"/> | |||||
</option> | |||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.1084237441" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath"> | |||||
<listOptionValue builtIn="false" value="../Core/Inc"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F4xx/Include"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/> | |||||
</option> | |||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.656117430" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.1866317829" name="MCU G++ Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.713176224" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g3" valueType="enumerated"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.423677586" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.244096316" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.88630647" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32F401RETX_FLASH.ld}" valueType="string"/> | |||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.1293267247" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input"> | |||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> | |||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/> | |||||
</inputType> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.1250781907" name="MCU G++ Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver.1964362684" name="MCU GCC Archiver" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size.593178747" name="MCU Size" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile.556394896" name="MCU Output Converter list file" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex.118701493" name="MCU Output Converter Hex" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary.786708453" name="MCU Output Converter Binary" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog.588963565" name="MCU Output Converter Verilog" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec.1843665460" name="MCU Output Converter Motorola S-rec" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.962553946" name="MCU Output Converter Motorola S-rec with symbols" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec"/> | |||||
</toolChain> | |||||
</folderInfo> | |||||
<sourceEntries> | |||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/> | |||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/> | |||||
</sourceEntries> | |||||
</configuration> | |||||
</storageModule> | |||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | |||||
</cconfiguration> | |||||
<cconfiguration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.385784560"> | |||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.385784560" moduleId="org.eclipse.cdt.core.settings" name="Release"> | |||||
<externalSettings/> | |||||
<extensions> | |||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> | |||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
</extensions> | |||||
</storageModule> | |||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | |||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.385784560" name="Release" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release"> | |||||
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.385784560." name="/" resourcePath=""> | |||||
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.1050105428" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release"> | |||||
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.2115789148" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.429209260" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.1731051426" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32F401RETx" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.1988897311" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.858529329" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.1702071327" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv4-sp-d16" valueType="enumerated"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.136052850" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.845380263" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="NUCLEO-F401RE" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1329066155" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || NUCLEO-F401RE || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy || || || USE_HAL_DRIVER | STM32F401xE || || Drivers | Core/Startup | Core || || || ${workspace_loc:/${ProjName}/STM32F401RETX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || " valueType="string"/> | |||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.565325187" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/> | |||||
<builder buildPath="${workspace_loc:/RTC}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.151093449" managedBuildOn="true" name="Gnu Make Builder.Release" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.2138585427" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.1326443522" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g0" valueType="enumerated"/> | |||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.1205196662" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1947899920" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.1585372535" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g0" valueType="enumerated"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.1457965149" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.os" valueType="enumerated"/> | |||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1021604525" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols"> | |||||
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/> | |||||
<listOptionValue builtIn="false" value="STM32F401xE"/> | |||||
</option> | |||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.150075823" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath"> | |||||
<listOptionValue builtIn="false" value="../Core/Inc"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32F4xx/Include"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/> | |||||
</option> | |||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1583488033" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.1709654350" name="MCU G++ Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.876219837" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g0" valueType="enumerated"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.1659735646" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.value.os" valueType="enumerated"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.1093061370" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1613761214" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32F401RETX_FLASH.ld}" valueType="string"/> | |||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.1719257212" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input"> | |||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> | |||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/> | |||||
</inputType> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.3502542" name="MCU G++ Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver.1140116331" name="MCU GCC Archiver" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size.1884069372" name="MCU Size" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile.1179424536" name="MCU Output Converter list file" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex.2052295902" name="MCU Output Converter Hex" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary.168071366" name="MCU Output Converter Binary" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog.824998438" name="MCU Output Converter Verilog" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec.1836975100" name="MCU Output Converter Motorola S-rec" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.893802430" name="MCU Output Converter Motorola S-rec with symbols" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec"/> | |||||
</toolChain> | |||||
</folderInfo> | |||||
<sourceEntries> | |||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/> | |||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/> | |||||
</sourceEntries> | |||||
</configuration> | |||||
</storageModule> | |||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | |||||
</cconfiguration> | |||||
</storageModule> | |||||
<storageModule moduleId="org.eclipse.cdt.core.pathentry"/> | |||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | |||||
<project id="RTC.null.523640061" name="RTC"/> | |||||
</storageModule> | |||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> | |||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> | |||||
<storageModule moduleId="scannerConfiguration"> | |||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> | |||||
<scannerConfigBuildInfo instanceId="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.385784560;com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.385784560.;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1947899920;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1583488033"> | |||||
<autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/> | |||||
</scannerConfigBuildInfo> | |||||
<scannerConfigBuildInfo instanceId="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.384503242;com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.384503242.;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.620268744;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.656117430"> | |||||
<autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/> | |||||
</scannerConfigBuildInfo> | |||||
</storageModule> | |||||
<storageModule moduleId="refreshScope"/> | |||||
</cproject> |
[PreviousLibFiles] | |||||
LibFiles=Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f401xe.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/tz_context.h; | |||||
[PreviousUsedCubeIDEFiles] | |||||
SourceFiles=Core\Src\main.c;Core\Src\stm32f4xx_it.c;Core\Src\stm32f4xx_hal_msp.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Core\Src/system_stm32f4xx.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Core\Src/system_stm32f4xx.c;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;; | |||||
HeaderPath=Drivers\STM32F4xx_HAL_Driver\Inc;Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;Drivers\CMSIS\Device\ST\STM32F4xx\Include;Drivers\CMSIS\Include;Core\Inc; | |||||
CDefines=USE_HAL_DRIVER;STM32F401xE;USE_HAL_DRIVER;USE_HAL_DRIVER; | |||||
[PreviousGenFiles] | |||||
AdvancedFolderStructure=true | |||||
HeaderFileListSize=3 | |||||
HeaderFiles#0=C:/Users/wuest/Desktop/Studium/Master/Sem2/Projekt/Arbeit/uC/Motorsteuerung/RTC/Core/Inc/stm32f4xx_it.h | |||||
HeaderFiles#1=C:/Users/wuest/Desktop/Studium/Master/Sem2/Projekt/Arbeit/uC/Motorsteuerung/RTC/Core/Inc/stm32f4xx_hal_conf.h | |||||
HeaderFiles#2=C:/Users/wuest/Desktop/Studium/Master/Sem2/Projekt/Arbeit/uC/Motorsteuerung/RTC/Core/Inc/main.h | |||||
HeaderFolderListSize=1 | |||||
HeaderPath#0=C:/Users/wuest/Desktop/Studium/Master/Sem2/Projekt/Arbeit/uC/Motorsteuerung/RTC/Core/Inc | |||||
HeaderFiles=; | |||||
SourceFileListSize=3 | |||||
SourceFiles#0=C:/Users/wuest/Desktop/Studium/Master/Sem2/Projekt/Arbeit/uC/Motorsteuerung/RTC/Core/Src/stm32f4xx_it.c | |||||
SourceFiles#1=C:/Users/wuest/Desktop/Studium/Master/Sem2/Projekt/Arbeit/uC/Motorsteuerung/RTC/Core/Src/stm32f4xx_hal_msp.c | |||||
SourceFiles#2=C:/Users/wuest/Desktop/Studium/Master/Sem2/Projekt/Arbeit/uC/Motorsteuerung/RTC/Core/Src/main.c | |||||
SourceFolderListSize=1 | |||||
SourcePath#0=C:/Users/wuest/Desktop/Studium/Master/Sem2/Projekt/Arbeit/uC/Motorsteuerung/RTC/Core/Src | |||||
SourceFiles=; | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<projectDescription> | |||||
<name>RTC</name> | |||||
<comment></comment> | |||||
<projects> | |||||
</projects> | |||||
<buildSpec> | |||||
<buildCommand> | |||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> | |||||
<triggers>clean,full,incremental,</triggers> | |||||
<arguments> | |||||
</arguments> | |||||
</buildCommand> | |||||
<buildCommand> | |||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> | |||||
<triggers>full,incremental,</triggers> | |||||
<arguments> | |||||
</arguments> | |||||
</buildCommand> | |||||
</buildSpec> | |||||
<natures> | |||||
<nature>com.st.stm32cube.ide.mcu.MCUProjectNature</nature> | |||||
<nature>com.st.stm32cube.ide.mcu.MCUCubeProjectNature</nature> | |||||
<nature>org.eclipse.cdt.core.cnature</nature> | |||||
<nature>com.st.stm32cube.ide.mcu.MCUCubeIdeServicesRevAev2ProjectNature</nature> | |||||
<nature>com.st.stm32cube.ide.mcu.MCUAdvancedStructureProjectNature</nature> | |||||
<nature>com.st.stm32cube.ide.mcu.MCUEndUserDisabledTrustZoneProjectNature</nature> | |||||
<nature>com.st.stm32cube.ide.mcu.MCUSingleCpuProjectNature</nature> | |||||
<nature>com.st.stm32cube.ide.mcu.MCURootProjectNature</nature> | |||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> | |||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> | |||||
</natures> | |||||
</projectDescription> |
/* USER CODE BEGIN Header */ | |||||
/** | |||||
****************************************************************************** | |||||
* @file : main.h | |||||
* @brief : Header for main.c file. | |||||
* This file contains the common defines of the application. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2021 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 */ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __MAIN_H | |||||
#define __MAIN_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal.h" | |||||
/* 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 -----------------------------------------------------------*/ | |||||
#define B1_Pin GPIO_PIN_13 | |||||
#define B1_GPIO_Port GPIOC | |||||
#define USART_TX_Pin GPIO_PIN_2 | |||||
#define USART_TX_GPIO_Port GPIOA | |||||
#define USART_RX_Pin GPIO_PIN_3 | |||||
#define USART_RX_GPIO_Port GPIOA | |||||
#define LD2_Pin GPIO_PIN_5 | |||||
#define LD2_GPIO_Port GPIOA | |||||
#define TMS_Pin GPIO_PIN_13 | |||||
#define TMS_GPIO_Port GPIOA | |||||
#define TCK_Pin GPIO_PIN_14 | |||||
#define TCK_GPIO_Port GPIOA | |||||
#define SWO_Pin GPIO_PIN_3 | |||||
#define SWO_GPIO_Port GPIOB | |||||
/* USER CODE BEGIN Private defines */ | |||||
/* USER CODE END Private defines */ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __MAIN_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_conf_template.h | |||||
* @author MCD Application Team | |||||
* @brief HAL configuration template file. | |||||
* This file should be copied to the application folder and renamed | |||||
* to stm32f4xx_hal_conf.h. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_HAL_CONF_H | |||||
#define __STM32F4xx_HAL_CONF_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/* ########################## Module Selection ############################## */ | |||||
/** | |||||
* @brief This is the list of modules to be used in the HAL driver | |||||
*/ | |||||
#define HAL_MODULE_ENABLED | |||||
/* #define HAL_ADC_MODULE_ENABLED */ | |||||
/* #define HAL_CRYP_MODULE_ENABLED */ | |||||
/* #define HAL_CAN_MODULE_ENABLED */ | |||||
/* #define HAL_CRC_MODULE_ENABLED */ | |||||
/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ | |||||
/* #define HAL_CRYP_MODULE_ENABLED */ | |||||
/* #define HAL_DAC_MODULE_ENABLED */ | |||||
/* #define HAL_DCMI_MODULE_ENABLED */ | |||||
/* #define HAL_DMA2D_MODULE_ENABLED */ | |||||
/* #define HAL_ETH_MODULE_ENABLED */ | |||||
/* #define HAL_NAND_MODULE_ENABLED */ | |||||
/* #define HAL_NOR_MODULE_ENABLED */ | |||||
/* #define HAL_PCCARD_MODULE_ENABLED */ | |||||
/* #define HAL_SRAM_MODULE_ENABLED */ | |||||
/* #define HAL_SDRAM_MODULE_ENABLED */ | |||||
/* #define HAL_HASH_MODULE_ENABLED */ | |||||
/* #define HAL_I2C_MODULE_ENABLED */ | |||||
/* #define HAL_I2S_MODULE_ENABLED */ | |||||
/* #define HAL_IWDG_MODULE_ENABLED */ | |||||
/* #define HAL_LTDC_MODULE_ENABLED */ | |||||
/* #define HAL_RNG_MODULE_ENABLED */ | |||||
#define HAL_RTC_MODULE_ENABLED | |||||
/* #define HAL_SAI_MODULE_ENABLED */ | |||||
/* #define HAL_SD_MODULE_ENABLED */ | |||||
/* #define HAL_MMC_MODULE_ENABLED */ | |||||
/* #define HAL_SPI_MODULE_ENABLED */ | |||||
/* #define HAL_TIM_MODULE_ENABLED */ | |||||
#define HAL_UART_MODULE_ENABLED | |||||
/* #define HAL_USART_MODULE_ENABLED */ | |||||
/* #define HAL_IRDA_MODULE_ENABLED */ | |||||
/* #define HAL_SMARTCARD_MODULE_ENABLED */ | |||||
/* #define HAL_SMBUS_MODULE_ENABLED */ | |||||
/* #define HAL_WWDG_MODULE_ENABLED */ | |||||
/* #define HAL_PCD_MODULE_ENABLED */ | |||||
/* #define HAL_HCD_MODULE_ENABLED */ | |||||
/* #define HAL_DSI_MODULE_ENABLED */ | |||||
/* #define HAL_QSPI_MODULE_ENABLED */ | |||||
/* #define HAL_QSPI_MODULE_ENABLED */ | |||||
/* #define HAL_CEC_MODULE_ENABLED */ | |||||
/* #define HAL_FMPI2C_MODULE_ENABLED */ | |||||
/* #define HAL_SPDIFRX_MODULE_ENABLED */ | |||||
/* #define HAL_DFSDM_MODULE_ENABLED */ | |||||
/* #define HAL_LPTIM_MODULE_ENABLED */ | |||||
#define HAL_GPIO_MODULE_ENABLED | |||||
#define HAL_EXTI_MODULE_ENABLED | |||||
#define HAL_DMA_MODULE_ENABLED | |||||
#define HAL_RCC_MODULE_ENABLED | |||||
#define HAL_FLASH_MODULE_ENABLED | |||||
#define HAL_PWR_MODULE_ENABLED | |||||
#define HAL_CORTEX_MODULE_ENABLED | |||||
/* ########################## HSE/HSI Values adaptation ##################### */ | |||||
/** | |||||
* @brief Adjust the value of External High Speed oscillator (HSE) used in your application. | |||||
* This value is used by the RCC HAL module to compute the system frequency | |||||
* (when HSE is used as system clock source, directly or through the PLL). | |||||
*/ | |||||
#if !defined (HSE_VALUE) | |||||
#define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ | |||||
#endif /* HSE_VALUE */ | |||||
#if !defined (HSE_STARTUP_TIMEOUT) | |||||
#define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ | |||||
#endif /* HSE_STARTUP_TIMEOUT */ | |||||
/** | |||||
* @brief Internal High Speed oscillator (HSI) value. | |||||
* This value is used by the RCC HAL module to compute the system frequency | |||||
* (when HSI is used as system clock source, directly or through the PLL). | |||||
*/ | |||||
#if !defined (HSI_VALUE) | |||||
#define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ | |||||
#endif /* HSI_VALUE */ | |||||
/** | |||||
* @brief Internal Low Speed oscillator (LSI) value. | |||||
*/ | |||||
#if !defined (LSI_VALUE) | |||||
#define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ | |||||
#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz | |||||
The real value may vary depending on the variations | |||||
in voltage and temperature.*/ | |||||
/** | |||||
* @brief External Low Speed oscillator (LSE) value. | |||||
*/ | |||||
#if !defined (LSE_VALUE) | |||||
#define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ | |||||
#endif /* LSE_VALUE */ | |||||
#if !defined (LSE_STARTUP_TIMEOUT) | |||||
#define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ | |||||
#endif /* LSE_STARTUP_TIMEOUT */ | |||||
/** | |||||
* @brief External clock source for I2S peripheral | |||||
* This value is used by the I2S HAL module to compute the I2S clock source | |||||
* frequency, this source is inserted directly through I2S_CKIN pad. | |||||
*/ | |||||
#if !defined (EXTERNAL_CLOCK_VALUE) | |||||
#define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/ | |||||
#endif /* EXTERNAL_CLOCK_VALUE */ | |||||
/* Tip: To avoid modifying this file each time you need to use different HSE, | |||||
=== you can define the HSE value in your toolchain compiler preprocessor. */ | |||||
/* ########################### System Configuration ######################### */ | |||||
/** | |||||
* @brief This is the HAL system configuration section | |||||
*/ | |||||
#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ | |||||
#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ | |||||
#define USE_RTOS 0U | |||||
#define PREFETCH_ENABLE 1U | |||||
#define INSTRUCTION_CACHE_ENABLE 1U | |||||
#define DATA_CACHE_ENABLE 1U | |||||
#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ | |||||
#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ | |||||
#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ | |||||
#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ | |||||
#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ | |||||
#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ | |||||
#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ | |||||
#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ | |||||
#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ | |||||
#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ | |||||
#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ | |||||
#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ | |||||
#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ | |||||
#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ | |||||
#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ | |||||
#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ | |||||
#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ | |||||
#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ | |||||
#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ | |||||
#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ | |||||
#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ | |||||
#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ | |||||
#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ | |||||
#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ | |||||
#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ | |||||
#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ | |||||
#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ | |||||
#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ | |||||
#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ | |||||
#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ | |||||
#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ | |||||
#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ | |||||
#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ | |||||
#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ | |||||
#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ | |||||
#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ | |||||
#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ | |||||
#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ | |||||
/* ########################## Assert Selection ############################## */ | |||||
/** | |||||
* @brief Uncomment the line below to expanse the "assert_param" macro in the | |||||
* HAL drivers code | |||||
*/ | |||||
/* #define USE_FULL_ASSERT 1U */ | |||||
/* ################## Ethernet peripheral configuration ##################### */ | |||||
/* Section 1 : Ethernet peripheral configuration */ | |||||
/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ | |||||
#define MAC_ADDR0 2U | |||||
#define MAC_ADDR1 0U | |||||
#define MAC_ADDR2 0U | |||||
#define MAC_ADDR3 0U | |||||
#define MAC_ADDR4 0U | |||||
#define MAC_ADDR5 0U | |||||
/* Definition of the Ethernet driver buffers size and count */ | |||||
#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ | |||||
#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ | |||||
#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ | |||||
#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ | |||||
/* Section 2: PHY configuration section */ | |||||
/* DP83848_PHY_ADDRESS Address*/ | |||||
#define DP83848_PHY_ADDRESS 0x01U | |||||
/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ | |||||
#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) | |||||
/* PHY Configuration delay */ | |||||
#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) | |||||
#define PHY_READ_TO ((uint32_t)0x0000FFFFU) | |||||
#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) | |||||
/* Section 3: Common PHY Registers */ | |||||
#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ | |||||
#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ | |||||
#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ | |||||
#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ | |||||
#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ | |||||
#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ | |||||
#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ | |||||
#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ | |||||
#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ | |||||
#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ | |||||
#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ | |||||
#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ | |||||
#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ | |||||
#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ | |||||
#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ | |||||
/* Section 4: Extended PHY Registers */ | |||||
#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ | |||||
#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ | |||||
#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ | |||||
/* ################## SPI peripheral configuration ########################## */ | |||||
/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver | |||||
* Activated: CRC code is present inside driver | |||||
* Deactivated: CRC code cleaned from driver | |||||
*/ | |||||
#define USE_SPI_CRC 0U | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
/** | |||||
* @brief Include module's header file | |||||
*/ | |||||
#ifdef HAL_RCC_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_rcc.h" | |||||
#endif /* HAL_RCC_MODULE_ENABLED */ | |||||
#ifdef HAL_GPIO_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_gpio.h" | |||||
#endif /* HAL_GPIO_MODULE_ENABLED */ | |||||
#ifdef HAL_EXTI_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_exti.h" | |||||
#endif /* HAL_EXTI_MODULE_ENABLED */ | |||||
#ifdef HAL_DMA_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_dma.h" | |||||
#endif /* HAL_DMA_MODULE_ENABLED */ | |||||
#ifdef HAL_CORTEX_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_cortex.h" | |||||
#endif /* HAL_CORTEX_MODULE_ENABLED */ | |||||
#ifdef HAL_ADC_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_adc.h" | |||||
#endif /* HAL_ADC_MODULE_ENABLED */ | |||||
#ifdef HAL_CAN_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_can.h" | |||||
#endif /* HAL_CAN_MODULE_ENABLED */ | |||||
#ifdef HAL_CAN_LEGACY_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_can_legacy.h" | |||||
#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ | |||||
#ifdef HAL_CRC_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_crc.h" | |||||
#endif /* HAL_CRC_MODULE_ENABLED */ | |||||
#ifdef HAL_CRYP_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_cryp.h" | |||||
#endif /* HAL_CRYP_MODULE_ENABLED */ | |||||
#ifdef HAL_DMA2D_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_dma2d.h" | |||||
#endif /* HAL_DMA2D_MODULE_ENABLED */ | |||||
#ifdef HAL_DAC_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_dac.h" | |||||
#endif /* HAL_DAC_MODULE_ENABLED */ | |||||
#ifdef HAL_DCMI_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_dcmi.h" | |||||
#endif /* HAL_DCMI_MODULE_ENABLED */ | |||||
#ifdef HAL_ETH_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_eth.h" | |||||
#endif /* HAL_ETH_MODULE_ENABLED */ | |||||
#ifdef HAL_FLASH_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_flash.h" | |||||
#endif /* HAL_FLASH_MODULE_ENABLED */ | |||||
#ifdef HAL_SRAM_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_sram.h" | |||||
#endif /* HAL_SRAM_MODULE_ENABLED */ | |||||
#ifdef HAL_NOR_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_nor.h" | |||||
#endif /* HAL_NOR_MODULE_ENABLED */ | |||||
#ifdef HAL_NAND_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_nand.h" | |||||
#endif /* HAL_NAND_MODULE_ENABLED */ | |||||
#ifdef HAL_PCCARD_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_pccard.h" | |||||
#endif /* HAL_PCCARD_MODULE_ENABLED */ | |||||
#ifdef HAL_SDRAM_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_sdram.h" | |||||
#endif /* HAL_SDRAM_MODULE_ENABLED */ | |||||
#ifdef HAL_HASH_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_hash.h" | |||||
#endif /* HAL_HASH_MODULE_ENABLED */ | |||||
#ifdef HAL_I2C_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_i2c.h" | |||||
#endif /* HAL_I2C_MODULE_ENABLED */ | |||||
#ifdef HAL_SMBUS_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_smbus.h" | |||||
#endif /* HAL_SMBUS_MODULE_ENABLED */ | |||||
#ifdef HAL_I2S_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_i2s.h" | |||||
#endif /* HAL_I2S_MODULE_ENABLED */ | |||||
#ifdef HAL_IWDG_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_iwdg.h" | |||||
#endif /* HAL_IWDG_MODULE_ENABLED */ | |||||
#ifdef HAL_LTDC_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_ltdc.h" | |||||
#endif /* HAL_LTDC_MODULE_ENABLED */ | |||||
#ifdef HAL_PWR_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_pwr.h" | |||||
#endif /* HAL_PWR_MODULE_ENABLED */ | |||||
#ifdef HAL_RNG_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_rng.h" | |||||
#endif /* HAL_RNG_MODULE_ENABLED */ | |||||
#ifdef HAL_RTC_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_rtc.h" | |||||
#endif /* HAL_RTC_MODULE_ENABLED */ | |||||
#ifdef HAL_SAI_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_sai.h" | |||||
#endif /* HAL_SAI_MODULE_ENABLED */ | |||||
#ifdef HAL_SD_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_sd.h" | |||||
#endif /* HAL_SD_MODULE_ENABLED */ | |||||
#ifdef HAL_SPI_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_spi.h" | |||||
#endif /* HAL_SPI_MODULE_ENABLED */ | |||||
#ifdef HAL_TIM_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_tim.h" | |||||
#endif /* HAL_TIM_MODULE_ENABLED */ | |||||
#ifdef HAL_UART_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_uart.h" | |||||
#endif /* HAL_UART_MODULE_ENABLED */ | |||||
#ifdef HAL_USART_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_usart.h" | |||||
#endif /* HAL_USART_MODULE_ENABLED */ | |||||
#ifdef HAL_IRDA_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_irda.h" | |||||
#endif /* HAL_IRDA_MODULE_ENABLED */ | |||||
#ifdef HAL_SMARTCARD_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_smartcard.h" | |||||
#endif /* HAL_SMARTCARD_MODULE_ENABLED */ | |||||
#ifdef HAL_WWDG_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_wwdg.h" | |||||
#endif /* HAL_WWDG_MODULE_ENABLED */ | |||||
#ifdef HAL_PCD_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_pcd.h" | |||||
#endif /* HAL_PCD_MODULE_ENABLED */ | |||||
#ifdef HAL_HCD_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_hcd.h" | |||||
#endif /* HAL_HCD_MODULE_ENABLED */ | |||||
#ifdef HAL_DSI_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_dsi.h" | |||||
#endif /* HAL_DSI_MODULE_ENABLED */ | |||||
#ifdef HAL_QSPI_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_qspi.h" | |||||
#endif /* HAL_QSPI_MODULE_ENABLED */ | |||||
#ifdef HAL_CEC_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_cec.h" | |||||
#endif /* HAL_CEC_MODULE_ENABLED */ | |||||
#ifdef HAL_FMPI2C_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_fmpi2c.h" | |||||
#endif /* HAL_FMPI2C_MODULE_ENABLED */ | |||||
#ifdef HAL_SPDIFRX_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_spdifrx.h" | |||||
#endif /* HAL_SPDIFRX_MODULE_ENABLED */ | |||||
#ifdef HAL_DFSDM_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_dfsdm.h" | |||||
#endif /* HAL_DFSDM_MODULE_ENABLED */ | |||||
#ifdef HAL_LPTIM_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_lptim.h" | |||||
#endif /* HAL_LPTIM_MODULE_ENABLED */ | |||||
#ifdef HAL_MMC_MODULE_ENABLED | |||||
#include "stm32f4xx_hal_mmc.h" | |||||
#endif /* HAL_MMC_MODULE_ENABLED */ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
#ifdef USE_FULL_ASSERT | |||||
/** | |||||
* @brief The assert_param macro is used for function's parameters check. | |||||
* @param expr If expr is false, it calls assert_failed function | |||||
* which reports the name of the source file and the source | |||||
* line number of the call that failed. | |||||
* If expr is true, it returns no value. | |||||
* @retval None | |||||
*/ | |||||
#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) | |||||
/* Exported functions ------------------------------------------------------- */ | |||||
void assert_failed(uint8_t* file, uint32_t line); | |||||
#else | |||||
#define assert_param(expr) ((void)0U) | |||||
#endif /* USE_FULL_ASSERT */ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32F4xx_HAL_CONF_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/* USER CODE BEGIN Header */ | |||||
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_it.h | |||||
* @brief This file contains the headers of the interrupt handlers. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2021 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 */ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_IT_H | |||||
#define __STM32F4xx_IT_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* 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 NMI_Handler(void); | |||||
void HardFault_Handler(void); | |||||
void MemManage_Handler(void); | |||||
void BusFault_Handler(void); | |||||
void UsageFault_Handler(void); | |||||
void SVC_Handler(void); | |||||
void DebugMon_Handler(void); | |||||
void PendSV_Handler(void); | |||||
void SysTick_Handler(void); | |||||
void RTC_Alarm_IRQHandler(void); | |||||
/* USER CODE BEGIN EFP */ | |||||
/* USER CODE END EFP */ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32F4xx_IT_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/* USER CODE BEGIN Header */ | |||||
/** | |||||
****************************************************************************** | |||||
* @file : main.c | |||||
* @brief : Main program body | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2021 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 "main.h" | |||||
/* Private includes ----------------------------------------------------------*/ | |||||
/* USER CODE BEGIN Includes */ | |||||
#include "math.h" | |||||
#include "stdbool.h" | |||||
#include "string.h" | |||||
/* USER CODE END Includes */ | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PTD */ | |||||
/* USER CODE END PTD */ | |||||
/* Private define ------------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PD */ | |||||
/* USER CODE END PD */ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PM */ | |||||
/* USER CODE END PM */ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
RTC_HandleTypeDef hrtc; | |||||
UART_HandleTypeDef huart2; | |||||
/* USER CODE BEGIN PV */ | |||||
RTC_TimeTypeDef sTime; | |||||
RTC_DateTypeDef sDate; | |||||
RTC_AlarmTypeDef sAlarmA, sAlarmB; | |||||
//Nuremberg coordinates | |||||
int latitude_nbg = 49; | |||||
int longitude_nbg = 11; | |||||
//German UTC time,summer (+2) and winter (+1) | |||||
int UTC_DER_sum = 2; | |||||
int UTC_DER_win = 1; | |||||
bool winterTime = true; | |||||
int DaysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; | |||||
int DaysInMonthLeapYear[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; | |||||
bool leapYear = false; | |||||
typedef struct { | |||||
int hours; | |||||
int minutes; | |||||
int seconds; | |||||
int weekDay; | |||||
int month; | |||||
int day; | |||||
int year; | |||||
} timeAndDate; | |||||
/* USER CODE END PV */ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
void SystemClock_Config(void); | |||||
static void MX_GPIO_Init(void); | |||||
static void MX_USART2_UART_Init(void); | |||||
static void MX_RTC_Init(void); | |||||
/* USER CODE BEGIN PFP */ | |||||
/* USER CODE END PFP */ | |||||
/* Private user code ---------------------------------------------------------*/ | |||||
/* USER CODE BEGIN 0 */ | |||||
/******************************************************************************* | |||||
* Function Name : deg_to_rad | |||||
* Description : converts degrees to radians | |||||
* Return : angle in radians | |||||
*******************************************************************************/ | |||||
double deg_to_rad(double deg) | |||||
{ | |||||
double rad = deg*(M_PI/180); | |||||
return rad; | |||||
} | |||||
/******************************************************************************* | |||||
* Function Name : rad_to_deg | |||||
* Description : converts radians to degrees | |||||
* Return : angle in degrees | |||||
*******************************************************************************/ | |||||
double rad_to_deg(double rad) | |||||
{ | |||||
double deg = rad*(180/M_PI); | |||||
return deg; | |||||
} | |||||
/******************************************************************************* | |||||
* Function Name : leap_year_check | |||||
* Description : checks if year is a leap year | |||||
* Return : false: no leap year, true: leap year | |||||
*******************************************************************************/ | |||||
void leap_year_check(int initialyear) | |||||
{ | |||||
int year = initialyear; | |||||
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) | |||||
{ | |||||
leapYear = true; | |||||
} | |||||
else | |||||
{ | |||||
leapYear = false; | |||||
} | |||||
} | |||||
/******************************************************************************* | |||||
* Function Name : calc_day_of_year | |||||
* Description : calculates the day of year | |||||
* Return : day of year (1.1.. = 1, 2.1.. = 2,...) | |||||
* Source : https://overiq.com/c-examples/c-program-to-calculate-the-day-of-year-from-the-date/ | |||||
*******************************************************************************/ | |||||
int calc_day_of_year(int day, int mon, int year) | |||||
{ | |||||
int days_in_feb = 28; | |||||
int doy = day; //day of year | |||||
// check for leap year | |||||
//bool leap_year = leap_year_check(year); | |||||
if(leapYear == true) | |||||
{ | |||||
days_in_feb = 29; | |||||
} | |||||
switch(mon) | |||||
{ | |||||
case 2: | |||||
doy += 31; | |||||
break; | |||||
case 3: | |||||
doy += 31+days_in_feb; | |||||
break; | |||||
case 4: | |||||
doy += days_in_feb+62; | |||||
break; | |||||
case 5: | |||||
doy += days_in_feb+92; | |||||
break; | |||||
case 6: | |||||
doy += days_in_feb+123; | |||||
break; | |||||
case 7: | |||||
doy += days_in_feb+153; | |||||
break; | |||||
case 8: | |||||
doy += days_in_feb+184; | |||||
break; | |||||
case 9: | |||||
doy += days_in_feb+215; | |||||
break; | |||||
case 10: | |||||
doy += days_in_feb+245; | |||||
break; | |||||
case 11: | |||||
doy += days_in_feb+276; | |||||
break; | |||||
case 12: | |||||
doy += days_in_feb+306; | |||||
break; | |||||
} | |||||
return doy; | |||||
} | |||||
/******************************************************************************* | |||||
* Function Name : calc_sunrise_sunset | |||||
* Description : calculates the sunrise and sunset time of a specific date | |||||
* Source : General Solar Position Calculations, NOAA Global Monitoring Division | |||||
*******************************************************************************/ | |||||
void calc_sunrise_sunset(timeAndDate* initialDate, timeAndDate* sunriseStruct, timeAndDate* sunsetStruct, timeAndDate* tomorrowsDate) | |||||
{ | |||||
double gamma = 0; | |||||
double eqtime = 0; | |||||
double decl = 0; | |||||
//double decl_deg = 0; | |||||
double zenith_sun = 0; | |||||
double lat_nbg_rad = 0; | |||||
double ha = 0; | |||||
double sunrise = 0; | |||||
double sunset = 0; | |||||
double ha_deg = 0; | |||||
int sunrise_h = 0; | |||||
int sunset_h = 0; | |||||
double sunrise_min = 0; | |||||
double sunset_min = 0; | |||||
int int_sunrise_min = 0; | |||||
int int_sunset_min = 0; | |||||
int day = initialDate->day; | |||||
int month = initialDate->month; | |||||
int year = initialDate->year; | |||||
//day of year calculation | |||||
int day_of_year = calc_day_of_year(day, month, year); | |||||
// fractional year (γ) in radians | |||||
// check for leap year | |||||
//leap_year = leap_year_check(year); | |||||
if(leapYear == false) | |||||
{ | |||||
//The back part of the formula was omitted, because there is no difference in the result | |||||
gamma = ((2 * M_PI)/365)*(day_of_year - 1); | |||||
} else { | |||||
//The back part of the formula was omitted, because there is no difference in the result | |||||
gamma = ((2 * M_PI)/366)*(day_of_year - 1); | |||||
} | |||||
//Equation of time in minutes | |||||
eqtime = 229.18*(0.000075 + 0.001868*cos(gamma) - 0.032077*sin(gamma) - 0.014615*cos(2*gamma) - 0.040849*sin(2*gamma)); | |||||
//Solar declination angle in radians | |||||
decl = 0.006918 - 0.399912*cos(gamma) + 0.070257*sin(gamma) - 0.006758*cos(2*gamma) + 0.000907*sin(2*gamma) - 0.002697*cos(3*gamma) + 0.00148*sin(3*gamma); | |||||
//Solar declination angle in degrees | |||||
//decl_deg = rad_to_deg(decl); | |||||
//Hour angle in degrees, positive number corresponds to sunrise, negative to sunset | |||||
//special case of sunrise or sunset, the zenith is set to 90.833Deg | |||||
zenith_sun = deg_to_rad(90.833); | |||||
//Latitude of Nuernberg in rad | |||||
lat_nbg_rad = deg_to_rad(latitude_nbg); | |||||
ha = acos((cos(zenith_sun)/(cos(lat_nbg_rad)*cos(decl)))-(tan(lat_nbg_rad)*tan(decl))); | |||||
ha_deg = rad_to_deg(ha); | |||||
//UTC time of sunrise (or sunset) in minutes | |||||
sunrise = (720-4*(longitude_nbg+ha_deg)-eqtime); | |||||
sunset = 720-4*(longitude_nbg-ha_deg)-eqtime; | |||||
//Convert sunrise (or sunset) UTC time in hours | |||||
sunrise = sunrise/60; | |||||
sunset = sunset/60; | |||||
//Seperate hours and minutes | |||||
sunrise_h = floor(sunrise); | |||||
sunrise_min = sunrise - sunrise_h; | |||||
//Cut off after two decimal places | |||||
int_sunrise_min = floor(sunrise_min * 100.0); | |||||
if (int_sunrise_min >= 60) | |||||
{ | |||||
sunrise_h = sunrise_h + 1; | |||||
int_sunrise_min = int_sunrise_min - 60; | |||||
} | |||||
sunset_h = floor(sunset); | |||||
sunset_min = sunset - sunset_h; | |||||
//Cut off after two decimal places | |||||
int_sunset_min = floor(sunset_min * 100.0); | |||||
if (int_sunset_min >= 60) | |||||
{ | |||||
sunset_h = sunset_h + 1; | |||||
int_sunset_min = int_sunset_min - 60; | |||||
} | |||||
//Add time difference from German time to UTC Time | |||||
//Private variable winterTime must be initialized accordingly | |||||
if (winterTime) | |||||
{ | |||||
sunrise_h = sunrise_h + UTC_DER_win; | |||||
sunset_h = sunset_h + UTC_DER_win; | |||||
} else { | |||||
sunrise_h = sunrise_h + UTC_DER_sum; | |||||
sunset_h = sunset_h + UTC_DER_sum; | |||||
} | |||||
sunriseStruct->hours = sunrise_h; | |||||
sunriseStruct->minutes = int_sunrise_min; | |||||
sunsetStruct->hours = sunset_h; | |||||
sunsetStruct->minutes = int_sunset_min; | |||||
sunriseStruct->day = sunsetStruct->day = tomorrowsDate->day; | |||||
sunriseStruct->weekDay = sunsetStruct->weekDay = tomorrowsDate->weekDay; | |||||
sunriseStruct->month = sunsetStruct->month = tomorrowsDate->month; | |||||
sunriseStruct->year = sunsetStruct->year = tomorrowsDate->year; | |||||
} | |||||
/******************************************************************************* | |||||
* Function Name : calc_tomorrows_date | |||||
* Description : calculates tomorrow's date | |||||
* Source : https://github.com/vyacht/stm32/blob/master/vynmea/rtc.c | |||||
*******************************************************************************/ | |||||
void calc_tomorrows_date(timeAndDate* initialDate, timeAndDate* tomorrowsDate) | |||||
{ | |||||
int yearToUse[12]; | |||||
if (leapYear == true){ | |||||
memcpy(yearToUse, DaysInMonthLeapYear, sizeof yearToUse); | |||||
} else { | |||||
memcpy(yearToUse, DaysInMonth, sizeof yearToUse); | |||||
} | |||||
int day = initialDate->day; | |||||
int wday = initialDate->weekDay; | |||||
int month = initialDate->month; | |||||
int year = initialDate->year; | |||||
day++; // next day | |||||
wday++; // next weekday | |||||
if(wday == 8) | |||||
{ | |||||
wday = 1; // Monday | |||||
} | |||||
if(day > yearToUse[month-1]) | |||||
{ // next month | |||||
day = 1; | |||||
month++; | |||||
} | |||||
if(day > 31 && month == 12) // next year | |||||
{ | |||||
day = 1; | |||||
month = 1; | |||||
year++; | |||||
} | |||||
tomorrowsDate->day = day; | |||||
tomorrowsDate->weekDay = wday; | |||||
tomorrowsDate->month = month; | |||||
tomorrowsDate->year = year; | |||||
} | |||||
/******************************************************************************* | |||||
* Function Name : set_Alarm | |||||
* Description : sets the wake up Alarm | |||||
*******************************************************************************/ | |||||
void set_Alarm(int h, int min, int weekDay, char* alarm, RTC_AlarmTypeDef* alarmInstance) | |||||
{ | |||||
/** Enable the Alarm A*/ | |||||
alarmInstance->AlarmTime.Hours = h; | |||||
alarmInstance->AlarmTime.Minutes = min; | |||||
alarmInstance->AlarmTime.Seconds = 0; | |||||
alarmInstance->AlarmTime.SubSeconds = 0; | |||||
alarmInstance->AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; | |||||
alarmInstance->AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; | |||||
alarmInstance->AlarmMask = RTC_ALARMMASK_NONE; //only by specific time | |||||
alarmInstance->AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; | |||||
alarmInstance->AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY; | |||||
alarmInstance->AlarmDateWeekDay = weekDay; | |||||
if (strcmp("A", alarm) == 0) { | |||||
alarmInstance->Alarm = RTC_ALARM_A; | |||||
} else { | |||||
alarmInstance->Alarm = RTC_ALARM_B; | |||||
} | |||||
if (HAL_RTC_SetAlarm_IT(&hrtc, alarmInstance, RTC_FORMAT_BIN) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
} | |||||
// sending to UART | |||||
void transmit_uart(char *string){ | |||||
uint8_t len = strlen(string); | |||||
HAL_UART_Transmit(&huart2, (uint8_t*) string, len, 200); | |||||
} | |||||
void setTime(timeAndDate *time){ | |||||
if (HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK) | |||||
{ | |||||
time->hours = sTime.Hours; | |||||
time->minutes = sTime.Minutes; | |||||
time->seconds = sTime.Seconds; | |||||
} | |||||
} | |||||
void setDate(timeAndDate *date){ | |||||
if (HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN) == HAL_OK) | |||||
{ | |||||
date->weekDay = sDate.WeekDay; | |||||
date->month = sDate.Month; | |||||
date->day = sDate.Date; | |||||
date->year = 2000 + sDate.Year; | |||||
} | |||||
} | |||||
/* USER CODE END 0 */ | |||||
/** | |||||
* @brief The application entry point. | |||||
* @retval int | |||||
*/ | |||||
int main(void) | |||||
{ | |||||
/* USER CODE BEGIN 1 */ | |||||
/* USER CODE END 1 */ | |||||
/* MCU Configuration--------------------------------------------------------*/ | |||||
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ | |||||
HAL_Init(); | |||||
/* USER CODE BEGIN Init */ | |||||
/* USER CODE END Init */ | |||||
/* Configure the system clock */ | |||||
SystemClock_Config(); | |||||
/* USER CODE BEGIN SysInit */ | |||||
/* USER CODE END SysInit */ | |||||
/* Initialize all configured peripherals */ | |||||
MX_GPIO_Init(); | |||||
MX_USART2_UART_Init(); | |||||
MX_RTC_Init(); | |||||
/* USER CODE BEGIN 2 */ | |||||
timeAndDate sunrise, sunset, wakeUpTimeForStep, tomorrowsDate, initialDate; | |||||
sunrise = sunset = wakeUpTimeForStep = tomorrowsDate = initialDate = (timeAndDate) {\ | |||||
0, | |||||
0, | |||||
0, | |||||
0, | |||||
0, | |||||
0, | |||||
0 | |||||
}; | |||||
/* USER CODE END 2 */ | |||||
/* Infinite loop */ | |||||
/* USER CODE BEGIN WHILE */ | |||||
while (1) | |||||
{ | |||||
/* USER CODE END WHILE */ | |||||
/* USER CODE BEGIN 3 */ | |||||
setTime(&initialDate); | |||||
setDate(&initialDate); | |||||
leap_year_check(initialDate.year); | |||||
calc_tomorrows_date(&initialDate, &tomorrowsDate); | |||||
//Calculate sunrise and sunset time for tomorrow | |||||
calc_sunrise_sunset(&initialDate, &sunrise, &sunset, &tomorrowsDate); | |||||
// Enter inner Loop with Alarm at sunrise | |||||
// Loop: Make a step every x minutes (calculated) | |||||
// 1. Calculate and Set Alarm for next step | |||||
// 2. Go to sleep: uC, Motor | |||||
// 3. Alarm: Make Step | |||||
// 4. Go to 1 | |||||
// Exit inner Loop with alarm at sunset | |||||
// Make Calculations for the next day | |||||
// Set alarm for sunrise | |||||
// Go to Sleep | |||||
set_Alarm(16, 18, 4, "A", &sAlarmA); | |||||
set_Alarm(16, 20, 4, "B", &sAlarmB); | |||||
HAL_Delay(5000); | |||||
transmit_uart("A: Ich gehe schlafen!\r\n"); | |||||
// Suspend Tick increment to prevent wake up by Systick interrupt | |||||
HAL_SuspendTick(); | |||||
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); //Interrupt for wake up | |||||
HAL_ResumeTick(); | |||||
transmit_uart("A: Bin wieder wach!\r\n"); | |||||
transmit_uart("B: Ich gehe schlafen!\r\n"); | |||||
// Suspend Tick increment to prevent wake up by Systick interrupt | |||||
HAL_SuspendTick(); | |||||
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); //Interrupt for wake up | |||||
HAL_ResumeTick(); | |||||
transmit_uart("B: Bin wieder wach!\r\n"); | |||||
} | |||||
/* USER CODE END 3 */ | |||||
} | |||||
/** | |||||
* @brief System Clock Configuration | |||||
* @retval None | |||||
*/ | |||||
void SystemClock_Config(void) | |||||
{ | |||||
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; | |||||
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; | |||||
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; | |||||
/** Configure the main internal regulator output voltage | |||||
*/ | |||||
__HAL_RCC_PWR_CLK_ENABLE(); | |||||
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); | |||||
/** Initializes the RCC Oscillators according to the specified parameters | |||||
* in the RCC_OscInitTypeDef structure. | |||||
*/ | |||||
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI; | |||||
RCC_OscInitStruct.HSIState = RCC_HSI_ON; | |||||
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; | |||||
RCC_OscInitStruct.LSIState = RCC_LSI_ON; | |||||
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |||||
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; | |||||
RCC_OscInitStruct.PLL.PLLM = 16; | |||||
RCC_OscInitStruct.PLL.PLLN = 336; | |||||
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; | |||||
RCC_OscInitStruct.PLL.PLLQ = 7; | |||||
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
/** Initializes the CPU, AHB and APB buses clocks | |||||
*/ | |||||
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK | |||||
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; | |||||
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | |||||
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | |||||
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; | |||||
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; | |||||
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; | |||||
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; | |||||
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
} | |||||
/** | |||||
* @brief RTC Initialization Function | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
static void MX_RTC_Init(void) | |||||
{ | |||||
/* USER CODE BEGIN RTC_Init 0 */ | |||||
/* USER CODE END RTC_Init 0 */ | |||||
RTC_TimeTypeDef sTime = {0}; | |||||
RTC_DateTypeDef sDate = {0}; | |||||
//RTC_AlarmTypeDef sAlarm = {0}; | |||||
/* USER CODE BEGIN RTC_Init 1 */ | |||||
/* USER CODE END RTC_Init 1 */ | |||||
/** Initialize RTC Only | |||||
*/ | |||||
hrtc.Instance = RTC; | |||||
hrtc.Init.HourFormat = RTC_HOURFORMAT_24; | |||||
hrtc.Init.AsynchPrediv = 127; | |||||
hrtc.Init.SynchPrediv = 255; | |||||
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; | |||||
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; | |||||
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; | |||||
if (HAL_RTC_Init(&hrtc) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
/* USER CODE BEGIN Check_RTC_BKUP */ | |||||
/* USER CODE END Check_RTC_BKUP */ | |||||
/** Initialize RTC and set the Time and Date | |||||
*/ | |||||
sTime.Hours = 16; | |||||
sTime.Minutes = 16; | |||||
sTime.Seconds = 30; | |||||
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; | |||||
sTime.StoreOperation = RTC_STOREOPERATION_RESET; | |||||
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
sDate.WeekDay = RTC_WEEKDAY_THURSDAY; | |||||
sDate.Month = RTC_MONTH_FEBRUARY; | |||||
sDate.Date = 18; | |||||
sDate.Year = 21; | |||||
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
/** Enable the Alarm A | |||||
*/ | |||||
/** | |||||
sAlarm.AlarmTime.Hours = 0; | |||||
sAlarm.AlarmTime.Minutes = 0; | |||||
sAlarm.AlarmTime.Seconds = 0; | |||||
sAlarm.AlarmTime.SubSeconds = 0; | |||||
sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; | |||||
sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; | |||||
sAlarm.AlarmMask = RTC_ALARMMASK_NONE; | |||||
sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; | |||||
sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; | |||||
sAlarm.AlarmDateWeekDay = 1; | |||||
sAlarm.Alarm = RTC_ALARM_A; | |||||
if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
/** Enable the Alarm B | |||||
*/ | |||||
/* | |||||
sAlarm.AlarmDateWeekDay = 1; | |||||
sAlarm.Alarm = RTC_ALARM_B; | |||||
if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
/* USER CODE BEGIN RTC_Init 2 */ | |||||
/* USER CODE END RTC_Init 2 */ | |||||
} | |||||
/** | |||||
* @brief USART2 Initialization Function | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
static void MX_USART2_UART_Init(void) | |||||
{ | |||||
/* USER CODE BEGIN USART2_Init 0 */ | |||||
/* USER CODE END USART2_Init 0 */ | |||||
/* USER CODE BEGIN USART2_Init 1 */ | |||||
/* USER CODE END USART2_Init 1 */ | |||||
huart2.Instance = USART2; | |||||
huart2.Init.BaudRate = 115200; | |||||
huart2.Init.WordLength = UART_WORDLENGTH_8B; | |||||
huart2.Init.StopBits = UART_STOPBITS_1; | |||||
huart2.Init.Parity = UART_PARITY_NONE; | |||||
huart2.Init.Mode = UART_MODE_TX_RX; | |||||
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; | |||||
huart2.Init.OverSampling = UART_OVERSAMPLING_16; | |||||
if (HAL_UART_Init(&huart2) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
/* USER CODE BEGIN USART2_Init 2 */ | |||||
/* USER CODE END USART2_Init 2 */ | |||||
} | |||||
/** | |||||
* @brief GPIO Initialization Function | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
static void MX_GPIO_Init(void) | |||||
{ | |||||
GPIO_InitTypeDef GPIO_InitStruct = {0}; | |||||
/* GPIO Ports Clock Enable */ | |||||
__HAL_RCC_GPIOC_CLK_ENABLE(); | |||||
__HAL_RCC_GPIOH_CLK_ENABLE(); | |||||
__HAL_RCC_GPIOA_CLK_ENABLE(); | |||||
__HAL_RCC_GPIOB_CLK_ENABLE(); | |||||
/*Configure GPIO pin Output Level */ | |||||
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); | |||||
/*Configure GPIO pin : B1_Pin */ | |||||
GPIO_InitStruct.Pin = B1_Pin; | |||||
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; | |||||
GPIO_InitStruct.Pull = GPIO_NOPULL; | |||||
HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); | |||||
/*Configure GPIO pin : LD2_Pin */ | |||||
GPIO_InitStruct.Pin = LD2_Pin; | |||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | |||||
GPIO_InitStruct.Pull = GPIO_NOPULL; | |||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | |||||
HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); | |||||
} | |||||
/* USER CODE BEGIN 4 */ | |||||
/** | |||||
* @brief Alarm callback | |||||
* @param hrtc: RTC handle | |||||
* @retval None | |||||
*/ | |||||
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) | |||||
{ | |||||
/* Alarm generation */ | |||||
transmit_uart("A: Alarm!!!!\r\n"); | |||||
} | |||||
void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc) | |||||
{ | |||||
/* Alarm generation */ | |||||
transmit_uart("B: Alarm!!!!\r\n"); | |||||
} | |||||
/* USER CODE END 4 */ | |||||
/** | |||||
* @brief This function is executed in case of error occurrence. | |||||
* @retval None | |||||
*/ | |||||
void Error_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN Error_Handler_Debug */ | |||||
/* User can add his own implementation to report the HAL error return state */ | |||||
__disable_irq(); | |||||
while (1) | |||||
{ | |||||
} | |||||
/* USER CODE END Error_Handler_Debug */ | |||||
} | |||||
#ifdef USE_FULL_ASSERT | |||||
/** | |||||
* @brief Reports the name of the source file and the source line number | |||||
* where the assert_param error has occurred. | |||||
* @param file: pointer to the source file name | |||||
* @param line: assert_param error line source number | |||||
* @retval None | |||||
*/ | |||||
void assert_failed(uint8_t *file, uint32_t line) | |||||
{ | |||||
/* USER CODE BEGIN 6 */ | |||||
/* User can add his own implementation to report the file name and line number, | |||||
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ | |||||
/* USER CODE END 6 */ | |||||
} | |||||
#endif /* USE_FULL_ASSERT */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/* USER CODE BEGIN Header */ | |||||
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_msp.c | |||||
* @brief This file provides code for the MSP Initialization | |||||
* and de-Initialization codes. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2021 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 "main.h" | |||||
/* USER CODE BEGIN Includes */ | |||||
/* USER CODE END Includes */ | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* USER CODE BEGIN TD */ | |||||
/* USER CODE END TD */ | |||||
/* Private define ------------------------------------------------------------*/ | |||||
/* USER CODE BEGIN Define */ | |||||
/* USER CODE END Define */ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/* USER CODE BEGIN Macro */ | |||||
/* USER CODE END Macro */ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PV */ | |||||
/* USER CODE END PV */ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
/* USER CODE BEGIN PFP */ | |||||
/* USER CODE END PFP */ | |||||
/* External functions --------------------------------------------------------*/ | |||||
/* USER CODE BEGIN ExternalFunctions */ | |||||
/* USER CODE END ExternalFunctions */ | |||||
/* USER CODE BEGIN 0 */ | |||||
/* USER CODE END 0 */ | |||||
/** | |||||
* Initializes the Global MSP. | |||||
*/ | |||||
void HAL_MspInit(void) | |||||
{ | |||||
/* USER CODE BEGIN MspInit 0 */ | |||||
/* USER CODE END MspInit 0 */ | |||||
__HAL_RCC_SYSCFG_CLK_ENABLE(); | |||||
__HAL_RCC_PWR_CLK_ENABLE(); | |||||
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); | |||||
/* System interrupt init*/ | |||||
/* USER CODE BEGIN MspInit 1 */ | |||||
/* USER CODE END MspInit 1 */ | |||||
} | |||||
/** | |||||
* @brief RTC MSP Initialization | |||||
* This function configures the hardware resources used in this example | |||||
* @param hrtc: RTC handle pointer | |||||
* @retval None | |||||
*/ | |||||
void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) | |||||
{ | |||||
if(hrtc->Instance==RTC) | |||||
{ | |||||
/* USER CODE BEGIN RTC_MspInit 0 */ | |||||
/* USER CODE END RTC_MspInit 0 */ | |||||
/* Peripheral clock enable */ | |||||
__HAL_RCC_RTC_ENABLE(); | |||||
/* RTC interrupt Init */ | |||||
HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0); | |||||
HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); | |||||
/* USER CODE BEGIN RTC_MspInit 1 */ | |||||
/* USER CODE END RTC_MspInit 1 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief RTC MSP De-Initialization | |||||
* This function freeze the hardware resources used in this example | |||||
* @param hrtc: RTC handle pointer | |||||
* @retval None | |||||
*/ | |||||
void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) | |||||
{ | |||||
if(hrtc->Instance==RTC) | |||||
{ | |||||
/* USER CODE BEGIN RTC_MspDeInit 0 */ | |||||
/* USER CODE END RTC_MspDeInit 0 */ | |||||
/* Peripheral clock disable */ | |||||
__HAL_RCC_RTC_DISABLE(); | |||||
/* RTC interrupt DeInit */ | |||||
HAL_NVIC_DisableIRQ(RTC_Alarm_IRQn); | |||||
/* USER CODE BEGIN RTC_MspDeInit 1 */ | |||||
/* USER CODE END RTC_MspDeInit 1 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief UART MSP Initialization | |||||
* This function configures the hardware resources used in this example | |||||
* @param huart: UART handle pointer | |||||
* @retval None | |||||
*/ | |||||
void HAL_UART_MspInit(UART_HandleTypeDef* huart) | |||||
{ | |||||
GPIO_InitTypeDef GPIO_InitStruct = {0}; | |||||
if(huart->Instance==USART2) | |||||
{ | |||||
/* USER CODE BEGIN USART2_MspInit 0 */ | |||||
/* USER CODE END USART2_MspInit 0 */ | |||||
/* Peripheral clock enable */ | |||||
__HAL_RCC_USART2_CLK_ENABLE(); | |||||
__HAL_RCC_GPIOA_CLK_ENABLE(); | |||||
/**USART2 GPIO Configuration | |||||
PA2 ------> USART2_TX | |||||
PA3 ------> USART2_RX | |||||
*/ | |||||
GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin; | |||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | |||||
GPIO_InitStruct.Pull = GPIO_NOPULL; | |||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | |||||
GPIO_InitStruct.Alternate = GPIO_AF7_USART2; | |||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |||||
/* USER CODE BEGIN USART2_MspInit 1 */ | |||||
/* USER CODE END USART2_MspInit 1 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief UART MSP De-Initialization | |||||
* This function freeze the hardware resources used in this example | |||||
* @param huart: UART handle pointer | |||||
* @retval None | |||||
*/ | |||||
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) | |||||
{ | |||||
if(huart->Instance==USART2) | |||||
{ | |||||
/* USER CODE BEGIN USART2_MspDeInit 0 */ | |||||
/* USER CODE END USART2_MspDeInit 0 */ | |||||
/* Peripheral clock disable */ | |||||
__HAL_RCC_USART2_CLK_DISABLE(); | |||||
/**USART2 GPIO Configuration | |||||
PA2 ------> USART2_TX | |||||
PA3 ------> USART2_RX | |||||
*/ | |||||
HAL_GPIO_DeInit(GPIOA, USART_TX_Pin|USART_RX_Pin); | |||||
/* USER CODE BEGIN USART2_MspDeInit 1 */ | |||||
/* USER CODE END USART2_MspDeInit 1 */ | |||||
} | |||||
} | |||||
/* USER CODE BEGIN 1 */ | |||||
/* USER CODE END 1 */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/* USER CODE BEGIN Header */ | |||||
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_it.c | |||||
* @brief Interrupt Service Routines. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2021 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 "main.h" | |||||
#include "stm32f4xx_it.h" | |||||
/* Private includes ----------------------------------------------------------*/ | |||||
/* USER CODE BEGIN Includes */ | |||||
/* USER CODE END Includes */ | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* USER CODE BEGIN TD */ | |||||
/* USER CODE END TD */ | |||||
/* Private define ------------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PD */ | |||||
/* USER CODE END PD */ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PM */ | |||||
/* USER CODE END PM */ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PV */ | |||||
/* USER CODE END PV */ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
/* USER CODE BEGIN PFP */ | |||||
/* USER CODE END PFP */ | |||||
/* Private user code ---------------------------------------------------------*/ | |||||
/* USER CODE BEGIN 0 */ | |||||
/* USER CODE END 0 */ | |||||
/* External variables --------------------------------------------------------*/ | |||||
extern RTC_HandleTypeDef hrtc; | |||||
/* USER CODE BEGIN EV */ | |||||
/* USER CODE END EV */ | |||||
/******************************************************************************/ | |||||
/* Cortex-M4 Processor Interruption and Exception Handlers */ | |||||
/******************************************************************************/ | |||||
/** | |||||
* @brief This function handles Non maskable interrupt. | |||||
*/ | |||||
void NMI_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN NonMaskableInt_IRQn 0 */ | |||||
/* USER CODE END NonMaskableInt_IRQn 0 */ | |||||
/* USER CODE BEGIN NonMaskableInt_IRQn 1 */ | |||||
while (1) | |||||
{ | |||||
} | |||||
/* USER CODE END NonMaskableInt_IRQn 1 */ | |||||
} | |||||
/** | |||||
* @brief This function handles Hard fault interrupt. | |||||
*/ | |||||
void HardFault_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN HardFault_IRQn 0 */ | |||||
/* USER CODE END HardFault_IRQn 0 */ | |||||
while (1) | |||||
{ | |||||
/* USER CODE BEGIN W1_HardFault_IRQn 0 */ | |||||
/* USER CODE END W1_HardFault_IRQn 0 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief This function handles Memory management fault. | |||||
*/ | |||||
void MemManage_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN MemoryManagement_IRQn 0 */ | |||||
/* USER CODE END MemoryManagement_IRQn 0 */ | |||||
while (1) | |||||
{ | |||||
/* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ | |||||
/* USER CODE END W1_MemoryManagement_IRQn 0 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief This function handles Pre-fetch fault, memory access fault. | |||||
*/ | |||||
void BusFault_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN BusFault_IRQn 0 */ | |||||
/* USER CODE END BusFault_IRQn 0 */ | |||||
while (1) | |||||
{ | |||||
/* USER CODE BEGIN W1_BusFault_IRQn 0 */ | |||||
/* USER CODE END W1_BusFault_IRQn 0 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief This function handles Undefined instruction or illegal state. | |||||
*/ | |||||
void UsageFault_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN UsageFault_IRQn 0 */ | |||||
/* USER CODE END UsageFault_IRQn 0 */ | |||||
while (1) | |||||
{ | |||||
/* USER CODE BEGIN W1_UsageFault_IRQn 0 */ | |||||
/* USER CODE END W1_UsageFault_IRQn 0 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief This function handles System service call via SWI instruction. | |||||
*/ | |||||
void SVC_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN SVCall_IRQn 0 */ | |||||
/* USER CODE END SVCall_IRQn 0 */ | |||||
/* USER CODE BEGIN SVCall_IRQn 1 */ | |||||
/* USER CODE END SVCall_IRQn 1 */ | |||||
} | |||||
/** | |||||
* @brief This function handles Debug monitor. | |||||
*/ | |||||
void DebugMon_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN DebugMonitor_IRQn 0 */ | |||||
/* USER CODE END DebugMonitor_IRQn 0 */ | |||||
/* USER CODE BEGIN DebugMonitor_IRQn 1 */ | |||||
/* USER CODE END DebugMonitor_IRQn 1 */ | |||||
} | |||||
/** | |||||
* @brief This function handles Pendable request for system service. | |||||
*/ | |||||
void PendSV_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN PendSV_IRQn 0 */ | |||||
/* USER CODE END PendSV_IRQn 0 */ | |||||
/* USER CODE BEGIN PendSV_IRQn 1 */ | |||||
/* USER CODE END PendSV_IRQn 1 */ | |||||
} | |||||
/** | |||||
* @brief This function handles System tick timer. | |||||
*/ | |||||
void SysTick_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN SysTick_IRQn 0 */ | |||||
/* USER CODE END SysTick_IRQn 0 */ | |||||
HAL_IncTick(); | |||||
/* USER CODE BEGIN SysTick_IRQn 1 */ | |||||
/* USER CODE END SysTick_IRQn 1 */ | |||||
} | |||||
/******************************************************************************/ | |||||
/* STM32F4xx Peripheral Interrupt Handlers */ | |||||
/* Add here the Interrupt Handlers for the used peripherals. */ | |||||
/* For the available peripheral interrupt handler names, */ | |||||
/* please refer to the startup file (startup_stm32f4xx.s). */ | |||||
/******************************************************************************/ | |||||
/** | |||||
* @brief This function handles RTC alarms A and B interrupt through EXTI line 17. | |||||
*/ | |||||
void RTC_Alarm_IRQHandler(void) | |||||
{ | |||||
/* USER CODE BEGIN RTC_Alarm_IRQn 0 */ | |||||
/* USER CODE END RTC_Alarm_IRQn 0 */ | |||||
HAL_RTC_AlarmIRQHandler(&hrtc); | |||||
/* USER CODE BEGIN RTC_Alarm_IRQn 1 */ | |||||
/* USER CODE END RTC_Alarm_IRQn 1 */ | |||||
} | |||||
/* USER CODE BEGIN 1 */ | |||||
/* USER CODE END 1 */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file syscalls.c | |||||
* @author Auto-generated by STM32CubeIDE | |||||
* @brief STM32CubeIDE Minimal System calls file | |||||
* | |||||
* For more information about which c-functions | |||||
* need which of these lowlevel functions | |||||
* please consult the Newlib libc-manual | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes */ | |||||
#include <sys/stat.h> | |||||
#include <stdlib.h> | |||||
#include <errno.h> | |||||
#include <stdio.h> | |||||
#include <signal.h> | |||||
#include <time.h> | |||||
#include <sys/time.h> | |||||
#include <sys/times.h> | |||||
/* Variables */ | |||||
//#undef errno | |||||
extern int errno; | |||||
extern int __io_putchar(int ch) __attribute__((weak)); | |||||
extern int __io_getchar(void) __attribute__((weak)); | |||||
register char * stack_ptr asm("sp"); | |||||
char *__env[1] = { 0 }; | |||||
char **environ = __env; | |||||
/* Functions */ | |||||
void initialise_monitor_handles() | |||||
{ | |||||
} | |||||
int _getpid(void) | |||||
{ | |||||
return 1; | |||||
} | |||||
int _kill(int pid, int sig) | |||||
{ | |||||
errno = EINVAL; | |||||
return -1; | |||||
} | |||||
void _exit (int status) | |||||
{ | |||||
_kill(status, -1); | |||||
while (1) {} /* Make sure we hang here */ | |||||
} | |||||
__attribute__((weak)) int _read(int file, char *ptr, int len) | |||||
{ | |||||
int DataIdx; | |||||
for (DataIdx = 0; DataIdx < len; DataIdx++) | |||||
{ | |||||
*ptr++ = __io_getchar(); | |||||
} | |||||
return len; | |||||
} | |||||
__attribute__((weak)) int _write(int file, char *ptr, int len) | |||||
{ | |||||
int DataIdx; | |||||
for (DataIdx = 0; DataIdx < len; DataIdx++) | |||||
{ | |||||
__io_putchar(*ptr++); | |||||
} | |||||
return len; | |||||
} | |||||
int _close(int file) | |||||
{ | |||||
return -1; | |||||
} | |||||
int _fstat(int file, struct stat *st) | |||||
{ | |||||
st->st_mode = S_IFCHR; | |||||
return 0; | |||||
} | |||||
int _isatty(int file) | |||||
{ | |||||
return 1; | |||||
} | |||||
int _lseek(int file, int ptr, int dir) | |||||
{ | |||||
return 0; | |||||
} | |||||
int _open(char *path, int flags, ...) | |||||
{ | |||||
/* Pretend like we always fail */ | |||||
return -1; | |||||
} | |||||
int _wait(int *status) | |||||
{ | |||||
errno = ECHILD; | |||||
return -1; | |||||
} | |||||
int _unlink(char *name) | |||||
{ | |||||
errno = ENOENT; | |||||
return -1; | |||||
} | |||||
int _times(struct tms *buf) | |||||
{ | |||||
return -1; | |||||
} | |||||
int _stat(char *file, struct stat *st) | |||||
{ | |||||
st->st_mode = S_IFCHR; | |||||
return 0; | |||||
} | |||||
int _link(char *old, char *new) | |||||
{ | |||||
errno = EMLINK; | |||||
return -1; | |||||
} | |||||
int _fork(void) | |||||
{ | |||||
errno = EAGAIN; | |||||
return -1; | |||||
} | |||||
int _execve(char *name, char **argv, char **env) | |||||
{ | |||||
errno = ENOMEM; | |||||
return -1; | |||||
} |
/** | |||||
****************************************************************************** | |||||
* @file sysmem.c | |||||
* @author Generated by STM32CubeIDE | |||||
* @brief STM32CubeIDE System Memory calls file | |||||
* | |||||
* For more information about which C functions | |||||
* need which of these lowlevel functions | |||||
* please consult the newlib libc manual | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes */ | |||||
#include <errno.h> | |||||
#include <stdint.h> | |||||
/** | |||||
* Pointer to the current high watermark of the heap usage | |||||
*/ | |||||
static uint8_t *__sbrk_heap_end = NULL; | |||||
/** | |||||
* @brief _sbrk() allocates memory to the newlib heap and is used by malloc | |||||
* and others from the C library | |||||
* | |||||
* @verbatim | |||||
* ############################################################################ | |||||
* # .data # .bss # newlib heap # MSP stack # | |||||
* # # # # Reserved by _Min_Stack_Size # | |||||
* ############################################################################ | |||||
* ^-- RAM start ^-- _end _estack, RAM end --^ | |||||
* @endverbatim | |||||
* | |||||
* This implementation starts allocating at the '_end' linker symbol | |||||
* The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack | |||||
* The implementation considers '_estack' linker symbol to be RAM end | |||||
* NOTE: If the MSP stack, at any point during execution, grows larger than the | |||||
* reserved size, please increase the '_Min_Stack_Size'. | |||||
* | |||||
* @param incr Memory size | |||||
* @return Pointer to allocated memory | |||||
*/ | |||||
void *_sbrk(ptrdiff_t incr) | |||||
{ | |||||
extern uint8_t _end; /* Symbol defined in the linker script */ | |||||
extern uint8_t _estack; /* Symbol defined in the linker script */ | |||||
extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ | |||||
const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; | |||||
const uint8_t *max_heap = (uint8_t *)stack_limit; | |||||
uint8_t *prev_heap_end; | |||||
/* Initialize heap end at first call */ | |||||
if (NULL == __sbrk_heap_end) | |||||
{ | |||||
__sbrk_heap_end = &_end; | |||||
} | |||||
/* Protect heap from growing into the reserved MSP stack */ | |||||
if (__sbrk_heap_end + incr > max_heap) | |||||
{ | |||||
errno = ENOMEM; | |||||
return (void *)-1; | |||||
} | |||||
prev_heap_end = __sbrk_heap_end; | |||||
__sbrk_heap_end += incr; | |||||
return (void *)prev_heap_end; | |||||
} |
/** | |||||
****************************************************************************** | |||||
* @file system_stm32f4xx.c | |||||
* @author MCD Application Team | |||||
* @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. | |||||
* | |||||
* This file provides two functions and one global variable to be called from | |||||
* user application: | |||||
* - SystemInit(): This function is called at startup just after reset and | |||||
* before branch to main program. This call is made inside | |||||
* the "startup_stm32f4xx.s" file. | |||||
* | |||||
* - SystemCoreClock variable: Contains the core clock (HCLK), it can be used | |||||
* by the user application to setup the SysTick | |||||
* timer or configure other parameters. | |||||
* | |||||
* - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must | |||||
* be called whenever the core clock is changed | |||||
* during program execution. | |||||
* | |||||
* | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/** @addtogroup CMSIS | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup stm32f4xx_system | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup STM32F4xx_System_Private_Includes | |||||
* @{ | |||||
*/ | |||||
#include "stm32f4xx.h" | |||||
#if !defined (HSE_VALUE) | |||||
#define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ | |||||
#endif /* HSE_VALUE */ | |||||
#if !defined (HSI_VALUE) | |||||
#define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ | |||||
#endif /* HSI_VALUE */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32F4xx_System_Private_TypesDefinitions | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32F4xx_System_Private_Defines | |||||
* @{ | |||||
*/ | |||||
/************************* Miscellaneous Configuration ************************/ | |||||
/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ | |||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ | |||||
|| defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ | |||||
|| defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) | |||||
/* #define DATA_IN_ExtSRAM */ | |||||
#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ | |||||
STM32F412Zx || STM32F412Vx */ | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ | |||||
|| defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) | |||||
/* #define DATA_IN_ExtSDRAM */ | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ | |||||
STM32F479xx */ | |||||
/*!< Uncomment the following line if you need to relocate your vector Table in | |||||
Internal SRAM. */ | |||||
/* #define VECT_TAB_SRAM */ | |||||
#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. | |||||
This value must be a multiple of 0x200. */ | |||||
/******************************************************************************/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32F4xx_System_Private_Macros | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32F4xx_System_Private_Variables | |||||
* @{ | |||||
*/ | |||||
/* This variable is updated in three ways: | |||||
1) by calling CMSIS function SystemCoreClockUpdate() | |||||
2) by calling HAL API function HAL_RCC_GetHCLKFreq() | |||||
3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency | |||||
Note: If you use this function to configure the system clock; then there | |||||
is no need to call the 2 first functions listed above, since SystemCoreClock | |||||
variable is updated automatically. | |||||
*/ | |||||
uint32_t SystemCoreClock = 16000000; | |||||
const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; | |||||
const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes | |||||
* @{ | |||||
*/ | |||||
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) | |||||
static void SystemInit_ExtMemCtl(void); | |||||
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32F4xx_System_Private_Functions | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Setup the microcontroller system | |||||
* Initialize the FPU setting, vector table location and External memory | |||||
* configuration. | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
void SystemInit(void) | |||||
{ | |||||
/* FPU settings ------------------------------------------------------------*/ | |||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) | |||||
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ | |||||
#endif | |||||
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) | |||||
SystemInit_ExtMemCtl(); | |||||
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ | |||||
/* Configure the Vector Table location add offset address ------------------*/ | |||||
#ifdef VECT_TAB_SRAM | |||||
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ | |||||
#else | |||||
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ | |||||
#endif | |||||
} | |||||
/** | |||||
* @brief Update SystemCoreClock variable according to Clock Register Values. | |||||
* The SystemCoreClock variable contains the core clock (HCLK), it can | |||||
* be used by the user application to setup the SysTick timer or configure | |||||
* other parameters. | |||||
* | |||||
* @note Each time the core clock (HCLK) changes, this function must be called | |||||
* to update SystemCoreClock variable value. Otherwise, any configuration | |||||
* based on this variable will be incorrect. | |||||
* | |||||
* @note - The system frequency computed by this function is not the real | |||||
* frequency in the chip. It is calculated based on the predefined | |||||
* constant and the selected clock source: | |||||
* | |||||
* - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) | |||||
* | |||||
* - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) | |||||
* | |||||
* - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) | |||||
* or HSI_VALUE(*) multiplied/divided by the PLL factors. | |||||
* | |||||
* (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value | |||||
* 16 MHz) but the real value may vary depending on the variations | |||||
* in voltage and temperature. | |||||
* | |||||
* (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value | |||||
* depends on the application requirements), user has to ensure that HSE_VALUE | |||||
* is same as the real frequency of the crystal used. Otherwise, this function | |||||
* may have wrong result. | |||||
* | |||||
* - The result of this function could be not correct when using fractional | |||||
* value for HSE crystal. | |||||
* | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
void SystemCoreClockUpdate(void) | |||||
{ | |||||
uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; | |||||
/* Get SYSCLK source -------------------------------------------------------*/ | |||||
tmp = RCC->CFGR & RCC_CFGR_SWS; | |||||
switch (tmp) | |||||
{ | |||||
case 0x00: /* HSI used as system clock source */ | |||||
SystemCoreClock = HSI_VALUE; | |||||
break; | |||||
case 0x04: /* HSE used as system clock source */ | |||||
SystemCoreClock = HSE_VALUE; | |||||
break; | |||||
case 0x08: /* PLL used as system clock source */ | |||||
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N | |||||
SYSCLK = PLL_VCO / PLL_P | |||||
*/ | |||||
pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; | |||||
pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; | |||||
if (pllsource != 0) | |||||
{ | |||||
/* HSE used as PLL clock source */ | |||||
pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); | |||||
} | |||||
else | |||||
{ | |||||
/* HSI used as PLL clock source */ | |||||
pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); | |||||
} | |||||
pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; | |||||
SystemCoreClock = pllvco/pllp; | |||||
break; | |||||
default: | |||||
SystemCoreClock = HSI_VALUE; | |||||
break; | |||||
} | |||||
/* Compute HCLK frequency --------------------------------------------------*/ | |||||
/* Get HCLK prescaler */ | |||||
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; | |||||
/* HCLK frequency */ | |||||
SystemCoreClock >>= tmp; | |||||
} | |||||
#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ | |||||
|| defined(STM32F469xx) || defined(STM32F479xx) | |||||
/** | |||||
* @brief Setup the external memory controller. | |||||
* Called in startup_stm32f4xx.s before jump to main. | |||||
* This function configures the external memories (SRAM/SDRAM) | |||||
* This SRAM/SDRAM will be used as program data memory (including heap and stack). | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
void SystemInit_ExtMemCtl(void) | |||||
{ | |||||
__IO uint32_t tmp = 0x00; | |||||
register uint32_t tmpreg = 0, timeout = 0xFFFF; | |||||
register __IO uint32_t index; | |||||
/* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ | |||||
RCC->AHB1ENR |= 0x000001F8; | |||||
/* Delay after an RCC peripheral clock enabling */ | |||||
tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); | |||||
/* Connect PDx pins to FMC Alternate function */ | |||||
GPIOD->AFR[0] = 0x00CCC0CC; | |||||
GPIOD->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PDx pins in Alternate function mode */ | |||||
GPIOD->MODER = 0xAAAA0A8A; | |||||
/* Configure PDx pins speed to 100 MHz */ | |||||
GPIOD->OSPEEDR = 0xFFFF0FCF; | |||||
/* Configure PDx pins Output type to push-pull */ | |||||
GPIOD->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PDx pins */ | |||||
GPIOD->PUPDR = 0x00000000; | |||||
/* Connect PEx pins to FMC Alternate function */ | |||||
GPIOE->AFR[0] = 0xC00CC0CC; | |||||
GPIOE->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PEx pins in Alternate function mode */ | |||||
GPIOE->MODER = 0xAAAA828A; | |||||
/* Configure PEx pins speed to 100 MHz */ | |||||
GPIOE->OSPEEDR = 0xFFFFC3CF; | |||||
/* Configure PEx pins Output type to push-pull */ | |||||
GPIOE->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PEx pins */ | |||||
GPIOE->PUPDR = 0x00000000; | |||||
/* Connect PFx pins to FMC Alternate function */ | |||||
GPIOF->AFR[0] = 0xCCCCCCCC; | |||||
GPIOF->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PFx pins in Alternate function mode */ | |||||
GPIOF->MODER = 0xAA800AAA; | |||||
/* Configure PFx pins speed to 50 MHz */ | |||||
GPIOF->OSPEEDR = 0xAA800AAA; | |||||
/* Configure PFx pins Output type to push-pull */ | |||||
GPIOF->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PFx pins */ | |||||
GPIOF->PUPDR = 0x00000000; | |||||
/* Connect PGx pins to FMC Alternate function */ | |||||
GPIOG->AFR[0] = 0xCCCCCCCC; | |||||
GPIOG->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PGx pins in Alternate function mode */ | |||||
GPIOG->MODER = 0xAAAAAAAA; | |||||
/* Configure PGx pins speed to 50 MHz */ | |||||
GPIOG->OSPEEDR = 0xAAAAAAAA; | |||||
/* Configure PGx pins Output type to push-pull */ | |||||
GPIOG->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PGx pins */ | |||||
GPIOG->PUPDR = 0x00000000; | |||||
/* Connect PHx pins to FMC Alternate function */ | |||||
GPIOH->AFR[0] = 0x00C0CC00; | |||||
GPIOH->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PHx pins in Alternate function mode */ | |||||
GPIOH->MODER = 0xAAAA08A0; | |||||
/* Configure PHx pins speed to 50 MHz */ | |||||
GPIOH->OSPEEDR = 0xAAAA08A0; | |||||
/* Configure PHx pins Output type to push-pull */ | |||||
GPIOH->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PHx pins */ | |||||
GPIOH->PUPDR = 0x00000000; | |||||
/* Connect PIx pins to FMC Alternate function */ | |||||
GPIOI->AFR[0] = 0xCCCCCCCC; | |||||
GPIOI->AFR[1] = 0x00000CC0; | |||||
/* Configure PIx pins in Alternate function mode */ | |||||
GPIOI->MODER = 0x0028AAAA; | |||||
/* Configure PIx pins speed to 50 MHz */ | |||||
GPIOI->OSPEEDR = 0x0028AAAA; | |||||
/* Configure PIx pins Output type to push-pull */ | |||||
GPIOI->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PIx pins */ | |||||
GPIOI->PUPDR = 0x00000000; | |||||
/*-- FMC Configuration -------------------------------------------------------*/ | |||||
/* Enable the FMC interface clock */ | |||||
RCC->AHB3ENR |= 0x00000001; | |||||
/* Delay after an RCC peripheral clock enabling */ | |||||
tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); | |||||
FMC_Bank5_6->SDCR[0] = 0x000019E4; | |||||
FMC_Bank5_6->SDTR[0] = 0x01115351; | |||||
/* SDRAM initialization sequence */ | |||||
/* Clock enable command */ | |||||
FMC_Bank5_6->SDCMR = 0x00000011; | |||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; | |||||
while((tmpreg != 0) && (timeout-- > 0)) | |||||
{ | |||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; | |||||
} | |||||
/* Delay */ | |||||
for (index = 0; index<1000; index++); | |||||
/* PALL command */ | |||||
FMC_Bank5_6->SDCMR = 0x00000012; | |||||
timeout = 0xFFFF; | |||||
while((tmpreg != 0) && (timeout-- > 0)) | |||||
{ | |||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; | |||||
} | |||||
/* Auto refresh command */ | |||||
FMC_Bank5_6->SDCMR = 0x00000073; | |||||
timeout = 0xFFFF; | |||||
while((tmpreg != 0) && (timeout-- > 0)) | |||||
{ | |||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; | |||||
} | |||||
/* MRD register program */ | |||||
FMC_Bank5_6->SDCMR = 0x00046014; | |||||
timeout = 0xFFFF; | |||||
while((tmpreg != 0) && (timeout-- > 0)) | |||||
{ | |||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; | |||||
} | |||||
/* Set refresh count */ | |||||
tmpreg = FMC_Bank5_6->SDRTR; | |||||
FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); | |||||
/* Disable write protection */ | |||||
tmpreg = FMC_Bank5_6->SDCR[0]; | |||||
FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) | |||||
/* Configure and enable Bank1_SRAM2 */ | |||||
FMC_Bank1->BTCR[2] = 0x00001011; | |||||
FMC_Bank1->BTCR[3] = 0x00000201; | |||||
FMC_Bank1E->BWTR[2] = 0x0fffffff; | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ | |||||
#if defined(STM32F469xx) || defined(STM32F479xx) | |||||
/* Configure and enable Bank1_SRAM2 */ | |||||
FMC_Bank1->BTCR[2] = 0x00001091; | |||||
FMC_Bank1->BTCR[3] = 0x00110212; | |||||
FMC_Bank1E->BWTR[2] = 0x0fffffff; | |||||
#endif /* STM32F469xx || STM32F479xx */ | |||||
(void)(tmp); | |||||
} | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ | |||||
#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) | |||||
/** | |||||
* @brief Setup the external memory controller. | |||||
* Called in startup_stm32f4xx.s before jump to main. | |||||
* This function configures the external memories (SRAM/SDRAM) | |||||
* This SRAM/SDRAM will be used as program data memory (including heap and stack). | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
void SystemInit_ExtMemCtl(void) | |||||
{ | |||||
__IO uint32_t tmp = 0x00; | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ | |||||
|| defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) | |||||
#if defined (DATA_IN_ExtSDRAM) | |||||
register uint32_t tmpreg = 0, timeout = 0xFFFF; | |||||
register __IO uint32_t index; | |||||
#if defined(STM32F446xx) | |||||
/* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface | |||||
clock */ | |||||
RCC->AHB1ENR |= 0x0000007D; | |||||
#else | |||||
/* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface | |||||
clock */ | |||||
RCC->AHB1ENR |= 0x000001F8; | |||||
#endif /* STM32F446xx */ | |||||
/* Delay after an RCC peripheral clock enabling */ | |||||
tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); | |||||
#if defined(STM32F446xx) | |||||
/* Connect PAx pins to FMC Alternate function */ | |||||
GPIOA->AFR[0] |= 0xC0000000; | |||||
GPIOA->AFR[1] |= 0x00000000; | |||||
/* Configure PDx pins in Alternate function mode */ | |||||
GPIOA->MODER |= 0x00008000; | |||||
/* Configure PDx pins speed to 50 MHz */ | |||||
GPIOA->OSPEEDR |= 0x00008000; | |||||
/* Configure PDx pins Output type to push-pull */ | |||||
GPIOA->OTYPER |= 0x00000000; | |||||
/* No pull-up, pull-down for PDx pins */ | |||||
GPIOA->PUPDR |= 0x00000000; | |||||
/* Connect PCx pins to FMC Alternate function */ | |||||
GPIOC->AFR[0] |= 0x00CC0000; | |||||
GPIOC->AFR[1] |= 0x00000000; | |||||
/* Configure PDx pins in Alternate function mode */ | |||||
GPIOC->MODER |= 0x00000A00; | |||||
/* Configure PDx pins speed to 50 MHz */ | |||||
GPIOC->OSPEEDR |= 0x00000A00; | |||||
/* Configure PDx pins Output type to push-pull */ | |||||
GPIOC->OTYPER |= 0x00000000; | |||||
/* No pull-up, pull-down for PDx pins */ | |||||
GPIOC->PUPDR |= 0x00000000; | |||||
#endif /* STM32F446xx */ | |||||
/* Connect PDx pins to FMC Alternate function */ | |||||
GPIOD->AFR[0] = 0x000000CC; | |||||
GPIOD->AFR[1] = 0xCC000CCC; | |||||
/* Configure PDx pins in Alternate function mode */ | |||||
GPIOD->MODER = 0xA02A000A; | |||||
/* Configure PDx pins speed to 50 MHz */ | |||||
GPIOD->OSPEEDR = 0xA02A000A; | |||||
/* Configure PDx pins Output type to push-pull */ | |||||
GPIOD->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PDx pins */ | |||||
GPIOD->PUPDR = 0x00000000; | |||||
/* Connect PEx pins to FMC Alternate function */ | |||||
GPIOE->AFR[0] = 0xC00000CC; | |||||
GPIOE->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PEx pins in Alternate function mode */ | |||||
GPIOE->MODER = 0xAAAA800A; | |||||
/* Configure PEx pins speed to 50 MHz */ | |||||
GPIOE->OSPEEDR = 0xAAAA800A; | |||||
/* Configure PEx pins Output type to push-pull */ | |||||
GPIOE->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PEx pins */ | |||||
GPIOE->PUPDR = 0x00000000; | |||||
/* Connect PFx pins to FMC Alternate function */ | |||||
GPIOF->AFR[0] = 0xCCCCCCCC; | |||||
GPIOF->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PFx pins in Alternate function mode */ | |||||
GPIOF->MODER = 0xAA800AAA; | |||||
/* Configure PFx pins speed to 50 MHz */ | |||||
GPIOF->OSPEEDR = 0xAA800AAA; | |||||
/* Configure PFx pins Output type to push-pull */ | |||||
GPIOF->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PFx pins */ | |||||
GPIOF->PUPDR = 0x00000000; | |||||
/* Connect PGx pins to FMC Alternate function */ | |||||
GPIOG->AFR[0] = 0xCCCCCCCC; | |||||
GPIOG->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PGx pins in Alternate function mode */ | |||||
GPIOG->MODER = 0xAAAAAAAA; | |||||
/* Configure PGx pins speed to 50 MHz */ | |||||
GPIOG->OSPEEDR = 0xAAAAAAAA; | |||||
/* Configure PGx pins Output type to push-pull */ | |||||
GPIOG->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PGx pins */ | |||||
GPIOG->PUPDR = 0x00000000; | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ | |||||
|| defined(STM32F469xx) || defined(STM32F479xx) | |||||
/* Connect PHx pins to FMC Alternate function */ | |||||
GPIOH->AFR[0] = 0x00C0CC00; | |||||
GPIOH->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PHx pins in Alternate function mode */ | |||||
GPIOH->MODER = 0xAAAA08A0; | |||||
/* Configure PHx pins speed to 50 MHz */ | |||||
GPIOH->OSPEEDR = 0xAAAA08A0; | |||||
/* Configure PHx pins Output type to push-pull */ | |||||
GPIOH->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PHx pins */ | |||||
GPIOH->PUPDR = 0x00000000; | |||||
/* Connect PIx pins to FMC Alternate function */ | |||||
GPIOI->AFR[0] = 0xCCCCCCCC; | |||||
GPIOI->AFR[1] = 0x00000CC0; | |||||
/* Configure PIx pins in Alternate function mode */ | |||||
GPIOI->MODER = 0x0028AAAA; | |||||
/* Configure PIx pins speed to 50 MHz */ | |||||
GPIOI->OSPEEDR = 0x0028AAAA; | |||||
/* Configure PIx pins Output type to push-pull */ | |||||
GPIOI->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PIx pins */ | |||||
GPIOI->PUPDR = 0x00000000; | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ | |||||
/*-- FMC Configuration -------------------------------------------------------*/ | |||||
/* Enable the FMC interface clock */ | |||||
RCC->AHB3ENR |= 0x00000001; | |||||
/* Delay after an RCC peripheral clock enabling */ | |||||
tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); | |||||
/* Configure and enable SDRAM bank1 */ | |||||
#if defined(STM32F446xx) | |||||
FMC_Bank5_6->SDCR[0] = 0x00001954; | |||||
#else | |||||
FMC_Bank5_6->SDCR[0] = 0x000019E4; | |||||
#endif /* STM32F446xx */ | |||||
FMC_Bank5_6->SDTR[0] = 0x01115351; | |||||
/* SDRAM initialization sequence */ | |||||
/* Clock enable command */ | |||||
FMC_Bank5_6->SDCMR = 0x00000011; | |||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; | |||||
while((tmpreg != 0) && (timeout-- > 0)) | |||||
{ | |||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; | |||||
} | |||||
/* Delay */ | |||||
for (index = 0; index<1000; index++); | |||||
/* PALL command */ | |||||
FMC_Bank5_6->SDCMR = 0x00000012; | |||||
timeout = 0xFFFF; | |||||
while((tmpreg != 0) && (timeout-- > 0)) | |||||
{ | |||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; | |||||
} | |||||
/* Auto refresh command */ | |||||
#if defined(STM32F446xx) | |||||
FMC_Bank5_6->SDCMR = 0x000000F3; | |||||
#else | |||||
FMC_Bank5_6->SDCMR = 0x00000073; | |||||
#endif /* STM32F446xx */ | |||||
timeout = 0xFFFF; | |||||
while((tmpreg != 0) && (timeout-- > 0)) | |||||
{ | |||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; | |||||
} | |||||
/* MRD register program */ | |||||
#if defined(STM32F446xx) | |||||
FMC_Bank5_6->SDCMR = 0x00044014; | |||||
#else | |||||
FMC_Bank5_6->SDCMR = 0x00046014; | |||||
#endif /* STM32F446xx */ | |||||
timeout = 0xFFFF; | |||||
while((tmpreg != 0) && (timeout-- > 0)) | |||||
{ | |||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020; | |||||
} | |||||
/* Set refresh count */ | |||||
tmpreg = FMC_Bank5_6->SDRTR; | |||||
#if defined(STM32F446xx) | |||||
FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); | |||||
#else | |||||
FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); | |||||
#endif /* STM32F446xx */ | |||||
/* Disable write protection */ | |||||
tmpreg = FMC_Bank5_6->SDCR[0]; | |||||
FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); | |||||
#endif /* DATA_IN_ExtSDRAM */ | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ | |||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ | |||||
|| defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ | |||||
|| defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) | |||||
#if defined(DATA_IN_ExtSRAM) | |||||
/*-- GPIOs Configuration -----------------------------------------------------*/ | |||||
/* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ | |||||
RCC->AHB1ENR |= 0x00000078; | |||||
/* Delay after an RCC peripheral clock enabling */ | |||||
tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); | |||||
/* Connect PDx pins to FMC Alternate function */ | |||||
GPIOD->AFR[0] = 0x00CCC0CC; | |||||
GPIOD->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PDx pins in Alternate function mode */ | |||||
GPIOD->MODER = 0xAAAA0A8A; | |||||
/* Configure PDx pins speed to 100 MHz */ | |||||
GPIOD->OSPEEDR = 0xFFFF0FCF; | |||||
/* Configure PDx pins Output type to push-pull */ | |||||
GPIOD->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PDx pins */ | |||||
GPIOD->PUPDR = 0x00000000; | |||||
/* Connect PEx pins to FMC Alternate function */ | |||||
GPIOE->AFR[0] = 0xC00CC0CC; | |||||
GPIOE->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PEx pins in Alternate function mode */ | |||||
GPIOE->MODER = 0xAAAA828A; | |||||
/* Configure PEx pins speed to 100 MHz */ | |||||
GPIOE->OSPEEDR = 0xFFFFC3CF; | |||||
/* Configure PEx pins Output type to push-pull */ | |||||
GPIOE->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PEx pins */ | |||||
GPIOE->PUPDR = 0x00000000; | |||||
/* Connect PFx pins to FMC Alternate function */ | |||||
GPIOF->AFR[0] = 0x00CCCCCC; | |||||
GPIOF->AFR[1] = 0xCCCC0000; | |||||
/* Configure PFx pins in Alternate function mode */ | |||||
GPIOF->MODER = 0xAA000AAA; | |||||
/* Configure PFx pins speed to 100 MHz */ | |||||
GPIOF->OSPEEDR = 0xFF000FFF; | |||||
/* Configure PFx pins Output type to push-pull */ | |||||
GPIOF->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PFx pins */ | |||||
GPIOF->PUPDR = 0x00000000; | |||||
/* Connect PGx pins to FMC Alternate function */ | |||||
GPIOG->AFR[0] = 0x00CCCCCC; | |||||
GPIOG->AFR[1] = 0x000000C0; | |||||
/* Configure PGx pins in Alternate function mode */ | |||||
GPIOG->MODER = 0x00085AAA; | |||||
/* Configure PGx pins speed to 100 MHz */ | |||||
GPIOG->OSPEEDR = 0x000CAFFF; | |||||
/* Configure PGx pins Output type to push-pull */ | |||||
GPIOG->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PGx pins */ | |||||
GPIOG->PUPDR = 0x00000000; | |||||
/*-- FMC/FSMC Configuration --------------------------------------------------*/ | |||||
/* Enable the FMC/FSMC interface clock */ | |||||
RCC->AHB3ENR |= 0x00000001; | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) | |||||
/* Delay after an RCC peripheral clock enabling */ | |||||
tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); | |||||
/* Configure and enable Bank1_SRAM2 */ | |||||
FMC_Bank1->BTCR[2] = 0x00001011; | |||||
FMC_Bank1->BTCR[3] = 0x00000201; | |||||
FMC_Bank1E->BWTR[2] = 0x0fffffff; | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ | |||||
#if defined(STM32F469xx) || defined(STM32F479xx) | |||||
/* Delay after an RCC peripheral clock enabling */ | |||||
tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); | |||||
/* Configure and enable Bank1_SRAM2 */ | |||||
FMC_Bank1->BTCR[2] = 0x00001091; | |||||
FMC_Bank1->BTCR[3] = 0x00110212; | |||||
FMC_Bank1E->BWTR[2] = 0x0fffffff; | |||||
#endif /* STM32F469xx || STM32F479xx */ | |||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ | |||||
|| defined(STM32F412Zx) || defined(STM32F412Vx) | |||||
/* Delay after an RCC peripheral clock enabling */ | |||||
tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); | |||||
/* Configure and enable Bank1_SRAM2 */ | |||||
FSMC_Bank1->BTCR[2] = 0x00001011; | |||||
FSMC_Bank1->BTCR[3] = 0x00000201; | |||||
FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; | |||||
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ | |||||
#endif /* DATA_IN_ExtSRAM */ | |||||
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ | |||||
STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ | |||||
(void)(tmp); | |||||
} | |||||
#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx.h | |||||
* @author MCD Application Team | |||||
* @brief CMSIS STM32F4xx Device Peripheral Access Layer Header File. | |||||
* | |||||
* The file is the unique include file that the application programmer | |||||
* is using in the C source code, usually in main.c. This file contains: | |||||
* - Configuration section that allows to select: | |||||
* - The STM32F4xx device used in the target application | |||||
* - To use or not the peripheral’s drivers in application code(i.e. | |||||
* code will be based on direct access to peripheral’s registers | |||||
* rather than drivers API), this option is controlled by | |||||
* "#define USE_HAL_DRIVER" | |||||
* | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/** @addtogroup CMSIS | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup stm32f4xx | |||||
* @{ | |||||
*/ | |||||
#ifndef __STM32F4xx_H | |||||
#define __STM32F4xx_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif /* __cplusplus */ | |||||
/** @addtogroup Library_configuration_section | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief STM32 Family | |||||
*/ | |||||
#if !defined (STM32F4) | |||||
#define STM32F4 | |||||
#endif /* STM32F4 */ | |||||
/* Uncomment the line below according to the target STM32 device used in your | |||||
application | |||||
*/ | |||||
#if !defined (STM32F405xx) && !defined (STM32F415xx) && !defined (STM32F407xx) && !defined (STM32F417xx) && \ | |||||
!defined (STM32F427xx) && !defined (STM32F437xx) && !defined (STM32F429xx) && !defined (STM32F439xx) && \ | |||||
!defined (STM32F401xC) && !defined (STM32F401xE) && !defined (STM32F410Tx) && !defined (STM32F410Cx) && \ | |||||
!defined (STM32F410Rx) && !defined (STM32F411xE) && !defined (STM32F446xx) && !defined (STM32F469xx) && \ | |||||
!defined (STM32F479xx) && !defined (STM32F412Cx) && !defined (STM32F412Rx) && !defined (STM32F412Vx) && \ | |||||
!defined (STM32F412Zx) && !defined (STM32F413xx) && !defined (STM32F423xx) | |||||
/* #define STM32F405xx */ /*!< STM32F405RG, STM32F405VG and STM32F405ZG Devices */ | |||||
/* #define STM32F415xx */ /*!< STM32F415RG, STM32F415VG and STM32F415ZG Devices */ | |||||
/* #define STM32F407xx */ /*!< STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG and STM32F407IE Devices */ | |||||
/* #define STM32F417xx */ /*!< STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */ | |||||
/* #define STM32F427xx */ /*!< STM32F427VG, STM32F427VI, STM32F427ZG, STM32F427ZI, STM32F427IG and STM32F427II Devices */ | |||||
/* #define STM32F437xx */ /*!< STM32F437VG, STM32F437VI, STM32F437ZG, STM32F437ZI, STM32F437IG and STM32F437II Devices */ | |||||
/* #define STM32F429xx */ /*!< STM32F429VG, STM32F429VI, STM32F429ZG, STM32F429ZI, STM32F429BG, STM32F429BI, STM32F429NG, | |||||
STM32F439NI, STM32F429IG and STM32F429II Devices */ | |||||
/* #define STM32F439xx */ /*!< STM32F439VG, STM32F439VI, STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, | |||||
STM32F439NI, STM32F439IG and STM32F439II Devices */ | |||||
/* #define STM32F401xC */ /*!< STM32F401CB, STM32F401CC, STM32F401RB, STM32F401RC, STM32F401VB and STM32F401VC Devices */ | |||||
/* #define STM32F401xE */ /*!< STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CE, STM32F401RE and STM32F401VE Devices */ | |||||
/* #define STM32F410Tx */ /*!< STM32F410T8 and STM32F410TB Devices */ | |||||
/* #define STM32F410Cx */ /*!< STM32F410C8 and STM32F410CB Devices */ | |||||
/* #define STM32F410Rx */ /*!< STM32F410R8 and STM32F410RB Devices */ | |||||
/* #define STM32F411xE */ /*!< STM32F411CC, STM32F411RC, STM32F411VC, STM32F411CE, STM32F411RE and STM32F411VE Devices */ | |||||
/* #define STM32F446xx */ /*!< STM32F446MC, STM32F446ME, STM32F446RC, STM32F446RE, STM32F446VC, STM32F446VE, STM32F446ZC, | |||||
and STM32F446ZE Devices */ | |||||
/* #define STM32F469xx */ /*!< STM32F469AI, STM32F469II, STM32F469BI, STM32F469NI, STM32F469AG, STM32F469IG, STM32F469BG, | |||||
STM32F469NG, STM32F469AE, STM32F469IE, STM32F469BE and STM32F469NE Devices */ | |||||
/* #define STM32F479xx */ /*!< STM32F479AI, STM32F479II, STM32F479BI, STM32F479NI, STM32F479AG, STM32F479IG, STM32F479BG | |||||
and STM32F479NG Devices */ | |||||
/* #define STM32F412Cx */ /*!< STM32F412CEU and STM32F412CGU Devices */ | |||||
/* #define STM32F412Zx */ /*!< STM32F412ZET, STM32F412ZGT, STM32F412ZEJ and STM32F412ZGJ Devices */ | |||||
/* #define STM32F412Vx */ /*!< STM32F412VET, STM32F412VGT, STM32F412VEH and STM32F412VGH Devices */ | |||||
/* #define STM32F412Rx */ /*!< STM32F412RET, STM32F412RGT, STM32F412REY and STM32F412RGY Devices */ | |||||
/* #define STM32F413xx */ /*!< STM32F413CH, STM32F413MH, STM32F413RH, STM32F413VH, STM32F413ZH, STM32F413CG, STM32F413MG, | |||||
STM32F413RG, STM32F413VG and STM32F413ZG Devices */ | |||||
/* #define STM32F423xx */ /*!< STM32F423CH, STM32F423RH, STM32F423VH and STM32F423ZH Devices */ | |||||
#endif | |||||
/* Tip: To avoid modifying this file each time you need to switch between these | |||||
devices, you can define the device in your toolchain compiler preprocessor. | |||||
*/ | |||||
#if !defined (USE_HAL_DRIVER) | |||||
/** | |||||
* @brief Comment the line below if you will not use the peripherals drivers. | |||||
In this case, these drivers will not be included and the application code will | |||||
be based on direct access to peripherals registers | |||||
*/ | |||||
/*#define USE_HAL_DRIVER */ | |||||
#endif /* USE_HAL_DRIVER */ | |||||
/** | |||||
* @brief CMSIS version number V2.6.5 | |||||
*/ | |||||
#define __STM32F4xx_CMSIS_VERSION_MAIN (0x02U) /*!< [31:24] main version */ | |||||
#define __STM32F4xx_CMSIS_VERSION_SUB1 (0x06U) /*!< [23:16] sub1 version */ | |||||
#define __STM32F4xx_CMSIS_VERSION_SUB2 (0x05U) /*!< [15:8] sub2 version */ | |||||
#define __STM32F4xx_CMSIS_VERSION_RC (0x00U) /*!< [7:0] release candidate */ | |||||
#define __STM32F4xx_CMSIS_VERSION ((__STM32F4xx_CMSIS_VERSION_MAIN << 24)\ | |||||
|(__STM32F4xx_CMSIS_VERSION_SUB1 << 16)\ | |||||
|(__STM32F4xx_CMSIS_VERSION_SUB2 << 8 )\ | |||||
|(__STM32F4xx_CMSIS_VERSION)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup Device_Included | |||||
* @{ | |||||
*/ | |||||
#if defined(STM32F405xx) | |||||
#include "stm32f405xx.h" | |||||
#elif defined(STM32F415xx) | |||||
#include "stm32f415xx.h" | |||||
#elif defined(STM32F407xx) | |||||
#include "stm32f407xx.h" | |||||
#elif defined(STM32F417xx) | |||||
#include "stm32f417xx.h" | |||||
#elif defined(STM32F427xx) | |||||
#include "stm32f427xx.h" | |||||
#elif defined(STM32F437xx) | |||||
#include "stm32f437xx.h" | |||||
#elif defined(STM32F429xx) | |||||
#include "stm32f429xx.h" | |||||
#elif defined(STM32F439xx) | |||||
#include "stm32f439xx.h" | |||||
#elif defined(STM32F401xC) | |||||
#include "stm32f401xc.h" | |||||
#elif defined(STM32F401xE) | |||||
#include "stm32f401xe.h" | |||||
#elif defined(STM32F410Tx) | |||||
#include "stm32f410tx.h" | |||||
#elif defined(STM32F410Cx) | |||||
#include "stm32f410cx.h" | |||||
#elif defined(STM32F410Rx) | |||||
#include "stm32f410rx.h" | |||||
#elif defined(STM32F411xE) | |||||
#include "stm32f411xe.h" | |||||
#elif defined(STM32F446xx) | |||||
#include "stm32f446xx.h" | |||||
#elif defined(STM32F469xx) | |||||
#include "stm32f469xx.h" | |||||
#elif defined(STM32F479xx) | |||||
#include "stm32f479xx.h" | |||||
#elif defined(STM32F412Cx) | |||||
#include "stm32f412cx.h" | |||||
#elif defined(STM32F412Zx) | |||||
#include "stm32f412zx.h" | |||||
#elif defined(STM32F412Rx) | |||||
#include "stm32f412rx.h" | |||||
#elif defined(STM32F412Vx) | |||||
#include "stm32f412vx.h" | |||||
#elif defined(STM32F413xx) | |||||
#include "stm32f413xx.h" | |||||
#elif defined(STM32F423xx) | |||||
#include "stm32f423xx.h" | |||||
#else | |||||
#error "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)" | |||||
#endif | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup Exported_types | |||||
* @{ | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
RESET = 0U, | |||||
SET = !RESET | |||||
} FlagStatus, ITStatus; | |||||
typedef enum | |||||
{ | |||||
DISABLE = 0U, | |||||
ENABLE = !DISABLE | |||||
} FunctionalState; | |||||
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) | |||||
typedef enum | |||||
{ | |||||
SUCCESS = 0U, | |||||
ERROR = !SUCCESS | |||||
} ErrorStatus; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup Exported_macro | |||||
* @{ | |||||
*/ | |||||
#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))) | |||||
#define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))) | |||||
/** | |||||
* @} | |||||
*/ | |||||
#if defined (USE_HAL_DRIVER) | |||||
#include "stm32f4xx_hal.h" | |||||
#endif /* USE_HAL_DRIVER */ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif /* __cplusplus */ | |||||
#endif /* __STM32F4xx_H */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file system_stm32f4xx.h | |||||
* @author MCD Application Team | |||||
* @brief CMSIS Cortex-M4 Device System Source File for STM32F4xx devices. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without modification, | |||||
* are permitted provided that the following conditions are met: | |||||
* 1. Redistributions of source code must retain the above copyright notice, | |||||
* this list of conditions and the following disclaimer. | |||||
* 2. 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. | |||||
* 3. Neither the name of STMicroelectronics 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 THE COPYRIGHT HOLDER OR 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. | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/** @addtogroup CMSIS | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup stm32f4xx_system | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Define to prevent recursive inclusion | |||||
*/ | |||||
#ifndef __SYSTEM_STM32F4XX_H | |||||
#define __SYSTEM_STM32F4XX_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/** @addtogroup STM32F4xx_System_Includes | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32F4xx_System_Exported_types | |||||
* @{ | |||||
*/ | |||||
/* This variable is updated in three ways: | |||||
1) by calling CMSIS function SystemCoreClockUpdate() | |||||
2) by calling HAL API function HAL_RCC_GetSysClockFreq() | |||||
3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency | |||||
Note: If you use this function to configure the system clock; then there | |||||
is no need to call the 2 first functions listed above, since SystemCoreClock | |||||
variable is updated automatically. | |||||
*/ | |||||
extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ | |||||
extern const uint8_t AHBPrescTable[16]; /*!< AHB prescalers table values */ | |||||
extern const uint8_t APBPrescTable[8]; /*!< APB prescalers table values */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32F4xx_System_Exported_Constants | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32F4xx_System_Exported_Macros | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32F4xx_System_Exported_Functions | |||||
* @{ | |||||
*/ | |||||
extern void SystemInit(void); | |||||
extern void SystemCoreClockUpdate(void); | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /*__SYSTEM_STM32F4XX_H */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/**************************************************************************//** | |||||
* @file cmsis_armcc.h | |||||
* @brief CMSIS compiler ARMCC (Arm Compiler 5) header file | |||||
* @version V5.0.4 | |||||
* @date 10. January 2018 | |||||
******************************************************************************/ | |||||
/* | |||||
* Copyright (c) 2009-2018 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 | |||||
* | |||||
* 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. | |||||
*/ | |||||
#ifndef __CMSIS_ARMCC_H | |||||
#define __CMSIS_ARMCC_H | |||||
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) | |||||
#error "Please use Arm Compiler Toolchain V4.0.677 or later!" | |||||
#endif | |||||
/* CMSIS compiler control architecture macros */ | |||||
#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ | |||||
(defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) | |||||
#define __ARM_ARCH_6M__ 1 | |||||
#endif | |||||
#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) | |||||
#define __ARM_ARCH_7M__ 1 | |||||
#endif | |||||
#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) | |||||
#define __ARM_ARCH_7EM__ 1 | |||||
#endif | |||||
/* __ARM_ARCH_8M_BASE__ not applicable */ | |||||
/* __ARM_ARCH_8M_MAIN__ not applicable */ | |||||
/* CMSIS compiler specific defines */ | |||||
#ifndef __ASM | |||||
#define __ASM __asm | |||||
#endif | |||||
#ifndef __INLINE | |||||
#define __INLINE __inline | |||||
#endif | |||||
#ifndef __STATIC_INLINE | |||||
#define __STATIC_INLINE static __inline | |||||
#endif | |||||
#ifndef __STATIC_FORCEINLINE | |||||
#define __STATIC_FORCEINLINE static __forceinline | |||||
#endif | |||||
#ifndef __NO_RETURN | |||||
#define __NO_RETURN __declspec(noreturn) | |||||
#endif | |||||
#ifndef __USED | |||||
#define __USED __attribute__((used)) | |||||
#endif | |||||
#ifndef __WEAK | |||||
#define __WEAK __attribute__((weak)) | |||||
#endif | |||||
#ifndef __PACKED | |||||
#define __PACKED __attribute__((packed)) | |||||
#endif | |||||
#ifndef __PACKED_STRUCT | |||||
#define __PACKED_STRUCT __packed struct | |||||
#endif | |||||
#ifndef __PACKED_UNION | |||||
#define __PACKED_UNION __packed union | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32 /* deprecated */ | |||||
#define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT16_WRITE | |||||
#define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT16_READ | |||||
#define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32_WRITE | |||||
#define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32_READ | |||||
#define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) | |||||
#endif | |||||
#ifndef __ALIGNED | |||||
#define __ALIGNED(x) __attribute__((aligned(x))) | |||||
#endif | |||||
#ifndef __RESTRICT | |||||
#define __RESTRICT __restrict | |||||
#endif | |||||
/* ########################### Core Function Access ########################### */ | |||||
/** \ingroup CMSIS_Core_FunctionInterface | |||||
\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions | |||||
@{ | |||||
*/ | |||||
/** | |||||
\brief Enable IRQ Interrupts | |||||
\details Enables IRQ interrupts by clearing the I-bit in the CPSR. | |||||
Can only be executed in Privileged modes. | |||||
*/ | |||||
/* intrinsic void __enable_irq(); */ | |||||
/** | |||||
\brief Disable IRQ Interrupts | |||||
\details Disables IRQ interrupts by setting the I-bit in the CPSR. | |||||
Can only be executed in Privileged modes. | |||||
*/ | |||||
/* intrinsic void __disable_irq(); */ | |||||
/** | |||||
\brief Get Control Register | |||||
\details 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 | |||||
\details 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 | |||||
\details 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 | |||||
\details 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 | |||||
\details 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 | |||||
\details 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 | |||||
\details 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 | |||||
\details 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 | |||||
\details 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 | |||||
\details 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 | |||||
\details 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 ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ | |||||
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) | |||||
/** | |||||
\brief Enable FIQ | |||||
\details 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 | |||||
\details 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 | |||||
\details 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 | |||||
\details 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 & 0xFFU); | |||||
} | |||||
/** | |||||
\brief Set Base Priority with condition | |||||
\details 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 & 0xFFU); | |||||
} | |||||
/** | |||||
\brief Get Fault Mask | |||||
\details 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 | |||||
\details 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)1U); | |||||
} | |||||
#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ | |||||
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ | |||||
/** | |||||
\brief Get FPSCR | |||||
\details 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 ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ | |||||
(defined (__FPU_USED ) && (__FPU_USED == 1U)) ) | |||||
register uint32_t __regfpscr __ASM("fpscr"); | |||||
return(__regfpscr); | |||||
#else | |||||
return(0U); | |||||
#endif | |||||
} | |||||
/** | |||||
\brief Set FPSCR | |||||
\details 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 ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ | |||||
(defined (__FPU_USED ) && (__FPU_USED == 1U)) ) | |||||
register uint32_t __regfpscr __ASM("fpscr"); | |||||
__regfpscr = (fpscr); | |||||
#else | |||||
(void)fpscr; | |||||
#endif | |||||
} | |||||
/*@} end of CMSIS_Core_RegAccFunctions */ | |||||
/* ########################## Core Instruction Access ######################### */ | |||||
/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface | |||||
Access to dedicated instructions | |||||
@{ | |||||
*/ | |||||
/** | |||||
\brief No Operation | |||||
\details No Operation does nothing. This instruction can be used for code alignment purposes. | |||||
*/ | |||||
#define __NOP __nop | |||||
/** | |||||
\brief Wait For Interrupt | |||||
\details 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 | |||||
\details 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 | |||||
\details Send Event is a hint instruction. It causes an event to be signaled to the CPU. | |||||
*/ | |||||
#define __SEV __sev | |||||
/** | |||||
\brief Instruction Synchronization Barrier | |||||
\details 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 (0U) | |||||
/** | |||||
\brief Data Synchronization Barrier | |||||
\details 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 (0U) | |||||
/** | |||||
\brief Data Memory Barrier | |||||
\details 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 (0U) | |||||
/** | |||||
\brief Reverse byte order (32 bit) | |||||
\details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. | |||||
\param [in] value Value to reverse | |||||
\return Reversed value | |||||
*/ | |||||
#define __REV __rev | |||||
/** | |||||
\brief Reverse byte order (16 bit) | |||||
\details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. | |||||
\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 (16 bit) | |||||
\details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. | |||||
\param [in] value Value to reverse | |||||
\return Reversed value | |||||
*/ | |||||
#ifndef __NO_EMBEDDED_ASM | |||||
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) | |||||
{ | |||||
revsh r0, r0 | |||||
bx lr | |||||
} | |||||
#endif | |||||
/** | |||||
\brief Rotate Right in unsigned value (32 bit) | |||||
\details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. | |||||
\param [in] op1 Value to rotate | |||||
\param [in] op2 Number of Bits to rotate | |||||
\return Rotated value | |||||
*/ | |||||
#define __ROR __ror | |||||
/** | |||||
\brief Breakpoint | |||||
\details 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 | |||||
\details Reverses the bit order of the given value. | |||||
\param [in] value Value to reverse | |||||
\return Reversed value | |||||
*/ | |||||
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ | |||||
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) | |||||
#define __RBIT __rbit | |||||
#else | |||||
__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) | |||||
{ | |||||
uint32_t result; | |||||
uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ | |||||
result = value; /* r will be reversed bits of v; first get LSB of v */ | |||||
for (value >>= 1U; value != 0U; value >>= 1U) | |||||
{ | |||||
result <<= 1U; | |||||
result |= value & 1U; | |||||
s--; | |||||
} | |||||
result <<= s; /* shift when v's highest bits are zero */ | |||||
return result; | |||||
} | |||||
#endif | |||||
/** | |||||
\brief Count leading zeros | |||||
\details 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 ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ | |||||
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) | |||||
/** | |||||
\brief LDR Exclusive (8 bit) | |||||
\details Executes a exclusive LDR instruction for 8 bit value. | |||||
\param [in] ptr Pointer to data | |||||
\return value of type uint8_t at (*ptr) | |||||
*/ | |||||
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | |||||
#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) | |||||
#else | |||||
#define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") | |||||
#endif | |||||
/** | |||||
\brief LDR Exclusive (16 bit) | |||||
\details Executes a exclusive LDR instruction for 16 bit values. | |||||
\param [in] ptr Pointer to data | |||||
\return value of type uint16_t at (*ptr) | |||||
*/ | |||||
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | |||||
#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) | |||||
#else | |||||
#define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") | |||||
#endif | |||||
/** | |||||
\brief LDR Exclusive (32 bit) | |||||
\details Executes a exclusive LDR instruction for 32 bit values. | |||||
\param [in] ptr Pointer to data | |||||
\return value of type uint32_t at (*ptr) | |||||
*/ | |||||
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | |||||
#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) | |||||
#else | |||||
#define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") | |||||
#endif | |||||
/** | |||||
\brief STR Exclusive (8 bit) | |||||
\details 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 | |||||
*/ | |||||
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | |||||
#define __STREXB(value, ptr) __strex(value, ptr) | |||||
#else | |||||
#define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") | |||||
#endif | |||||
/** | |||||
\brief STR Exclusive (16 bit) | |||||
\details 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 | |||||
*/ | |||||
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | |||||
#define __STREXH(value, ptr) __strex(value, ptr) | |||||
#else | |||||
#define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") | |||||
#endif | |||||
/** | |||||
\brief STR Exclusive (32 bit) | |||||
\details 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 | |||||
*/ | |||||
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) | |||||
#define __STREXW(value, ptr) __strex(value, ptr) | |||||
#else | |||||
#define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") | |||||
#endif | |||||
/** | |||||
\brief Remove the exclusive lock | |||||
\details Removes the exclusive lock which is created by LDREX. | |||||
*/ | |||||
#define __CLREX __clrex | |||||
/** | |||||
\brief Signed Saturate | |||||
\details 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 | |||||
\details 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) | |||||
\details 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) | |||||
\details 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) | |||||
\details 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) | |||||
\details 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) | |||||
\details 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) | |||||
\details 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) | |||||
\details 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) | |||||
#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ | |||||
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ | |||||
/** | |||||
\brief Signed Saturate | |||||
\details Saturates a signed value. | |||||
\param [in] value Value to be saturated | |||||
\param [in] sat Bit position to saturate to (1..32) | |||||
\return Saturated value | |||||
*/ | |||||
__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) | |||||
{ | |||||
if ((sat >= 1U) && (sat <= 32U)) | |||||
{ | |||||
const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); | |||||
const int32_t min = -1 - max ; | |||||
if (val > max) | |||||
{ | |||||
return max; | |||||
} | |||||
else if (val < min) | |||||
{ | |||||
return min; | |||||
} | |||||
} | |||||
return val; | |||||
} | |||||
/** | |||||
\brief Unsigned Saturate | |||||
\details Saturates an unsigned value. | |||||
\param [in] value Value to be saturated | |||||
\param [in] sat Bit position to saturate to (0..31) | |||||
\return Saturated value | |||||
*/ | |||||
__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) | |||||
{ | |||||
if (sat <= 31U) | |||||
{ | |||||
const uint32_t max = ((1U << sat) - 1U); | |||||
if (val > (int32_t)max) | |||||
{ | |||||
return max; | |||||
} | |||||
else if (val < 0) | |||||
{ | |||||
return 0U; | |||||
} | |||||
} | |||||
return (uint32_t)val; | |||||
} | |||||
#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ | |||||
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ | |||||
/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ | |||||
/* ################### Compiler specific Intrinsics ########################### */ | |||||
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics | |||||
Access to dedicated SIMD instructions | |||||
@{ | |||||
*/ | |||||
#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) | |||||
#define __SADD8 __sadd8 | |||||
#define __QADD8 __qadd8 | |||||
#define __SHADD8 __shadd8 | |||||
#define __UADD8 __uadd8 | |||||
#define __UQADD8 __uqadd8 | |||||
#define __UHADD8 __uhadd8 | |||||
#define __SSUB8 __ssub8 | |||||
#define __QSUB8 __qsub8 | |||||
#define __SHSUB8 __shsub8 | |||||
#define __USUB8 __usub8 | |||||
#define __UQSUB8 __uqsub8 | |||||
#define __UHSUB8 __uhsub8 | |||||
#define __SADD16 __sadd16 | |||||
#define __QADD16 __qadd16 | |||||
#define __SHADD16 __shadd16 | |||||
#define __UADD16 __uadd16 | |||||
#define __UQADD16 __uqadd16 | |||||
#define __UHADD16 __uhadd16 | |||||
#define __SSUB16 __ssub16 | |||||
#define __QSUB16 __qsub16 | |||||
#define __SHSUB16 __shsub16 | |||||
#define __USUB16 __usub16 | |||||
#define __UQSUB16 __uqsub16 | |||||
#define __UHSUB16 __uhsub16 | |||||
#define __SASX __sasx | |||||
#define __QASX __qasx | |||||
#define __SHASX __shasx | |||||
#define __UASX __uasx | |||||
#define __UQASX __uqasx | |||||
#define __UHASX __uhasx | |||||
#define __SSAX __ssax | |||||
#define __QSAX __qsax | |||||
#define __SHSAX __shsax | |||||
#define __USAX __usax | |||||
#define __UQSAX __uqsax | |||||
#define __UHSAX __uhsax | |||||
#define __USAD8 __usad8 | |||||
#define __USADA8 __usada8 | |||||
#define __SSAT16 __ssat16 | |||||
#define __USAT16 __usat16 | |||||
#define __UXTB16 __uxtb16 | |||||
#define __UXTAB16 __uxtab16 | |||||
#define __SXTB16 __sxtb16 | |||||
#define __SXTAB16 __sxtab16 | |||||
#define __SMUAD __smuad | |||||
#define __SMUADX __smuadx | |||||
#define __SMLAD __smlad | |||||
#define __SMLADX __smladx | |||||
#define __SMLALD __smlald | |||||
#define __SMLALDX __smlaldx | |||||
#define __SMUSD __smusd | |||||
#define __SMUSDX __smusdx | |||||
#define __SMLSD __smlsd | |||||
#define __SMLSDX __smlsdx | |||||
#define __SMLSLD __smlsld | |||||
#define __SMLSLDX __smlsldx | |||||
#define __SEL __sel | |||||
#define __QADD __qadd | |||||
#define __QSUB __qsub | |||||
#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ | |||||
((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) | |||||
#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ | |||||
((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) | |||||
#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ | |||||
((int64_t)(ARG3) << 32U) ) >> 32U)) | |||||
#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ | |||||
/*@} end of group CMSIS_SIMD_intrinsics */ | |||||
#endif /* __CMSIS_ARMCC_H */ |
/**************************************************************************//** | |||||
* @file cmsis_compiler.h | |||||
* @brief CMSIS compiler generic header file | |||||
* @version V5.0.4 | |||||
* @date 10. January 2018 | |||||
******************************************************************************/ | |||||
/* | |||||
* Copyright (c) 2009-2018 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 | |||||
* | |||||
* 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. | |||||
*/ | |||||
#ifndef __CMSIS_COMPILER_H | |||||
#define __CMSIS_COMPILER_H | |||||
#include <stdint.h> | |||||
/* | |||||
* Arm Compiler 4/5 | |||||
*/ | |||||
#if defined ( __CC_ARM ) | |||||
#include "cmsis_armcc.h" | |||||
/* | |||||
* Arm Compiler 6 (armclang) | |||||
*/ | |||||
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) | |||||
#include "cmsis_armclang.h" | |||||
/* | |||||
* GNU Compiler | |||||
*/ | |||||
#elif defined ( __GNUC__ ) | |||||
#include "cmsis_gcc.h" | |||||
/* | |||||
* IAR Compiler | |||||
*/ | |||||
#elif defined ( __ICCARM__ ) | |||||
#include <cmsis_iccarm.h> | |||||
/* | |||||
* TI Arm Compiler | |||||
*/ | |||||
#elif defined ( __TI_ARM__ ) | |||||
#include <cmsis_ccs.h> | |||||
#ifndef __ASM | |||||
#define __ASM __asm | |||||
#endif | |||||
#ifndef __INLINE | |||||
#define __INLINE inline | |||||
#endif | |||||
#ifndef __STATIC_INLINE | |||||
#define __STATIC_INLINE static inline | |||||
#endif | |||||
#ifndef __STATIC_FORCEINLINE | |||||
#define __STATIC_FORCEINLINE __STATIC_INLINE | |||||
#endif | |||||
#ifndef __NO_RETURN | |||||
#define __NO_RETURN __attribute__((noreturn)) | |||||
#endif | |||||
#ifndef __USED | |||||
#define __USED __attribute__((used)) | |||||
#endif | |||||
#ifndef __WEAK | |||||
#define __WEAK __attribute__((weak)) | |||||
#endif | |||||
#ifndef __PACKED | |||||
#define __PACKED __attribute__((packed)) | |||||
#endif | |||||
#ifndef __PACKED_STRUCT | |||||
#define __PACKED_STRUCT struct __attribute__((packed)) | |||||
#endif | |||||
#ifndef __PACKED_UNION | |||||
#define __PACKED_UNION union __attribute__((packed)) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32 /* deprecated */ | |||||
struct __attribute__((packed)) T_UINT32 { uint32_t v; }; | |||||
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT16_WRITE | |||||
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; | |||||
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT16_READ | |||||
__PACKED_STRUCT T_UINT16_READ { uint16_t v; }; | |||||
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32_WRITE | |||||
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; | |||||
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32_READ | |||||
__PACKED_STRUCT T_UINT32_READ { uint32_t v; }; | |||||
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) | |||||
#endif | |||||
#ifndef __ALIGNED | |||||
#define __ALIGNED(x) __attribute__((aligned(x))) | |||||
#endif | |||||
#ifndef __RESTRICT | |||||
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. | |||||
#define __RESTRICT | |||||
#endif | |||||
/* | |||||
* TASKING Compiler | |||||
*/ | |||||
#elif defined ( __TASKING__ ) | |||||
/* | |||||
* 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. | |||||
*/ | |||||
#ifndef __ASM | |||||
#define __ASM __asm | |||||
#endif | |||||
#ifndef __INLINE | |||||
#define __INLINE inline | |||||
#endif | |||||
#ifndef __STATIC_INLINE | |||||
#define __STATIC_INLINE static inline | |||||
#endif | |||||
#ifndef __STATIC_FORCEINLINE | |||||
#define __STATIC_FORCEINLINE __STATIC_INLINE | |||||
#endif | |||||
#ifndef __NO_RETURN | |||||
#define __NO_RETURN __attribute__((noreturn)) | |||||
#endif | |||||
#ifndef __USED | |||||
#define __USED __attribute__((used)) | |||||
#endif | |||||
#ifndef __WEAK | |||||
#define __WEAK __attribute__((weak)) | |||||
#endif | |||||
#ifndef __PACKED | |||||
#define __PACKED __packed__ | |||||
#endif | |||||
#ifndef __PACKED_STRUCT | |||||
#define __PACKED_STRUCT struct __packed__ | |||||
#endif | |||||
#ifndef __PACKED_UNION | |||||
#define __PACKED_UNION union __packed__ | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32 /* deprecated */ | |||||
struct __packed__ T_UINT32 { uint32_t v; }; | |||||
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT16_WRITE | |||||
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; | |||||
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT16_READ | |||||
__PACKED_STRUCT T_UINT16_READ { uint16_t v; }; | |||||
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32_WRITE | |||||
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; | |||||
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32_READ | |||||
__PACKED_STRUCT T_UINT32_READ { uint32_t v; }; | |||||
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) | |||||
#endif | |||||
#ifndef __ALIGNED | |||||
#define __ALIGNED(x) __align(x) | |||||
#endif | |||||
#ifndef __RESTRICT | |||||
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. | |||||
#define __RESTRICT | |||||
#endif | |||||
/* | |||||
* COSMIC Compiler | |||||
*/ | |||||
#elif defined ( __CSMC__ ) | |||||
#include <cmsis_csm.h> | |||||
#ifndef __ASM | |||||
#define __ASM _asm | |||||
#endif | |||||
#ifndef __INLINE | |||||
#define __INLINE inline | |||||
#endif | |||||
#ifndef __STATIC_INLINE | |||||
#define __STATIC_INLINE static inline | |||||
#endif | |||||
#ifndef __STATIC_FORCEINLINE | |||||
#define __STATIC_FORCEINLINE __STATIC_INLINE | |||||
#endif | |||||
#ifndef __NO_RETURN | |||||
// NO RETURN is automatically detected hence no warning here | |||||
#define __NO_RETURN | |||||
#endif | |||||
#ifndef __USED | |||||
#warning No compiler specific solution for __USED. __USED is ignored. | |||||
#define __USED | |||||
#endif | |||||
#ifndef __WEAK | |||||
#define __WEAK __weak | |||||
#endif | |||||
#ifndef __PACKED | |||||
#define __PACKED @packed | |||||
#endif | |||||
#ifndef __PACKED_STRUCT | |||||
#define __PACKED_STRUCT @packed struct | |||||
#endif | |||||
#ifndef __PACKED_UNION | |||||
#define __PACKED_UNION @packed union | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32 /* deprecated */ | |||||
@packed struct T_UINT32 { uint32_t v; }; | |||||
#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT16_WRITE | |||||
__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; | |||||
#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT16_READ | |||||
__PACKED_STRUCT T_UINT16_READ { uint16_t v; }; | |||||
#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32_WRITE | |||||
__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; | |||||
#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32_READ | |||||
__PACKED_STRUCT T_UINT32_READ { uint32_t v; }; | |||||
#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) | |||||
#endif | |||||
#ifndef __ALIGNED | |||||
#warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. | |||||
#define __ALIGNED(x) | |||||
#endif | |||||
#ifndef __RESTRICT | |||||
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. | |||||
#define __RESTRICT | |||||
#endif | |||||
#else | |||||
#error Unknown compiler. | |||||
#endif | |||||
#endif /* __CMSIS_COMPILER_H */ | |||||
/**************************************************************************//** | |||||
* @file cmsis_iccarm.h | |||||
* @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file | |||||
* @version V5.0.7 | |||||
* @date 19. June 2018 | |||||
******************************************************************************/ | |||||
//------------------------------------------------------------------------------ | |||||
// | |||||
// Copyright (c) 2017-2018 IAR Systems | |||||
// | |||||
// 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. | |||||
// | |||||
//------------------------------------------------------------------------------ | |||||
#ifndef __CMSIS_ICCARM_H__ | |||||
#define __CMSIS_ICCARM_H__ | |||||
#ifndef __ICCARM__ | |||||
#error This file should only be compiled by ICCARM | |||||
#endif | |||||
#pragma system_include | |||||
#define __IAR_FT _Pragma("inline=forced") __intrinsic | |||||
#if (__VER__ >= 8000000) | |||||
#define __ICCARM_V8 1 | |||||
#else | |||||
#define __ICCARM_V8 0 | |||||
#endif | |||||
#ifndef __ALIGNED | |||||
#if __ICCARM_V8 | |||||
#define __ALIGNED(x) __attribute__((aligned(x))) | |||||
#elif (__VER__ >= 7080000) | |||||
/* Needs IAR language extensions */ | |||||
#define __ALIGNED(x) __attribute__((aligned(x))) | |||||
#else | |||||
#warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. | |||||
#define __ALIGNED(x) | |||||
#endif | |||||
#endif | |||||
/* Define compiler macros for CPU architecture, used in CMSIS 5. | |||||
*/ | |||||
#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ | |||||
/* Macros already defined */ | |||||
#else | |||||
#if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) | |||||
#define __ARM_ARCH_8M_MAIN__ 1 | |||||
#elif defined(__ARM8M_BASELINE__) | |||||
#define __ARM_ARCH_8M_BASE__ 1 | |||||
#elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' | |||||
#if __ARM_ARCH == 6 | |||||
#define __ARM_ARCH_6M__ 1 | |||||
#elif __ARM_ARCH == 7 | |||||
#if __ARM_FEATURE_DSP | |||||
#define __ARM_ARCH_7EM__ 1 | |||||
#else | |||||
#define __ARM_ARCH_7M__ 1 | |||||
#endif | |||||
#endif /* __ARM_ARCH */ | |||||
#endif /* __ARM_ARCH_PROFILE == 'M' */ | |||||
#endif | |||||
/* Alternativ core deduction for older ICCARM's */ | |||||
#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ | |||||
!defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) | |||||
#if defined(__ARM6M__) && (__CORE__ == __ARM6M__) | |||||
#define __ARM_ARCH_6M__ 1 | |||||
#elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) | |||||
#define __ARM_ARCH_7M__ 1 | |||||
#elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) | |||||
#define __ARM_ARCH_7EM__ 1 | |||||
#elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) | |||||
#define __ARM_ARCH_8M_BASE__ 1 | |||||
#elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) | |||||
#define __ARM_ARCH_8M_MAIN__ 1 | |||||
#elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) | |||||
#define __ARM_ARCH_8M_MAIN__ 1 | |||||
#else | |||||
#error "Unknown target." | |||||
#endif | |||||
#endif | |||||
#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 | |||||
#define __IAR_M0_FAMILY 1 | |||||
#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 | |||||
#define __IAR_M0_FAMILY 1 | |||||
#else | |||||
#define __IAR_M0_FAMILY 0 | |||||
#endif | |||||
#ifndef __ASM | |||||
#define __ASM __asm | |||||
#endif | |||||
#ifndef __INLINE | |||||
#define __INLINE inline | |||||
#endif | |||||
#ifndef __NO_RETURN | |||||
#if __ICCARM_V8 | |||||
#define __NO_RETURN __attribute__((__noreturn__)) | |||||
#else | |||||
#define __NO_RETURN _Pragma("object_attribute=__noreturn") | |||||
#endif | |||||
#endif | |||||
#ifndef __PACKED | |||||
#if __ICCARM_V8 | |||||
#define __PACKED __attribute__((packed, aligned(1))) | |||||
#else | |||||
/* Needs IAR language extensions */ | |||||
#define __PACKED __packed | |||||
#endif | |||||
#endif | |||||
#ifndef __PACKED_STRUCT | |||||
#if __ICCARM_V8 | |||||
#define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) | |||||
#else | |||||
/* Needs IAR language extensions */ | |||||
#define __PACKED_STRUCT __packed struct | |||||
#endif | |||||
#endif | |||||
#ifndef __PACKED_UNION | |||||
#if __ICCARM_V8 | |||||
#define __PACKED_UNION union __attribute__((packed, aligned(1))) | |||||
#else | |||||
/* Needs IAR language extensions */ | |||||
#define __PACKED_UNION __packed union | |||||
#endif | |||||
#endif | |||||
#ifndef __RESTRICT | |||||
#define __RESTRICT __restrict | |||||
#endif | |||||
#ifndef __STATIC_INLINE | |||||
#define __STATIC_INLINE static inline | |||||
#endif | |||||
#ifndef __FORCEINLINE | |||||
#define __FORCEINLINE _Pragma("inline=forced") | |||||
#endif | |||||
#ifndef __STATIC_FORCEINLINE | |||||
#define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT16_READ | |||||
#pragma language=save | |||||
#pragma language=extended | |||||
__IAR_FT uint16_t __iar_uint16_read(void const *ptr) | |||||
{ | |||||
return *(__packed uint16_t*)(ptr); | |||||
} | |||||
#pragma language=restore | |||||
#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT16_WRITE | |||||
#pragma language=save | |||||
#pragma language=extended | |||||
__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) | |||||
{ | |||||
*(__packed uint16_t*)(ptr) = val;; | |||||
} | |||||
#pragma language=restore | |||||
#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32_READ | |||||
#pragma language=save | |||||
#pragma language=extended | |||||
__IAR_FT uint32_t __iar_uint32_read(void const *ptr) | |||||
{ | |||||
return *(__packed uint32_t*)(ptr); | |||||
} | |||||
#pragma language=restore | |||||
#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32_WRITE | |||||
#pragma language=save | |||||
#pragma language=extended | |||||
__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) | |||||
{ | |||||
*(__packed uint32_t*)(ptr) = val;; | |||||
} | |||||
#pragma language=restore | |||||
#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) | |||||
#endif | |||||
#ifndef __UNALIGNED_UINT32 /* deprecated */ | |||||
#pragma language=save | |||||
#pragma language=extended | |||||
__packed struct __iar_u32 { uint32_t v; }; | |||||
#pragma language=restore | |||||
#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) | |||||
#endif | |||||
#ifndef __USED | |||||
#if __ICCARM_V8 | |||||
#define __USED __attribute__((used)) | |||||
#else | |||||
#define __USED _Pragma("__root") | |||||
#endif | |||||
#endif | |||||
#ifndef __WEAK | |||||
#if __ICCARM_V8 | |||||
#define __WEAK __attribute__((weak)) | |||||
#else | |||||
#define __WEAK _Pragma("__weak") | |||||
#endif | |||||
#endif | |||||
#ifndef __ICCARM_INTRINSICS_VERSION__ | |||||
#define __ICCARM_INTRINSICS_VERSION__ 0 | |||||
#endif | |||||
#if __ICCARM_INTRINSICS_VERSION__ == 2 | |||||
#if defined(__CLZ) | |||||
#undef __CLZ | |||||
#endif | |||||
#if defined(__REVSH) | |||||
#undef __REVSH | |||||
#endif | |||||
#if defined(__RBIT) | |||||
#undef __RBIT | |||||
#endif | |||||
#if defined(__SSAT) | |||||
#undef __SSAT | |||||
#endif | |||||
#if defined(__USAT) | |||||
#undef __USAT | |||||
#endif | |||||
#include "iccarm_builtin.h" | |||||
#define __disable_fault_irq __iar_builtin_disable_fiq | |||||
#define __disable_irq __iar_builtin_disable_interrupt | |||||
#define __enable_fault_irq __iar_builtin_enable_fiq | |||||
#define __enable_irq __iar_builtin_enable_interrupt | |||||
#define __arm_rsr __iar_builtin_rsr | |||||
#define __arm_wsr __iar_builtin_wsr | |||||
#define __get_APSR() (__arm_rsr("APSR")) | |||||
#define __get_BASEPRI() (__arm_rsr("BASEPRI")) | |||||
#define __get_CONTROL() (__arm_rsr("CONTROL")) | |||||
#define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) | |||||
#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ | |||||
(defined (__FPU_USED ) && (__FPU_USED == 1U)) ) | |||||
#define __get_FPSCR() (__arm_rsr("FPSCR")) | |||||
#define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) | |||||
#else | |||||
#define __get_FPSCR() ( 0 ) | |||||
#define __set_FPSCR(VALUE) ((void)VALUE) | |||||
#endif | |||||
#define __get_IPSR() (__arm_rsr("IPSR")) | |||||
#define __get_MSP() (__arm_rsr("MSP")) | |||||
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | |||||
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) | |||||
// without main extensions, the non-secure MSPLIM is RAZ/WI | |||||
#define __get_MSPLIM() (0U) | |||||
#else | |||||
#define __get_MSPLIM() (__arm_rsr("MSPLIM")) | |||||
#endif | |||||
#define __get_PRIMASK() (__arm_rsr("PRIMASK")) | |||||
#define __get_PSP() (__arm_rsr("PSP")) | |||||
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | |||||
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) | |||||
// without main extensions, the non-secure PSPLIM is RAZ/WI | |||||
#define __get_PSPLIM() (0U) | |||||
#else | |||||
#define __get_PSPLIM() (__arm_rsr("PSPLIM")) | |||||
#endif | |||||
#define __get_xPSR() (__arm_rsr("xPSR")) | |||||
#define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) | |||||
#define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) | |||||
#define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) | |||||
#define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) | |||||
#define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) | |||||
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | |||||
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) | |||||
// without main extensions, the non-secure MSPLIM is RAZ/WI | |||||
#define __set_MSPLIM(VALUE) ((void)(VALUE)) | |||||
#else | |||||
#define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) | |||||
#endif | |||||
#define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) | |||||
#define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) | |||||
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | |||||
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) | |||||
// without main extensions, the non-secure PSPLIM is RAZ/WI | |||||
#define __set_PSPLIM(VALUE) ((void)(VALUE)) | |||||
#else | |||||
#define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) | |||||
#endif | |||||
#define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) | |||||
#define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) | |||||
#define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) | |||||
#define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) | |||||
#define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) | |||||
#define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) | |||||
#define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) | |||||
#define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) | |||||
#define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) | |||||
#define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) | |||||
#define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) | |||||
#define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) | |||||
#define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) | |||||
#define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) | |||||
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | |||||
(!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) | |||||
// without main extensions, the non-secure PSPLIM is RAZ/WI | |||||
#define __TZ_get_PSPLIM_NS() (0U) | |||||
#define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) | |||||
#else | |||||
#define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) | |||||
#define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) | |||||
#endif | |||||
#define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) | |||||
#define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) | |||||
#define __NOP __iar_builtin_no_operation | |||||
#define __CLZ __iar_builtin_CLZ | |||||
#define __CLREX __iar_builtin_CLREX | |||||
#define __DMB __iar_builtin_DMB | |||||
#define __DSB __iar_builtin_DSB | |||||
#define __ISB __iar_builtin_ISB | |||||
#define __LDREXB __iar_builtin_LDREXB | |||||
#define __LDREXH __iar_builtin_LDREXH | |||||
#define __LDREXW __iar_builtin_LDREX | |||||
#define __RBIT __iar_builtin_RBIT | |||||
#define __REV __iar_builtin_REV | |||||
#define __REV16 __iar_builtin_REV16 | |||||
__IAR_FT int16_t __REVSH(int16_t val) | |||||
{ | |||||
return (int16_t) __iar_builtin_REVSH(val); | |||||
} | |||||
#define __ROR __iar_builtin_ROR | |||||
#define __RRX __iar_builtin_RRX | |||||
#define __SEV __iar_builtin_SEV | |||||
#if !__IAR_M0_FAMILY | |||||
#define __SSAT __iar_builtin_SSAT | |||||
#endif | |||||
#define __STREXB __iar_builtin_STREXB | |||||
#define __STREXH __iar_builtin_STREXH | |||||
#define __STREXW __iar_builtin_STREX | |||||
#if !__IAR_M0_FAMILY | |||||
#define __USAT __iar_builtin_USAT | |||||
#endif | |||||
#define __WFE __iar_builtin_WFE | |||||
#define __WFI __iar_builtin_WFI | |||||
#if __ARM_MEDIA__ | |||||
#define __SADD8 __iar_builtin_SADD8 | |||||
#define __QADD8 __iar_builtin_QADD8 | |||||
#define __SHADD8 __iar_builtin_SHADD8 | |||||
#define __UADD8 __iar_builtin_UADD8 | |||||
#define __UQADD8 __iar_builtin_UQADD8 | |||||
#define __UHADD8 __iar_builtin_UHADD8 | |||||
#define __SSUB8 __iar_builtin_SSUB8 | |||||
#define __QSUB8 __iar_builtin_QSUB8 | |||||
#define __SHSUB8 __iar_builtin_SHSUB8 | |||||
#define __USUB8 __iar_builtin_USUB8 | |||||
#define __UQSUB8 __iar_builtin_UQSUB8 | |||||
#define __UHSUB8 __iar_builtin_UHSUB8 | |||||
#define __SADD16 __iar_builtin_SADD16 | |||||
#define __QADD16 __iar_builtin_QADD16 | |||||
#define __SHADD16 __iar_builtin_SHADD16 | |||||
#define __UADD16 __iar_builtin_UADD16 | |||||
#define __UQADD16 __iar_builtin_UQADD16 | |||||
#define __UHADD16 __iar_builtin_UHADD16 | |||||
#define __SSUB16 __iar_builtin_SSUB16 | |||||
#define __QSUB16 __iar_builtin_QSUB16 | |||||
#define __SHSUB16 __iar_builtin_SHSUB16 | |||||
#define __USUB16 __iar_builtin_USUB16 | |||||
#define __UQSUB16 __iar_builtin_UQSUB16 | |||||
#define __UHSUB16 __iar_builtin_UHSUB16 | |||||
#define __SASX __iar_builtin_SASX | |||||
#define __QASX __iar_builtin_QASX | |||||
#define __SHASX __iar_builtin_SHASX | |||||
#define __UASX __iar_builtin_UASX | |||||
#define __UQASX __iar_builtin_UQASX | |||||
#define __UHASX __iar_builtin_UHASX | |||||
#define __SSAX __iar_builtin_SSAX | |||||
#define __QSAX __iar_builtin_QSAX | |||||
#define __SHSAX __iar_builtin_SHSAX | |||||
#define __USAX __iar_builtin_USAX | |||||
#define __UQSAX __iar_builtin_UQSAX | |||||
#define __UHSAX __iar_builtin_UHSAX | |||||
#define __USAD8 __iar_builtin_USAD8 | |||||
#define __USADA8 __iar_builtin_USADA8 | |||||
#define __SSAT16 __iar_builtin_SSAT16 | |||||
#define __USAT16 __iar_builtin_USAT16 | |||||
#define __UXTB16 __iar_builtin_UXTB16 | |||||
#define __UXTAB16 __iar_builtin_UXTAB16 | |||||
#define __SXTB16 __iar_builtin_SXTB16 | |||||
#define __SXTAB16 __iar_builtin_SXTAB16 | |||||
#define __SMUAD __iar_builtin_SMUAD | |||||
#define __SMUADX __iar_builtin_SMUADX | |||||
#define __SMMLA __iar_builtin_SMMLA | |||||
#define __SMLAD __iar_builtin_SMLAD | |||||
#define __SMLADX __iar_builtin_SMLADX | |||||
#define __SMLALD __iar_builtin_SMLALD | |||||
#define __SMLALDX __iar_builtin_SMLALDX | |||||
#define __SMUSD __iar_builtin_SMUSD | |||||
#define __SMUSDX __iar_builtin_SMUSDX | |||||
#define __SMLSD __iar_builtin_SMLSD | |||||
#define __SMLSDX __iar_builtin_SMLSDX | |||||
#define __SMLSLD __iar_builtin_SMLSLD | |||||
#define __SMLSLDX __iar_builtin_SMLSLDX | |||||
#define __SEL __iar_builtin_SEL | |||||
#define __QADD __iar_builtin_QADD | |||||
#define __QSUB __iar_builtin_QSUB | |||||
#define __PKHBT __iar_builtin_PKHBT | |||||
#define __PKHTB __iar_builtin_PKHTB | |||||
#endif | |||||
#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ | |||||
#if __IAR_M0_FAMILY | |||||
/* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ | |||||
#define __CLZ __cmsis_iar_clz_not_active | |||||
#define __SSAT __cmsis_iar_ssat_not_active | |||||
#define __USAT __cmsis_iar_usat_not_active | |||||
#define __RBIT __cmsis_iar_rbit_not_active | |||||
#define __get_APSR __cmsis_iar_get_APSR_not_active | |||||
#endif | |||||
#if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ | |||||
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )) | |||||
#define __get_FPSCR __cmsis_iar_get_FPSR_not_active | |||||
#define __set_FPSCR __cmsis_iar_set_FPSR_not_active | |||||
#endif | |||||
#ifdef __INTRINSICS_INCLUDED | |||||
#error intrinsics.h is already included previously! | |||||
#endif | |||||
#include <intrinsics.h> | |||||
#if __IAR_M0_FAMILY | |||||
/* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ | |||||
#undef __CLZ | |||||
#undef __SSAT | |||||
#undef __USAT | |||||
#undef __RBIT | |||||
#undef __get_APSR | |||||
__STATIC_INLINE uint8_t __CLZ(uint32_t data) | |||||
{ | |||||
if (data == 0U) { return 32U; } | |||||
uint32_t count = 0U; | |||||
uint32_t mask = 0x80000000U; | |||||
while ((data & mask) == 0U) | |||||
{ | |||||
count += 1U; | |||||
mask = mask >> 1U; | |||||
} | |||||
return count; | |||||
} | |||||
__STATIC_INLINE uint32_t __RBIT(uint32_t v) | |||||
{ | |||||
uint8_t sc = 31U; | |||||
uint32_t r = v; | |||||
for (v >>= 1U; v; v >>= 1U) | |||||
{ | |||||
r <<= 1U; | |||||
r |= v & 1U; | |||||
sc--; | |||||
} | |||||
return (r << sc); | |||||
} | |||||
__STATIC_INLINE uint32_t __get_APSR(void) | |||||
{ | |||||
uint32_t res; | |||||
__asm("MRS %0,APSR" : "=r" (res)); | |||||
return res; | |||||
} | |||||
#endif | |||||
#if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ | |||||
(defined (__FPU_USED ) && (__FPU_USED == 1U)) )) | |||||
#undef __get_FPSCR | |||||
#undef __set_FPSCR | |||||
#define __get_FPSCR() (0) | |||||
#define __set_FPSCR(VALUE) ((void)VALUE) | |||||
#endif | |||||
#pragma diag_suppress=Pe940 | |||||
#pragma diag_suppress=Pe177 | |||||
#define __enable_irq __enable_interrupt | |||||
#define __disable_irq __disable_interrupt | |||||
#define __NOP __no_operation | |||||
#define __get_xPSR __get_PSR | |||||
#if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) | |||||
__IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) | |||||
{ | |||||
return __LDREX((unsigned long *)ptr); | |||||
} | |||||
__IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) | |||||
{ | |||||
return __STREX(value, (unsigned long *)ptr); | |||||
} | |||||
#endif | |||||
/* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ | |||||
#if (__CORTEX_M >= 0x03) | |||||
__IAR_FT uint32_t __RRX(uint32_t value) | |||||
{ | |||||
uint32_t result; | |||||
__ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); | |||||
return(result); | |||||
} | |||||
__IAR_FT void __set_BASEPRI_MAX(uint32_t value) | |||||
{ | |||||
__asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); | |||||
} | |||||
#define __enable_fault_irq __enable_fiq | |||||
#define __disable_fault_irq __disable_fiq | |||||
#endif /* (__CORTEX_M >= 0x03) */ | |||||
__IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) | |||||
{ | |||||
return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); | |||||
} | |||||
#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ | |||||
(defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) | |||||
__IAR_FT uint32_t __get_MSPLIM(void) | |||||
{ | |||||
uint32_t res; | |||||
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | |||||
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) | |||||
// without main extensions, the non-secure MSPLIM is RAZ/WI | |||||
res = 0U; | |||||
#else | |||||
__asm volatile("MRS %0,MSPLIM" : "=r" (res)); | |||||
#endif | |||||
return res; | |||||
} | |||||
__IAR_FT void __set_MSPLIM(uint32_t value) | |||||
{ | |||||
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | |||||
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) | |||||
// without main extensions, the non-secure MSPLIM is RAZ/WI | |||||
(void)value; | |||||
#else | |||||
__asm volatile("MSR MSPLIM,%0" :: "r" (value)); | |||||
#endif | |||||
} | |||||
__IAR_FT uint32_t __get_PSPLIM(void) | |||||
{ | |||||
uint32_t res; | |||||
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | |||||
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) | |||||
// without main extensions, the non-secure PSPLIM is RAZ/WI | |||||
res = 0U; | |||||
#else | |||||
__asm volatile("MRS %0,PSPLIM" : "=r" (res)); | |||||
#endif | |||||
return res; | |||||
} | |||||
__IAR_FT void __set_PSPLIM(uint32_t value) | |||||
{ | |||||
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | |||||
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) | |||||
// without main extensions, the non-secure PSPLIM is RAZ/WI | |||||
(void)value; | |||||
#else | |||||
__asm volatile("MSR PSPLIM,%0" :: "r" (value)); | |||||
#endif | |||||
} | |||||
__IAR_FT uint32_t __TZ_get_CONTROL_NS(void) | |||||
{ | |||||
uint32_t res; | |||||
__asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); | |||||
return res; | |||||
} | |||||
__IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) | |||||
{ | |||||
__asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); | |||||
} | |||||
__IAR_FT uint32_t __TZ_get_PSP_NS(void) | |||||
{ | |||||
uint32_t res; | |||||
__asm volatile("MRS %0,PSP_NS" : "=r" (res)); | |||||
return res; | |||||
} | |||||
__IAR_FT void __TZ_set_PSP_NS(uint32_t value) | |||||
{ | |||||
__asm volatile("MSR PSP_NS,%0" :: "r" (value)); | |||||
} | |||||
__IAR_FT uint32_t __TZ_get_MSP_NS(void) | |||||
{ | |||||
uint32_t res; | |||||
__asm volatile("MRS %0,MSP_NS" : "=r" (res)); | |||||
return res; | |||||
} | |||||
__IAR_FT void __TZ_set_MSP_NS(uint32_t value) | |||||
{ | |||||
__asm volatile("MSR MSP_NS,%0" :: "r" (value)); | |||||
} | |||||
__IAR_FT uint32_t __TZ_get_SP_NS(void) | |||||
{ | |||||
uint32_t res; | |||||
__asm volatile("MRS %0,SP_NS" : "=r" (res)); | |||||
return res; | |||||
} | |||||
__IAR_FT void __TZ_set_SP_NS(uint32_t value) | |||||
{ | |||||
__asm volatile("MSR SP_NS,%0" :: "r" (value)); | |||||
} | |||||
__IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) | |||||
{ | |||||
uint32_t res; | |||||
__asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); | |||||
return res; | |||||
} | |||||
__IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) | |||||
{ | |||||
__asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); | |||||
} | |||||
__IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) | |||||
{ | |||||
uint32_t res; | |||||
__asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); | |||||
return res; | |||||
} | |||||
__IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) | |||||
{ | |||||
__asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); | |||||
} | |||||
__IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) | |||||
{ | |||||
uint32_t res; | |||||
__asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); | |||||
return res; | |||||
} | |||||
__IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) | |||||
{ | |||||
__asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); | |||||
} | |||||
__IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) | |||||
{ | |||||
uint32_t res; | |||||
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | |||||
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) | |||||
// without main extensions, the non-secure PSPLIM is RAZ/WI | |||||
res = 0U; | |||||
#else | |||||
__asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); | |||||
#endif | |||||
return res; | |||||
} | |||||
__IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) | |||||
{ | |||||
#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ | |||||
(!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) | |||||
// without main extensions, the non-secure PSPLIM is RAZ/WI | |||||
(void)value; | |||||
#else | |||||
__asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); | |||||
#endif | |||||
} | |||||
__IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) | |||||
{ | |||||
uint32_t res; | |||||
__asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); | |||||
return res; | |||||
} | |||||
__IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) | |||||
{ | |||||
__asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); | |||||
} | |||||
#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ | |||||
#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ | |||||
#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) | |||||
#if __IAR_M0_FAMILY | |||||
__STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) | |||||
{ | |||||
if ((sat >= 1U) && (sat <= 32U)) | |||||
{ | |||||
const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); | |||||
const int32_t min = -1 - max ; | |||||
if (val > max) | |||||
{ | |||||
return max; | |||||
} | |||||
else if (val < min) | |||||
{ | |||||
return min; | |||||
} | |||||
} | |||||
return val; | |||||
} | |||||
__STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) | |||||
{ | |||||
if (sat <= 31U) | |||||
{ | |||||
const uint32_t max = ((1U << sat) - 1U); | |||||
if (val > (int32_t)max) | |||||
{ | |||||
return max; | |||||
} | |||||
else if (val < 0) | |||||
{ | |||||
return 0U; | |||||
} | |||||
} | |||||
return (uint32_t)val; | |||||
} | |||||
#endif | |||||
#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ | |||||
__IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) | |||||
{ | |||||
uint32_t res; | |||||
__ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); | |||||
return ((uint8_t)res); | |||||
} | |||||
__IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) | |||||
{ | |||||
uint32_t res; | |||||
__ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); | |||||
return ((uint16_t)res); | |||||
} | |||||
__IAR_FT uint32_t __LDRT(volatile uint32_t *addr) | |||||
{ | |||||
uint32_t res; | |||||
__ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); | |||||
return res; | |||||
} | |||||
__IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) | |||||
{ | |||||
__ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); | |||||
} | |||||
__IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) | |||||
{ | |||||
__ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); | |||||
} | |||||
__IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) | |||||
{ | |||||
__ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); | |||||
} | |||||
#endif /* (__CORTEX_M >= 0x03) */ | |||||
#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ | |||||
(defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) | |||||
__IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) | |||||
{ | |||||
uint32_t res; | |||||
__ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); | |||||
return ((uint8_t)res); | |||||
} | |||||
__IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) | |||||
{ | |||||
uint32_t res; | |||||
__ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); | |||||
return ((uint16_t)res); | |||||
} | |||||
__IAR_FT uint32_t __LDA(volatile uint32_t *ptr) | |||||
{ | |||||
uint32_t res; | |||||
__ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); | |||||
return res; | |||||
} | |||||
__IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) | |||||
{ | |||||
__ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); | |||||
} | |||||
__IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) | |||||
{ | |||||
__ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); | |||||
} | |||||
__IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) | |||||
{ | |||||
__ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); | |||||
} | |||||
__IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) | |||||
{ | |||||
uint32_t res; | |||||
__ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); | |||||
return ((uint8_t)res); | |||||
} | |||||
__IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) | |||||
{ | |||||
uint32_t res; | |||||
__ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); | |||||
return ((uint16_t)res); | |||||
} | |||||
__IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) | |||||
{ | |||||
uint32_t res; | |||||
__ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); | |||||
return res; | |||||
} | |||||
__IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) | |||||
{ | |||||
uint32_t res; | |||||
__ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); | |||||
return res; | |||||
} | |||||
__IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) | |||||
{ | |||||
uint32_t res; | |||||
__ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); | |||||
return res; | |||||
} | |||||
__IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) | |||||
{ | |||||
uint32_t res; | |||||
__ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); | |||||
return res; | |||||
} | |||||
#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ | |||||
#undef __IAR_FT | |||||
#undef __IAR_M0_FAMILY | |||||
#undef __ICCARM_V8 | |||||
#pragma diag_default=Pe940 | |||||
#pragma diag_default=Pe177 | |||||
#endif /* __CMSIS_ICCARM_H__ */ |
/**************************************************************************//** | |||||
* @file cmsis_version.h | |||||
* @brief CMSIS Core(M) Version definitions | |||||
* @version V5.0.2 | |||||
* @date 19. April 2017 | |||||
******************************************************************************/ | |||||
/* | |||||
* Copyright (c) 2009-2017 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 | |||||
* | |||||
* 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 (__clang__) | |||||
#pragma clang system_header /* treat file as system include file */ | |||||
#endif | |||||
#ifndef __CMSIS_VERSION_H | |||||
#define __CMSIS_VERSION_H | |||||
/* CMSIS Version definitions */ | |||||
#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ | |||||
#define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */ | |||||
#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ | |||||
__CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ | |||||
#endif |
/**************************************************************************//** | |||||
* @file core_cm0.h | |||||
* @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File | |||||
* @version V5.0.5 | |||||
* @date 28. May 2018 | |||||
******************************************************************************/ | |||||
/* | |||||
* Copyright (c) 2009-2018 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 | |||||
* | |||||
* 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 (__clang__) | |||||
#pragma clang system_header /* treat file as system include file */ | |||||
#endif | |||||
#ifndef __CORE_CM0_H_GENERIC | |||||
#define __CORE_CM0_H_GENERIC | |||||
#include <stdint.h> | |||||
#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.<br> | |||||
Function definitions in header files are used to allow 'inlining'. | |||||
\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> | |||||
Unions are used for effective representation of core registers. | |||||
\li Advisory Rule 19.7, Function-like macro defined.<br> | |||||
Function-like macros are used to allow more efficient code. | |||||
*/ | |||||
/******************************************************************************* | |||||
* CMSIS definitions | |||||
******************************************************************************/ | |||||
/** | |||||
\ingroup Cortex_M0 | |||||
@{ | |||||
*/ | |||||
#include "cmsis_version.h" | |||||
/* CMSIS CM0 definitions */ | |||||
#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ | |||||
#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ | |||||
#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ | |||||
__CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ | |||||
#define __CORTEX_M (0U) /*!< Cortex-M Core */ | |||||
/** __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 "cmsis_compiler.h" /* CMSIS compiler specific defines */ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __CORE_CM0_H_GENERIC */ | |||||
#ifndef __CMSIS_GENERIC | |||||
#ifndef __CORE_CM0_H_DEPENDANT | |||||
#define __CORE_CM0_H_DEPENDANT | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* check device defines and use defaults */ | |||||
#if defined __CHECK_DEVICE_DEFINES | |||||
#ifndef __CM0_REV | |||||
#define __CM0_REV 0x0000U | |||||
#warning "__CM0_REV 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 | |||||
<strong>IO Type Qualifiers</strong> 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 | |||||
******************************************************************************/ | |||||
/** | |||||
\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 _reserved0:1; /*!< bit: 0 Reserved */ | |||||
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 */ | |||||
/*@} 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 */ | |||||
uint32_t RESERVED0; | |||||
__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 */ | |||||
/* 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 */ | |||||
/** | |||||
\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 Core 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 */ | |||||
/*@} */ | |||||
/******************************************************************************* | |||||
* 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. | |||||
@{ | |||||
*/ | |||||
#ifdef CMSIS_NVIC_VIRTUAL | |||||
#ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE | |||||
#define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" | |||||
#endif | |||||
#include CMSIS_NVIC_VIRTUAL_HEADER_FILE | |||||
#else | |||||
#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping | |||||
#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping | |||||
#define NVIC_EnableIRQ __NVIC_EnableIRQ | |||||
#define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ | |||||
#define NVIC_DisableIRQ __NVIC_DisableIRQ | |||||
#define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ | |||||
#define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ | |||||
#define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ | |||||
/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */ | |||||
#define NVIC_SetPriority __NVIC_SetPriority | |||||
#define NVIC_GetPriority __NVIC_GetPriority | |||||
#define NVIC_SystemReset __NVIC_SystemReset | |||||
#endif /* CMSIS_NVIC_VIRTUAL */ | |||||
#ifdef CMSIS_VECTAB_VIRTUAL | |||||
#ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE | |||||
#define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" | |||||
#endif | |||||
#include CMSIS_VECTAB_VIRTUAL_HEADER_FILE | |||||
#else | |||||
#define NVIC_SetVector __NVIC_SetVector | |||||
#define NVIC_GetVector __NVIC_GetVector | |||||
#endif /* (CMSIS_VECTAB_VIRTUAL) */ | |||||
#define NVIC_USER_IRQ_OFFSET 16 | |||||
/* The following EXC_RETURN values are saved the LR on exception entry */ | |||||
#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ | |||||
#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ | |||||
#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ | |||||
/* Interrupt Priorities are WORD accessible only under Armv6-M */ | |||||
/* 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) ) | |||||
#define __NVIC_SetPriorityGrouping(X) (void)(X) | |||||
#define __NVIC_GetPriorityGrouping() (0U) | |||||
/** | |||||
\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 negative. | |||||
*/ | |||||
__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) | |||||
{ | |||||
if ((int32_t)(IRQn) >= 0) | |||||
{ | |||||
NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | |||||
} | |||||
} | |||||
/** | |||||
\brief Get Interrupt Enable status | |||||
\details Returns a device specific interrupt enable status from the NVIC interrupt controller. | |||||
\param [in] IRQn Device specific interrupt number. | |||||
\return 0 Interrupt is not enabled. | |||||
\return 1 Interrupt is enabled. | |||||
\note IRQn must not be negative. | |||||
*/ | |||||
__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) | |||||
{ | |||||
if ((int32_t)(IRQn) >= 0) | |||||
{ | |||||
return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); | |||||
} | |||||
else | |||||
{ | |||||
return(0U); | |||||
} | |||||
} | |||||
/** | |||||
\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 negative. | |||||
*/ | |||||
__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) | |||||
{ | |||||
if ((int32_t)(IRQn) >= 0) | |||||
{ | |||||
NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | |||||
__DSB(); | |||||
__ISB(); | |||||
} | |||||
} | |||||
/** | |||||
\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 negative. | |||||
*/ | |||||
__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) | |||||
{ | |||||
if ((int32_t)(IRQn) >= 0) | |||||
{ | |||||
return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_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 negative. | |||||
*/ | |||||
__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) | |||||
{ | |||||
if ((int32_t)(IRQn) >= 0) | |||||
{ | |||||
NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_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 negative. | |||||
*/ | |||||
__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) | |||||
{ | |||||
if ((int32_t)(IRQn) >= 0) | |||||
{ | |||||
NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_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 Encode Priority | |||||
\details Encodes the priority for an interrupt with the given priority group, | |||||
preemptive priority value, and subpriority value. | |||||
In case of a conflict between priority grouping and available | |||||
priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. | |||||
\param [in] PriorityGroup Used priority group. | |||||
\param [in] PreemptPriority Preemptive priority value (starting from 0). | |||||
\param [in] SubPriority Subpriority value (starting from 0). | |||||
\return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). | |||||
*/ | |||||
__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) | |||||
{ | |||||
uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ | |||||
uint32_t PreemptPriorityBits; | |||||
uint32_t SubPriorityBits; | |||||
PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); | |||||
SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); | |||||
return ( | |||||
((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | | |||||
((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) | |||||
); | |||||
} | |||||
/** | |||||
\brief Decode Priority | |||||
\details Decodes an interrupt priority value with a given priority group to | |||||
preemptive priority value and subpriority value. | |||||
In case of a conflict between priority grouping and available | |||||
priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. | |||||
\param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). | |||||
\param [in] PriorityGroup Used priority group. | |||||
\param [out] pPreemptPriority Preemptive priority value (starting from 0). | |||||
\param [out] pSubPriority Subpriority value (starting from 0). | |||||
*/ | |||||
__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) | |||||
{ | |||||
uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ | |||||
uint32_t PreemptPriorityBits; | |||||
uint32_t SubPriorityBits; | |||||
PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); | |||||
SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); | |||||
*pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); | |||||
*pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); | |||||
} | |||||
/** | |||||
\brief Set Interrupt Vector | |||||
\details Sets an interrupt vector in SRAM based interrupt vector table. | |||||
The interrupt number can be positive to specify a device specific interrupt, | |||||
or negative to specify a processor exception. | |||||
Address 0 must be mapped to SRAM. | |||||
\param [in] IRQn Interrupt number | |||||
\param [in] vector Address of interrupt handler function | |||||
*/ | |||||
__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) | |||||
{ | |||||
uint32_t *vectors = (uint32_t *)0x0U; | |||||
vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; | |||||
} | |||||
/** | |||||
\brief Get Interrupt Vector | |||||
\details Reads an interrupt vector from interrupt vector table. | |||||
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 Address of interrupt handler function | |||||
*/ | |||||
__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) | |||||
{ | |||||
uint32_t *vectors = (uint32_t *)0x0U; | |||||
return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; | |||||
} | |||||
/** | |||||
\brief System Reset | |||||
\details Initiates a system reset request to reset the MCU. | |||||
*/ | |||||
__NO_RETURN __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 <b>__Vendor_SysTickConfig</b> is set to 1, then the | |||||
function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> | |||||
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_CM0_H_DEPENDANT */ | |||||
#endif /* __CMSIS_GENERIC */ |
/**************************************************************************//** | |||||
* @file core_cm1.h | |||||
* @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File | |||||
* @version V1.0.0 | |||||
* @date 23. July 2018 | |||||
******************************************************************************/ | |||||
/* | |||||
* Copyright (c) 2009-2018 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 | |||||
* | |||||
* 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 (__clang__) | |||||
#pragma clang system_header /* treat file as system include file */ | |||||
#endif | |||||
#ifndef __CORE_CM1_H_GENERIC | |||||
#define __CORE_CM1_H_GENERIC | |||||
#include <stdint.h> | |||||
#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.<br> | |||||
Function definitions in header files are used to allow 'inlining'. | |||||
\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br> | |||||
Unions are used for effective representation of core registers. | |||||
\li Advisory Rule 19.7, Function-like macro defined.<br> | |||||
Function-like macros are used to allow more efficient code. | |||||
*/ | |||||
/******************************************************************************* | |||||
* CMSIS definitions | |||||
******************************************************************************/ | |||||
/** | |||||
\ingroup Cortex_M1 | |||||
@{ | |||||
*/ | |||||
#include "cmsis_version.h" | |||||
/* CMSIS CM1 definitions */ | |||||
#define __CM1_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ | |||||
#define __CM1_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ | |||||
#define __CM1_CMSIS_VERSION ((__CM1_CMSIS_VERSION_MAIN << 16U) | \ | |||||
__CM1_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ | |||||
#define __CORTEX_M (1U) /*!< Cortex-M Core */ | |||||
/** __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 "cmsis_compiler.h" /* CMSIS compiler specific defines */ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __CORE_CM1_H_GENERIC */ | |||||
#ifndef __CMSIS_GENERIC | |||||
#ifndef __CORE_CM1_H_DEPENDANT | |||||
#define __CORE_CM1_H_DEPENDANT | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* check device defines and use defaults */ | |||||
#if defined __CHECK_DEVICE_DEFINES | |||||
#ifndef __CM1_REV | |||||
#define __CM1_REV 0x0100U | |||||
#warning "__CM1_REV 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 | |||||
<strong>IO Type Qualifiers</strong> 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_M1 */ | |||||
/******************************************************************************* | |||||
* Register Abstraction | |||||
Core Register contain: | |||||
- Core Register | |||||
- Core NVIC Register | |||||
- Core SCB Register | |||||
- Core SysTick 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 _reserved0:1; /*!< bit: 0 Reserved */ | |||||
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 */ | |||||
/*@} 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 */ | |||||
uint32_t RESERVED0; | |||||
__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 */ | |||||
/* 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_SCnSCB System Controls not in SCB (SCnSCB) | |||||
\brief Type definitions for the System Control and ID Register not in the SCB | |||||
@{ | |||||
*/ | |||||
/** | |||||
\brief Structure type to access the System Control and ID Register not in the SCB. | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
uint32_t RESERVED0[2U]; | |||||
__IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ | |||||
} SCnSCB_Type; | |||||
/* Auxiliary Control Register Definitions */ | |||||
#define SCnSCB_ACTLR_ITCMUAEN_Pos 4U /*!< ACTLR: Instruction TCM Upper Alias Enable Position */ | |||||
#define SCnSCB_ACTLR_ITCMUAEN_Msk (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos) /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */ | |||||
#define SCnSCB_ACTLR_ITCMLAEN_Pos 3U /*!< ACTLR: Instruction TCM Lower Alias Enable Position */ | |||||
#define SCnSCB_ACTLR_ITCMLAEN_Msk (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos) /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */ | |||||
/*@} end of group CMSIS_SCnotSCB */ | |||||
/** | |||||
\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 */ | |||||
/** | |||||
\ingroup CMSIS_core_register | |||||
\defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) | |||||
\brief Cortex-M1 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-M1 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 Core 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 SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ | |||||
#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 */ | |||||
/*@} */ | |||||
/******************************************************************************* | |||||
* 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. | |||||
@{ | |||||
*/ | |||||
#ifdef CMSIS_NVIC_VIRTUAL | |||||
#ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE | |||||
#define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" | |||||
#endif | |||||
#include CMSIS_NVIC_VIRTUAL_HEADER_FILE | |||||
#else | |||||
#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping | |||||
#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping | |||||
#define NVIC_EnableIRQ __NVIC_EnableIRQ | |||||
#define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ | |||||
#define NVIC_DisableIRQ __NVIC_DisableIRQ | |||||
#define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ | |||||
#define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ | |||||
#define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ | |||||
/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M1 */ | |||||
#define NVIC_SetPriority __NVIC_SetPriority | |||||
#define NVIC_GetPriority __NVIC_GetPriority | |||||
#define NVIC_SystemReset __NVIC_SystemReset | |||||
#endif /* CMSIS_NVIC_VIRTUAL */ | |||||
#ifdef CMSIS_VECTAB_VIRTUAL | |||||
#ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE | |||||
#define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" | |||||
#endif | |||||
#include CMSIS_VECTAB_VIRTUAL_HEADER_FILE | |||||
#else | |||||
#define NVIC_SetVector __NVIC_SetVector | |||||
#define NVIC_GetVector __NVIC_GetVector | |||||
#endif /* (CMSIS_VECTAB_VIRTUAL) */ | |||||
#define NVIC_USER_IRQ_OFFSET 16 | |||||
/* The following EXC_RETURN values are saved the LR on exception entry */ | |||||
#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ | |||||
#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ | |||||
#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ | |||||
/* Interrupt Priorities are WORD accessible only under Armv6-M */ | |||||
/* 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) ) | |||||
#define __NVIC_SetPriorityGrouping(X) (void)(X) | |||||
#define __NVIC_GetPriorityGrouping() (0U) | |||||
/** | |||||
\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 negative. | |||||
*/ | |||||
__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) | |||||
{ | |||||
if ((int32_t)(IRQn) >= 0) | |||||
{ | |||||
NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | |||||
} | |||||
} | |||||
/** | |||||
\brief Get Interrupt Enable status | |||||
\details Returns a device specific interrupt enable status from the NVIC interrupt controller. | |||||
\param [in] IRQn Device specific interrupt number. | |||||
\return 0 Interrupt is not enabled. | |||||
\return 1 Interrupt is enabled. | |||||
\note IRQn must not be negative. | |||||
*/ | |||||
__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) | |||||
{ | |||||
if ((int32_t)(IRQn) >= 0) | |||||
{ | |||||
return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); | |||||
} | |||||
else | |||||
{ | |||||
return(0U); | |||||
} | |||||
} | |||||
/** | |||||
\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 negative. | |||||
*/ | |||||
__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) | |||||
{ | |||||
if ((int32_t)(IRQn) >= 0) | |||||
{ | |||||
NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); | |||||
__DSB(); | |||||
__ISB(); | |||||
} | |||||
} | |||||
/** | |||||
\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 negative. | |||||
*/ | |||||
__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) | |||||
{ | |||||
if ((int32_t)(IRQn) >= 0) | |||||
{ | |||||
return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_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 negative. | |||||
*/ | |||||
__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) | |||||
{ | |||||
if ((int32_t)(IRQn) >= 0) | |||||
{ | |||||
NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_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 negative. | |||||
*/ | |||||
__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) | |||||
{ | |||||
if ((int32_t)(IRQn) >= 0) | |||||
{ | |||||
NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_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 Encode Priority | |||||
\details Encodes the priority for an interrupt with the given priority group, | |||||
preemptive priority value, and subpriority value. | |||||
In case of a conflict between priority grouping and available | |||||
priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. | |||||
\param [in] PriorityGroup Used priority group. | |||||
\param [in] PreemptPriority Preemptive priority value (starting from 0). | |||||
\param [in] SubPriority Subpriority value (starting from 0). | |||||
\return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). | |||||
*/ | |||||
__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) | |||||
{ | |||||
uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ | |||||
uint32_t PreemptPriorityBits; | |||||
uint32_t SubPriorityBits; | |||||
PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); | |||||
SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); | |||||
return ( | |||||
((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | | |||||
((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) | |||||
); | |||||
} | |||||
/** | |||||
\brief Decode Priority | |||||
\details Decodes an interrupt priority value with a given priority group to | |||||
preemptive priority value and subpriority value. | |||||
In case of a conflict between priority grouping and available | |||||
priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. | |||||
\param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). | |||||
\param [in] PriorityGroup Used priority group. | |||||
\param [out] pPreemptPriority Preemptive priority value (starting from 0). | |||||
\param [out] pSubPriority Subpriority value (starting from 0). | |||||
*/ | |||||
__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) | |||||
{ | |||||
uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ | |||||
uint32_t PreemptPriorityBits; | |||||
uint32_t SubPriorityBits; | |||||
PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); | |||||
SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); | |||||
*pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); | |||||
*pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); | |||||
} | |||||
/** | |||||
\brief Set Interrupt Vector | |||||
\details Sets an interrupt vector in SRAM based interrupt vector table. | |||||
The interrupt number can be positive to specify a device specific interrupt, | |||||
or negative to specify a processor exception. | |||||
Address 0 must be mapped to SRAM. | |||||
\param [in] IRQn Interrupt number | |||||
\param [in] vector Address of interrupt handler function | |||||
*/ | |||||
__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) | |||||
{ | |||||
uint32_t *vectors = (uint32_t *)0x0U; | |||||
vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; | |||||
} | |||||
/** | |||||
\brief Get Interrupt Vector | |||||
\details Reads an interrupt vector from interrupt vector table. | |||||
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 Address of interrupt handler function | |||||
*/ | |||||
__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) | |||||
{ | |||||
uint32_t *vectors = (uint32_t *)0x0U; | |||||
return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; | |||||
} | |||||
/** | |||||
\brief System Reset | |||||
\details Initiates a system reset request to reset the MCU. | |||||
*/ | |||||
__NO_RETURN __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 <b>__Vendor_SysTickConfig</b> is set to 1, then the | |||||
function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b> | |||||
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_CM1_H_DEPENDANT */ | |||||
#endif /* __CMSIS_GENERIC */ |
/****************************************************************************** | |||||
* @file mpu_armv7.h | |||||
* @brief CMSIS MPU API for Armv7-M MPU | |||||
* @version V5.0.4 | |||||
* @date 10. January 2018 | |||||
******************************************************************************/ | |||||
/* | |||||
* Copyright (c) 2017-2018 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 | |||||
* | |||||
* 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 (__clang__) | |||||
#pragma clang system_header /* treat file as system include file */ | |||||
#endif | |||||
#ifndef ARM_MPU_ARMV7_H | |||||
#define ARM_MPU_ARMV7_H | |||||
#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes | |||||
#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes | |||||
#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes | |||||
#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes | |||||
#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes | |||||
#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte | |||||
#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes | |||||
#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes | |||||
#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes | |||||
#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes | |||||
#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes | |||||
#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes | |||||
#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes | |||||
#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes | |||||
#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes | |||||
#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte | |||||
#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes | |||||
#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes | |||||
#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes | |||||
#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes | |||||
#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes | |||||
#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes | |||||
#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes | |||||
#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes | |||||
#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes | |||||
#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte | |||||
#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes | |||||
#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes | |||||
#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access | |||||
#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only | |||||
#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only | |||||
#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access | |||||
#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only | |||||
#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access | |||||
/** MPU Region Base Address Register Value | |||||
* | |||||
* \param Region The region to be configured, number 0 to 15. | |||||
* \param BaseAddress The base address for the region. | |||||
*/ | |||||
#define ARM_MPU_RBAR(Region, BaseAddress) \ | |||||
(((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ | |||||
((Region) & MPU_RBAR_REGION_Msk) | \ | |||||
(MPU_RBAR_VALID_Msk)) | |||||
/** | |||||
* MPU Memory Access Attributes | |||||
* | |||||
* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. | |||||
* \param IsShareable Region is shareable between multiple bus masters. | |||||
* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. | |||||
* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. | |||||
*/ | |||||
#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \ | |||||
((((TypeExtField ) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ | |||||
(((IsShareable ) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ | |||||
(((IsCacheable ) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ | |||||
(((IsBufferable ) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk)) | |||||
/** | |||||
* MPU Region Attribute and Size Register Value | |||||
* | |||||
* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. | |||||
* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. | |||||
* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_. | |||||
* \param SubRegionDisable Sub-region disable field. | |||||
* \param Size Region size of the region to be configured, for example 4K, 8K. | |||||
*/ | |||||
#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \ | |||||
((((DisableExec ) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ | |||||
(((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ | |||||
(((AccessAttributes) ) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) | |||||
/** | |||||
* MPU Region Attribute and Size Register Value | |||||
* | |||||
* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. | |||||
* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. | |||||
* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. | |||||
* \param IsShareable Region is shareable between multiple bus masters. | |||||
* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. | |||||
* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. | |||||
* \param SubRegionDisable Sub-region disable field. | |||||
* \param Size Region size of the region to be configured, for example 4K, 8K. | |||||
*/ | |||||
#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ | |||||
ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) | |||||
/** | |||||
* MPU Memory Access Attribute for strongly ordered memory. | |||||
* - TEX: 000b | |||||
* - Shareable | |||||
* - Non-cacheable | |||||
* - Non-bufferable | |||||
*/ | |||||
#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) | |||||
/** | |||||
* MPU Memory Access Attribute for device memory. | |||||
* - TEX: 000b (if non-shareable) or 010b (if shareable) | |||||
* - Shareable or non-shareable | |||||
* - Non-cacheable | |||||
* - Bufferable (if shareable) or non-bufferable (if non-shareable) | |||||
* | |||||
* \param IsShareable Configures the device memory as shareable or non-shareable. | |||||
*/ | |||||
#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) | |||||
/** | |||||
* MPU Memory Access Attribute for normal memory. | |||||
* - TEX: 1BBb (reflecting outer cacheability rules) | |||||
* - Shareable or non-shareable | |||||
* - Cacheable or non-cacheable (reflecting inner cacheability rules) | |||||
* - Bufferable or non-bufferable (reflecting inner cacheability rules) | |||||
* | |||||
* \param OuterCp Configures the outer cache policy. | |||||
* \param InnerCp Configures the inner cache policy. | |||||
* \param IsShareable Configures the memory as shareable or non-shareable. | |||||
*/ | |||||
#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) & 2U), ((InnerCp) & 1U)) | |||||
/** | |||||
* MPU Memory Access Attribute non-cacheable policy. | |||||
*/ | |||||
#define ARM_MPU_CACHEP_NOCACHE 0U | |||||
/** | |||||
* MPU Memory Access Attribute write-back, write and read allocate policy. | |||||
*/ | |||||
#define ARM_MPU_CACHEP_WB_WRA 1U | |||||
/** | |||||
* MPU Memory Access Attribute write-through, no write allocate policy. | |||||
*/ | |||||
#define ARM_MPU_CACHEP_WT_NWA 2U | |||||
/** | |||||
* MPU Memory Access Attribute write-back, no write allocate policy. | |||||
*/ | |||||
#define ARM_MPU_CACHEP_WB_NWA 3U | |||||
/** | |||||
* Struct for a single MPU Region | |||||
*/ | |||||
typedef struct { | |||||
uint32_t RBAR; //!< The region base address register value (RBAR) | |||||
uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR | |||||
} ARM_MPU_Region_t; | |||||
/** Enable the MPU. | |||||
* \param MPU_Control Default access permissions for unconfigured regions. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) | |||||
{ | |||||
__DSB(); | |||||
__ISB(); | |||||
MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; | |||||
#ifdef SCB_SHCSR_MEMFAULTENA_Msk | |||||
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; | |||||
#endif | |||||
} | |||||
/** Disable the MPU. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_Disable(void) | |||||
{ | |||||
__DSB(); | |||||
__ISB(); | |||||
#ifdef SCB_SHCSR_MEMFAULTENA_Msk | |||||
SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; | |||||
#endif | |||||
MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; | |||||
} | |||||
/** Clear and disable the given MPU region. | |||||
* \param rnr Region number to be cleared. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) | |||||
{ | |||||
MPU->RNR = rnr; | |||||
MPU->RASR = 0U; | |||||
} | |||||
/** Configure an MPU region. | |||||
* \param rbar Value for RBAR register. | |||||
* \param rsar Value for RSAR register. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) | |||||
{ | |||||
MPU->RBAR = rbar; | |||||
MPU->RASR = rasr; | |||||
} | |||||
/** Configure the given MPU region. | |||||
* \param rnr Region number to be configured. | |||||
* \param rbar Value for RBAR register. | |||||
* \param rsar Value for RSAR register. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) | |||||
{ | |||||
MPU->RNR = rnr; | |||||
MPU->RBAR = rbar; | |||||
MPU->RASR = rasr; | |||||
} | |||||
/** Memcopy with strictly ordered memory access, e.g. for register targets. | |||||
* \param dst Destination data is copied to. | |||||
* \param src Source data is copied from. | |||||
* \param len Amount of data words to be copied. | |||||
*/ | |||||
__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) | |||||
{ | |||||
uint32_t i; | |||||
for (i = 0U; i < len; ++i) | |||||
{ | |||||
dst[i] = src[i]; | |||||
} | |||||
} | |||||
/** Load the given number of MPU regions from a table. | |||||
* \param table Pointer to the MPU configuration table. | |||||
* \param cnt Amount of regions to be configured. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) | |||||
{ | |||||
const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; | |||||
while (cnt > MPU_TYPE_RALIASES) { | |||||
orderedCpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); | |||||
table += MPU_TYPE_RALIASES; | |||||
cnt -= MPU_TYPE_RALIASES; | |||||
} | |||||
orderedCpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); | |||||
} | |||||
#endif |
/****************************************************************************** | |||||
* @file mpu_armv8.h | |||||
* @brief CMSIS MPU API for Armv8-M MPU | |||||
* @version V5.0.4 | |||||
* @date 10. January 2018 | |||||
******************************************************************************/ | |||||
/* | |||||
* Copyright (c) 2017-2018 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 | |||||
* | |||||
* 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 (__clang__) | |||||
#pragma clang system_header /* treat file as system include file */ | |||||
#endif | |||||
#ifndef ARM_MPU_ARMV8_H | |||||
#define ARM_MPU_ARMV8_H | |||||
/** \brief Attribute for device memory (outer only) */ | |||||
#define ARM_MPU_ATTR_DEVICE ( 0U ) | |||||
/** \brief Attribute for non-cacheable, normal memory */ | |||||
#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U ) | |||||
/** \brief Attribute for normal memory (outer and inner) | |||||
* \param NT Non-Transient: Set to 1 for non-transient data. | |||||
* \param WB Write-Back: Set to 1 to use write-back update policy. | |||||
* \param RA Read Allocation: Set to 1 to use cache allocation on read miss. | |||||
* \param WA Write Allocation: Set to 1 to use cache allocation on write miss. | |||||
*/ | |||||
#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ | |||||
(((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U)) | |||||
/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ | |||||
#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) | |||||
/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ | |||||
#define ARM_MPU_ATTR_DEVICE_nGnRE (1U) | |||||
/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ | |||||
#define ARM_MPU_ATTR_DEVICE_nGRE (2U) | |||||
/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ | |||||
#define ARM_MPU_ATTR_DEVICE_GRE (3U) | |||||
/** \brief Memory Attribute | |||||
* \param O Outer memory attributes | |||||
* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes | |||||
*/ | |||||
#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U))) | |||||
/** \brief Normal memory non-shareable */ | |||||
#define ARM_MPU_SH_NON (0U) | |||||
/** \brief Normal memory outer shareable */ | |||||
#define ARM_MPU_SH_OUTER (2U) | |||||
/** \brief Normal memory inner shareable */ | |||||
#define ARM_MPU_SH_INNER (3U) | |||||
/** \brief Memory access permissions | |||||
* \param RO Read-Only: Set to 1 for read-only memory. | |||||
* \param NP Non-Privileged: Set to 1 for non-privileged memory. | |||||
*/ | |||||
#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U)) | |||||
/** \brief Region Base Address Register value | |||||
* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. | |||||
* \param SH Defines the Shareability domain for this memory region. | |||||
* \param RO Read-Only: Set to 1 for a read-only memory region. | |||||
* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. | |||||
* \oaram XN eXecute Never: Set to 1 for a non-executable memory region. | |||||
*/ | |||||
#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ | |||||
((BASE & MPU_RBAR_BASE_Msk) | \ | |||||
((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ | |||||
((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ | |||||
((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) | |||||
/** \brief Region Limit Address Register value | |||||
* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. | |||||
* \param IDX The attribute index to be associated with this memory region. | |||||
*/ | |||||
#define ARM_MPU_RLAR(LIMIT, IDX) \ | |||||
((LIMIT & MPU_RLAR_LIMIT_Msk) | \ | |||||
((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ | |||||
(MPU_RLAR_EN_Msk)) | |||||
/** | |||||
* Struct for a single MPU Region | |||||
*/ | |||||
typedef struct { | |||||
uint32_t RBAR; /*!< Region Base Address Register value */ | |||||
uint32_t RLAR; /*!< Region Limit Address Register value */ | |||||
} ARM_MPU_Region_t; | |||||
/** Enable the MPU. | |||||
* \param MPU_Control Default access permissions for unconfigured regions. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) | |||||
{ | |||||
__DSB(); | |||||
__ISB(); | |||||
MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; | |||||
#ifdef SCB_SHCSR_MEMFAULTENA_Msk | |||||
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; | |||||
#endif | |||||
} | |||||
/** Disable the MPU. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_Disable(void) | |||||
{ | |||||
__DSB(); | |||||
__ISB(); | |||||
#ifdef SCB_SHCSR_MEMFAULTENA_Msk | |||||
SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; | |||||
#endif | |||||
MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; | |||||
} | |||||
#ifdef MPU_NS | |||||
/** Enable the Non-secure MPU. | |||||
* \param MPU_Control Default access permissions for unconfigured regions. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) | |||||
{ | |||||
__DSB(); | |||||
__ISB(); | |||||
MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; | |||||
#ifdef SCB_SHCSR_MEMFAULTENA_Msk | |||||
SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; | |||||
#endif | |||||
} | |||||
/** Disable the Non-secure MPU. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_Disable_NS(void) | |||||
{ | |||||
__DSB(); | |||||
__ISB(); | |||||
#ifdef SCB_SHCSR_MEMFAULTENA_Msk | |||||
SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; | |||||
#endif | |||||
MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; | |||||
} | |||||
#endif | |||||
/** Set the memory attribute encoding to the given MPU. | |||||
* \param mpu Pointer to the MPU to be configured. | |||||
* \param idx The attribute index to be set [0-7] | |||||
* \param attr The attribute value to be set. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) | |||||
{ | |||||
const uint8_t reg = idx / 4U; | |||||
const uint32_t pos = ((idx % 4U) * 8U); | |||||
const uint32_t mask = 0xFFU << pos; | |||||
if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { | |||||
return; // invalid index | |||||
} | |||||
mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); | |||||
} | |||||
/** Set the memory attribute encoding. | |||||
* \param idx The attribute index to be set [0-7] | |||||
* \param attr The attribute value to be set. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) | |||||
{ | |||||
ARM_MPU_SetMemAttrEx(MPU, idx, attr); | |||||
} | |||||
#ifdef MPU_NS | |||||
/** Set the memory attribute encoding to the Non-secure MPU. | |||||
* \param idx The attribute index to be set [0-7] | |||||
* \param attr The attribute value to be set. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) | |||||
{ | |||||
ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); | |||||
} | |||||
#endif | |||||
/** Clear and disable the given MPU region of the given MPU. | |||||
* \param mpu Pointer to MPU to be used. | |||||
* \param rnr Region number to be cleared. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) | |||||
{ | |||||
mpu->RNR = rnr; | |||||
mpu->RLAR = 0U; | |||||
} | |||||
/** Clear and disable the given MPU region. | |||||
* \param rnr Region number to be cleared. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) | |||||
{ | |||||
ARM_MPU_ClrRegionEx(MPU, rnr); | |||||
} | |||||
#ifdef MPU_NS | |||||
/** Clear and disable the given Non-secure MPU region. | |||||
* \param rnr Region number to be cleared. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) | |||||
{ | |||||
ARM_MPU_ClrRegionEx(MPU_NS, rnr); | |||||
} | |||||
#endif | |||||
/** Configure the given MPU region of the given MPU. | |||||
* \param mpu Pointer to MPU to be used. | |||||
* \param rnr Region number to be configured. | |||||
* \param rbar Value for RBAR register. | |||||
* \param rlar Value for RLAR register. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) | |||||
{ | |||||
mpu->RNR = rnr; | |||||
mpu->RBAR = rbar; | |||||
mpu->RLAR = rlar; | |||||
} | |||||
/** Configure the given MPU region. | |||||
* \param rnr Region number to be configured. | |||||
* \param rbar Value for RBAR register. | |||||
* \param rlar Value for RLAR register. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) | |||||
{ | |||||
ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); | |||||
} | |||||
#ifdef MPU_NS | |||||
/** Configure the given Non-secure MPU region. | |||||
* \param rnr Region number to be configured. | |||||
* \param rbar Value for RBAR register. | |||||
* \param rlar Value for RLAR register. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) | |||||
{ | |||||
ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar); | |||||
} | |||||
#endif | |||||
/** Memcopy with strictly ordered memory access, e.g. for register targets. | |||||
* \param dst Destination data is copied to. | |||||
* \param src Source data is copied from. | |||||
* \param len Amount of data words to be copied. | |||||
*/ | |||||
__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) | |||||
{ | |||||
uint32_t i; | |||||
for (i = 0U; i < len; ++i) | |||||
{ | |||||
dst[i] = src[i]; | |||||
} | |||||
} | |||||
/** Load the given number of MPU regions from a table to the given MPU. | |||||
* \param mpu Pointer to the MPU registers to be used. | |||||
* \param rnr First region number to be configured. | |||||
* \param table Pointer to the MPU configuration table. | |||||
* \param cnt Amount of regions to be configured. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) | |||||
{ | |||||
const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; | |||||
if (cnt == 1U) { | |||||
mpu->RNR = rnr; | |||||
orderedCpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); | |||||
} else { | |||||
uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U); | |||||
uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; | |||||
mpu->RNR = rnrBase; | |||||
while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { | |||||
uint32_t c = MPU_TYPE_RALIASES - rnrOffset; | |||||
orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); | |||||
table += c; | |||||
cnt -= c; | |||||
rnrOffset = 0U; | |||||
rnrBase += MPU_TYPE_RALIASES; | |||||
mpu->RNR = rnrBase; | |||||
} | |||||
orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); | |||||
} | |||||
} | |||||
/** Load the given number of MPU regions from a table. | |||||
* \param rnr First region number to be configured. | |||||
* \param table Pointer to the MPU configuration table. | |||||
* \param cnt Amount of regions to be configured. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) | |||||
{ | |||||
ARM_MPU_LoadEx(MPU, rnr, table, cnt); | |||||
} | |||||
#ifdef MPU_NS | |||||
/** Load the given number of MPU regions from a table to the Non-secure MPU. | |||||
* \param rnr First region number to be configured. | |||||
* \param table Pointer to the MPU configuration table. | |||||
* \param cnt Amount of regions to be configured. | |||||
*/ | |||||
__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) | |||||
{ | |||||
ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); | |||||
} | |||||
#endif | |||||
#endif | |||||
/****************************************************************************** | |||||
* @file tz_context.h | |||||
* @brief Context Management for Armv8-M TrustZone | |||||
* @version V1.0.1 | |||||
* @date 10. January 2018 | |||||
******************************************************************************/ | |||||
/* | |||||
* Copyright (c) 2017-2018 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 | |||||
* | |||||
* 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 (__clang__) | |||||
#pragma clang system_header /* treat file as system include file */ | |||||
#endif | |||||
#ifndef TZ_CONTEXT_H | |||||
#define TZ_CONTEXT_H | |||||
#include <stdint.h> | |||||
#ifndef TZ_MODULEID_T | |||||
#define TZ_MODULEID_T | |||||
/// \details Data type that identifies secure software modules called by a process. | |||||
typedef uint32_t TZ_ModuleId_t; | |||||
#endif | |||||
/// \details TZ Memory ID identifies an allocated memory slot. | |||||
typedef uint32_t TZ_MemoryId_t; | |||||
/// Initialize secure context memory system | |||||
/// \return execution status (1: success, 0: error) | |||||
uint32_t TZ_InitContextSystem_S (void); | |||||
/// Allocate context memory for calling secure software modules in TrustZone | |||||
/// \param[in] module identifies software modules called from non-secure mode | |||||
/// \return value != 0 id TrustZone memory slot identifier | |||||
/// \return value 0 no memory available or internal error | |||||
TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); | |||||
/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S | |||||
/// \param[in] id TrustZone memory slot identifier | |||||
/// \return execution status (1: success, 0: error) | |||||
uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); | |||||
/// Load secure context (called on RTOS thread context switch) | |||||
/// \param[in] id TrustZone memory slot identifier | |||||
/// \return execution status (1: success, 0: error) | |||||
uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); | |||||
/// Store secure context (called on RTOS thread context switch) | |||||
/// \param[in] id TrustZone memory slot identifier | |||||
/// \return execution status (1: success, 0: error) | |||||
uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); | |||||
#endif // TZ_CONTEXT_H |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal.h | |||||
* @author MCD Application Team | |||||
* @brief This file contains all the functions prototypes for the HAL | |||||
* module driver. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_HAL_H | |||||
#define __STM32F4xx_HAL_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_conf.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup HAL | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/** @defgroup HAL_Exported_Constants HAL Exported Constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup HAL_TICK_FREQ Tick Frequency | |||||
* @{ | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
HAL_TICK_FREQ_10HZ = 100U, | |||||
HAL_TICK_FREQ_100HZ = 10U, | |||||
HAL_TICK_FREQ_1KHZ = 1U, | |||||
HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ | |||||
} HAL_TickFreqTypeDef; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
/** @defgroup HAL_Exported_Macros HAL Exported Macros | |||||
* @{ | |||||
*/ | |||||
/** @brief Freeze/Unfreeze Peripherals in Debug mode | |||||
*/ | |||||
#define __HAL_DBGMCU_FREEZE_TIM2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM2_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM3() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM3_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM4() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM4_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM5() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM5_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM6() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM6_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM7() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM7_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM12() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM12_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM13() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM13_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM14() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM14_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_RTC() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_RTC_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_WWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_WWDG_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_IWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_IWDG_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) | |||||
#define __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) | |||||
#define __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) | |||||
#define __HAL_DBGMCU_FREEZE_CAN1() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN1_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_CAN2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN2_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM1() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM1_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM8() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM8_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM9() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM9_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM10() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM10_STOP)) | |||||
#define __HAL_DBGMCU_FREEZE_TIM11() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM11_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM2_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM3() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM3_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM4() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM4_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM5() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM5_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM6() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM6_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM7() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM7_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM12() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM12_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM13() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM13_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM14() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM14_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_RTC() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_RTC_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_WWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_WWDG_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_IWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_IWDG_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) | |||||
#define __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) | |||||
#define __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) | |||||
#define __HAL_DBGMCU_UNFREEZE_CAN1() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN1_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_CAN2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN2_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM1() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM1_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM8() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM8_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM9() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM9_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM10() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM10_STOP)) | |||||
#define __HAL_DBGMCU_UNFREEZE_TIM11() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM11_STOP)) | |||||
/** @brief Main Flash memory mapped at 0x00000000 | |||||
*/ | |||||
#define __HAL_SYSCFG_REMAPMEMORY_FLASH() (SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE)) | |||||
/** @brief System Flash memory mapped at 0x00000000 | |||||
*/ | |||||
#define __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ | |||||
SYSCFG->MEMRMP |= SYSCFG_MEMRMP_MEM_MODE_0;\ | |||||
}while(0); | |||||
/** @brief Embedded SRAM mapped at 0x00000000 | |||||
*/ | |||||
#define __HAL_SYSCFG_REMAPMEMORY_SRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ | |||||
SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_0 | SYSCFG_MEMRMP_MEM_MODE_1);\ | |||||
}while(0); | |||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) | |||||
/** @brief FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 | |||||
*/ | |||||
#define __HAL_SYSCFG_REMAPMEMORY_FSMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ | |||||
SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ | |||||
}while(0); | |||||
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ | |||||
defined(STM32F469xx) || defined(STM32F479xx) | |||||
/** @brief FMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 | |||||
*/ | |||||
#define __HAL_SYSCFG_REMAPMEMORY_FMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ | |||||
SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ | |||||
}while(0); | |||||
/** @brief FMC/SDRAM Bank 1 and 2 mapped at 0x00000000 | |||||
*/ | |||||
#define __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ | |||||
SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_2);\ | |||||
}while(0); | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ | |||||
#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F413xx) || defined(STM32F423xx) | |||||
/** @defgroup Cortex_Lockup_Enable Cortex Lockup Enable | |||||
* @{ | |||||
*/ | |||||
/** @brief SYSCFG Break Lockup lock | |||||
* Enables and locks the connection of Cortex-M4 LOCKUP (Hardfault) output to TIM1/8 input | |||||
* @note The selected configuration is locked and can be unlocked by system reset | |||||
*/ | |||||
#define __HAL_SYSCFG_BREAK_PVD_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_PVD_LOCK); \ | |||||
SYSCFG->CFGR2 |= SYSCFG_CFGR2_PVD_LOCK; \ | |||||
}while(0) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PVD_Lock_Enable PVD Lock | |||||
* @{ | |||||
*/ | |||||
/** @brief SYSCFG Break PVD lock | |||||
* Enables and locks the PVD connection with Timer1/8 Break Input, , as well as the PVDE and PLS[2:0] in the PWR_CR register | |||||
* @note The selected configuration is locked and can be unlocked by system reset | |||||
*/ | |||||
#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_LOCKUP_LOCK); \ | |||||
SYSCFG->CFGR2 |= SYSCFG_CFGR2_LOCKUP_LOCK; \ | |||||
}while(0) | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx || STM32F413xx || STM32F423xx */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup HAL_Private_Macros HAL Private Macros | |||||
* @{ | |||||
*/ | |||||
#define IS_TICKFREQ(FREQ) (((FREQ) == HAL_TICK_FREQ_10HZ) || \ | |||||
((FREQ) == HAL_TICK_FREQ_100HZ) || \ | |||||
((FREQ) == HAL_TICK_FREQ_1KHZ)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported variables --------------------------------------------------------*/ | |||||
/** @addtogroup HAL_Exported_Variables | |||||
* @{ | |||||
*/ | |||||
extern __IO uint32_t uwTick; | |||||
extern uint32_t uwTickPrio; | |||||
extern HAL_TickFreqTypeDef uwTickFreq; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @addtogroup HAL_Exported_Functions | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup HAL_Exported_Functions_Group1 | |||||
* @{ | |||||
*/ | |||||
/* Initialization and Configuration functions ******************************/ | |||||
HAL_StatusTypeDef HAL_Init(void); | |||||
HAL_StatusTypeDef HAL_DeInit(void); | |||||
void HAL_MspInit(void); | |||||
void HAL_MspDeInit(void); | |||||
HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup HAL_Exported_Functions_Group2 | |||||
* @{ | |||||
*/ | |||||
/* Peripheral Control functions ************************************************/ | |||||
void HAL_IncTick(void); | |||||
void HAL_Delay(uint32_t Delay); | |||||
uint32_t HAL_GetTick(void); | |||||
uint32_t HAL_GetTickPrio(void); | |||||
HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq); | |||||
HAL_TickFreqTypeDef HAL_GetTickFreq(void); | |||||
void HAL_SuspendTick(void); | |||||
void HAL_ResumeTick(void); | |||||
uint32_t HAL_GetHalVersion(void); | |||||
uint32_t HAL_GetREVID(void); | |||||
uint32_t HAL_GetDEVID(void); | |||||
void HAL_DBGMCU_EnableDBGSleepMode(void); | |||||
void HAL_DBGMCU_DisableDBGSleepMode(void); | |||||
void HAL_DBGMCU_EnableDBGStopMode(void); | |||||
void HAL_DBGMCU_DisableDBGStopMode(void); | |||||
void HAL_DBGMCU_EnableDBGStandbyMode(void); | |||||
void HAL_DBGMCU_DisableDBGStandbyMode(void); | |||||
void HAL_EnableCompensationCell(void); | |||||
void HAL_DisableCompensationCell(void); | |||||
uint32_t HAL_GetUIDw0(void); | |||||
uint32_t HAL_GetUIDw1(void); | |||||
uint32_t HAL_GetUIDw2(void); | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ | |||||
defined(STM32F469xx) || defined(STM32F479xx) | |||||
void HAL_EnableMemorySwappingBank(void); | |||||
void HAL_DisableMemorySwappingBank(void); | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private types -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/** @defgroup HAL_Private_Variables HAL Private Variables | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private constants ---------------------------------------------------------*/ | |||||
/** @defgroup HAL_Private_Constants HAL Private Constants | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32F4xx_HAL_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_cortex.h | |||||
* @author MCD Application Team | |||||
* @brief Header file of CORTEX HAL module. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_HAL_CORTEX_H | |||||
#define __STM32F4xx_HAL_CORTEX_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_def.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup CORTEX | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/** @defgroup CORTEX_Exported_Types Cortex Exported Types | |||||
* @{ | |||||
*/ | |||||
#if (__MPU_PRESENT == 1U) | |||||
/** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition | |||||
* @brief MPU Region initialization structure | |||||
* @{ | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
uint8_t Enable; /*!< Specifies the status of the region. | |||||
This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ | |||||
uint8_t Number; /*!< Specifies the number of the region to protect. | |||||
This parameter can be a value of @ref CORTEX_MPU_Region_Number */ | |||||
uint32_t BaseAddress; /*!< Specifies the base address of the region to protect. */ | |||||
uint8_t Size; /*!< Specifies the size of the region to protect. | |||||
This parameter can be a value of @ref CORTEX_MPU_Region_Size */ | |||||
uint8_t SubRegionDisable; /*!< Specifies the number of the subregion protection to disable. | |||||
This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */ | |||||
uint8_t TypeExtField; /*!< Specifies the TEX field level. | |||||
This parameter can be a value of @ref CORTEX_MPU_TEX_Levels */ | |||||
uint8_t AccessPermission; /*!< Specifies the region access permission type. | |||||
This parameter can be a value of @ref CORTEX_MPU_Region_Permission_Attributes */ | |||||
uint8_t DisableExec; /*!< Specifies the instruction access status. | |||||
This parameter can be a value of @ref CORTEX_MPU_Instruction_Access */ | |||||
uint8_t IsShareable; /*!< Specifies the shareability status of the protected region. | |||||
This parameter can be a value of @ref CORTEX_MPU_Access_Shareable */ | |||||
uint8_t IsCacheable; /*!< Specifies the cacheable status of the region protected. | |||||
This parameter can be a value of @ref CORTEX_MPU_Access_Cacheable */ | |||||
uint8_t IsBufferable; /*!< Specifies the bufferable status of the protected region. | |||||
This parameter can be a value of @ref CORTEX_MPU_Access_Bufferable */ | |||||
}MPU_Region_InitTypeDef; | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* __MPU_PRESENT */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group | |||||
* @{ | |||||
*/ | |||||
#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority | |||||
4 bits for subpriority */ | |||||
#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority | |||||
3 bits for subpriority */ | |||||
#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority | |||||
2 bits for subpriority */ | |||||
#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority | |||||
1 bits for subpriority */ | |||||
#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority | |||||
0 bits for subpriority */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup CORTEX_SysTick_clock_source CORTEX _SysTick clock source | |||||
* @{ | |||||
*/ | |||||
#define SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U | |||||
#define SYSTICK_CLKSOURCE_HCLK 0x00000004U | |||||
/** | |||||
* @} | |||||
*/ | |||||
#if (__MPU_PRESENT == 1) | |||||
/** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control | |||||
* @{ | |||||
*/ | |||||
#define MPU_HFNMI_PRIVDEF_NONE 0x00000000U | |||||
#define MPU_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk | |||||
#define MPU_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk | |||||
#define MPU_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable | |||||
* @{ | |||||
*/ | |||||
#define MPU_REGION_ENABLE ((uint8_t)0x01) | |||||
#define MPU_REGION_DISABLE ((uint8_t)0x00) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access | |||||
* @{ | |||||
*/ | |||||
#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00) | |||||
#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable | |||||
* @{ | |||||
*/ | |||||
#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01) | |||||
#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable | |||||
* @{ | |||||
*/ | |||||
#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01) | |||||
#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable | |||||
* @{ | |||||
*/ | |||||
#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01) | |||||
#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup CORTEX_MPU_TEX_Levels MPU TEX Levels | |||||
* @{ | |||||
*/ | |||||
#define MPU_TEX_LEVEL0 ((uint8_t)0x00) | |||||
#define MPU_TEX_LEVEL1 ((uint8_t)0x01) | |||||
#define MPU_TEX_LEVEL2 ((uint8_t)0x02) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size | |||||
* @{ | |||||
*/ | |||||
#define MPU_REGION_SIZE_32B ((uint8_t)0x04) | |||||
#define MPU_REGION_SIZE_64B ((uint8_t)0x05) | |||||
#define MPU_REGION_SIZE_128B ((uint8_t)0x06) | |||||
#define MPU_REGION_SIZE_256B ((uint8_t)0x07) | |||||
#define MPU_REGION_SIZE_512B ((uint8_t)0x08) | |||||
#define MPU_REGION_SIZE_1KB ((uint8_t)0x09) | |||||
#define MPU_REGION_SIZE_2KB ((uint8_t)0x0A) | |||||
#define MPU_REGION_SIZE_4KB ((uint8_t)0x0B) | |||||
#define MPU_REGION_SIZE_8KB ((uint8_t)0x0C) | |||||
#define MPU_REGION_SIZE_16KB ((uint8_t)0x0D) | |||||
#define MPU_REGION_SIZE_32KB ((uint8_t)0x0E) | |||||
#define MPU_REGION_SIZE_64KB ((uint8_t)0x0F) | |||||
#define MPU_REGION_SIZE_128KB ((uint8_t)0x10) | |||||
#define MPU_REGION_SIZE_256KB ((uint8_t)0x11) | |||||
#define MPU_REGION_SIZE_512KB ((uint8_t)0x12) | |||||
#define MPU_REGION_SIZE_1MB ((uint8_t)0x13) | |||||
#define MPU_REGION_SIZE_2MB ((uint8_t)0x14) | |||||
#define MPU_REGION_SIZE_4MB ((uint8_t)0x15) | |||||
#define MPU_REGION_SIZE_8MB ((uint8_t)0x16) | |||||
#define MPU_REGION_SIZE_16MB ((uint8_t)0x17) | |||||
#define MPU_REGION_SIZE_32MB ((uint8_t)0x18) | |||||
#define MPU_REGION_SIZE_64MB ((uint8_t)0x19) | |||||
#define MPU_REGION_SIZE_128MB ((uint8_t)0x1A) | |||||
#define MPU_REGION_SIZE_256MB ((uint8_t)0x1B) | |||||
#define MPU_REGION_SIZE_512MB ((uint8_t)0x1C) | |||||
#define MPU_REGION_SIZE_1GB ((uint8_t)0x1D) | |||||
#define MPU_REGION_SIZE_2GB ((uint8_t)0x1E) | |||||
#define MPU_REGION_SIZE_4GB ((uint8_t)0x1F) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes | |||||
* @{ | |||||
*/ | |||||
#define MPU_REGION_NO_ACCESS ((uint8_t)0x00) | |||||
#define MPU_REGION_PRIV_RW ((uint8_t)0x01) | |||||
#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02) | |||||
#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03) | |||||
#define MPU_REGION_PRIV_RO ((uint8_t)0x05) | |||||
#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number | |||||
* @{ | |||||
*/ | |||||
#define MPU_REGION_NUMBER0 ((uint8_t)0x00) | |||||
#define MPU_REGION_NUMBER1 ((uint8_t)0x01) | |||||
#define MPU_REGION_NUMBER2 ((uint8_t)0x02) | |||||
#define MPU_REGION_NUMBER3 ((uint8_t)0x03) | |||||
#define MPU_REGION_NUMBER4 ((uint8_t)0x04) | |||||
#define MPU_REGION_NUMBER5 ((uint8_t)0x05) | |||||
#define MPU_REGION_NUMBER6 ((uint8_t)0x06) | |||||
#define MPU_REGION_NUMBER7 ((uint8_t)0x07) | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* __MPU_PRESENT */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported Macros -----------------------------------------------------------*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @addtogroup CORTEX_Exported_Functions | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup CORTEX_Exported_Functions_Group1 | |||||
* @{ | |||||
*/ | |||||
/* Initialization and de-initialization functions *****************************/ | |||||
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); | |||||
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); | |||||
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); | |||||
void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); | |||||
void HAL_NVIC_SystemReset(void); | |||||
uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup CORTEX_Exported_Functions_Group2 | |||||
* @{ | |||||
*/ | |||||
/* Peripheral Control functions ***********************************************/ | |||||
uint32_t HAL_NVIC_GetPriorityGrouping(void); | |||||
void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); | |||||
uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); | |||||
void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); | |||||
void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); | |||||
uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); | |||||
void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); | |||||
void HAL_SYSTICK_IRQHandler(void); | |||||
void HAL_SYSTICK_Callback(void); | |||||
#if (__MPU_PRESENT == 1U) | |||||
void HAL_MPU_Enable(uint32_t MPU_Control); | |||||
void HAL_MPU_Disable(void); | |||||
void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init); | |||||
#endif /* __MPU_PRESENT */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private types -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private constants ---------------------------------------------------------*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/** @defgroup CORTEX_Private_Macros CORTEX Private Macros | |||||
* @{ | |||||
*/ | |||||
#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \ | |||||
((GROUP) == NVIC_PRIORITYGROUP_1) || \ | |||||
((GROUP) == NVIC_PRIORITYGROUP_2) || \ | |||||
((GROUP) == NVIC_PRIORITYGROUP_3) || \ | |||||
((GROUP) == NVIC_PRIORITYGROUP_4)) | |||||
#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < 0x10U) | |||||
#define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < 0x10U) | |||||
#define IS_NVIC_DEVICE_IRQ(IRQ) ((IRQ) >= (IRQn_Type)0x00U) | |||||
#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SYSTICK_CLKSOURCE_HCLK) || \ | |||||
((SOURCE) == SYSTICK_CLKSOURCE_HCLK_DIV8)) | |||||
#if (__MPU_PRESENT == 1U) | |||||
#define IS_MPU_REGION_ENABLE(STATE) (((STATE) == MPU_REGION_ENABLE) || \ | |||||
((STATE) == MPU_REGION_DISABLE)) | |||||
#define IS_MPU_INSTRUCTION_ACCESS(STATE) (((STATE) == MPU_INSTRUCTION_ACCESS_ENABLE) || \ | |||||
((STATE) == MPU_INSTRUCTION_ACCESS_DISABLE)) | |||||
#define IS_MPU_ACCESS_SHAREABLE(STATE) (((STATE) == MPU_ACCESS_SHAREABLE) || \ | |||||
((STATE) == MPU_ACCESS_NOT_SHAREABLE)) | |||||
#define IS_MPU_ACCESS_CACHEABLE(STATE) (((STATE) == MPU_ACCESS_CACHEABLE) || \ | |||||
((STATE) == MPU_ACCESS_NOT_CACHEABLE)) | |||||
#define IS_MPU_ACCESS_BUFFERABLE(STATE) (((STATE) == MPU_ACCESS_BUFFERABLE) || \ | |||||
((STATE) == MPU_ACCESS_NOT_BUFFERABLE)) | |||||
#define IS_MPU_TEX_LEVEL(TYPE) (((TYPE) == MPU_TEX_LEVEL0) || \ | |||||
((TYPE) == MPU_TEX_LEVEL1) || \ | |||||
((TYPE) == MPU_TEX_LEVEL2)) | |||||
#define IS_MPU_REGION_PERMISSION_ATTRIBUTE(TYPE) (((TYPE) == MPU_REGION_NO_ACCESS) || \ | |||||
((TYPE) == MPU_REGION_PRIV_RW) || \ | |||||
((TYPE) == MPU_REGION_PRIV_RW_URO) || \ | |||||
((TYPE) == MPU_REGION_FULL_ACCESS) || \ | |||||
((TYPE) == MPU_REGION_PRIV_RO) || \ | |||||
((TYPE) == MPU_REGION_PRIV_RO_URO)) | |||||
#define IS_MPU_REGION_NUMBER(NUMBER) (((NUMBER) == MPU_REGION_NUMBER0) || \ | |||||
((NUMBER) == MPU_REGION_NUMBER1) || \ | |||||
((NUMBER) == MPU_REGION_NUMBER2) || \ | |||||
((NUMBER) == MPU_REGION_NUMBER3) || \ | |||||
((NUMBER) == MPU_REGION_NUMBER4) || \ | |||||
((NUMBER) == MPU_REGION_NUMBER5) || \ | |||||
((NUMBER) == MPU_REGION_NUMBER6) || \ | |||||
((NUMBER) == MPU_REGION_NUMBER7)) | |||||
#define IS_MPU_REGION_SIZE(SIZE) (((SIZE) == MPU_REGION_SIZE_32B) || \ | |||||
((SIZE) == MPU_REGION_SIZE_64B) || \ | |||||
((SIZE) == MPU_REGION_SIZE_128B) || \ | |||||
((SIZE) == MPU_REGION_SIZE_256B) || \ | |||||
((SIZE) == MPU_REGION_SIZE_512B) || \ | |||||
((SIZE) == MPU_REGION_SIZE_1KB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_2KB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_4KB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_8KB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_16KB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_32KB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_64KB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_128KB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_256KB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_512KB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_1MB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_2MB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_4MB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_8MB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_16MB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_32MB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_64MB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_128MB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_256MB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_512MB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_1GB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_2GB) || \ | |||||
((SIZE) == MPU_REGION_SIZE_4GB)) | |||||
#define IS_MPU_SUB_REGION_DISABLE(SUBREGION) ((SUBREGION) < (uint16_t)0x00FF) | |||||
#endif /* __MPU_PRESENT */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32F4xx_HAL_CORTEX_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_def.h | |||||
* @author MCD Application Team | |||||
* @brief This file contains HAL common defines, enumeration, macros and | |||||
* structures definitions. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_HAL_DEF | |||||
#define __STM32F4xx_HAL_DEF | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx.h" | |||||
#include "Legacy/stm32_hal_legacy.h" | |||||
#include <stddef.h> | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/** | |||||
* @brief HAL Status structures definition | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
HAL_OK = 0x00U, | |||||
HAL_ERROR = 0x01U, | |||||
HAL_BUSY = 0x02U, | |||||
HAL_TIMEOUT = 0x03U | |||||
} HAL_StatusTypeDef; | |||||
/** | |||||
* @brief HAL Lock structures definition | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
HAL_UNLOCKED = 0x00U, | |||||
HAL_LOCKED = 0x01U | |||||
} HAL_LockTypeDef; | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
#define UNUSED(X) (void)X /* To avoid gcc/g++ warnings */ | |||||
#define HAL_MAX_DELAY 0xFFFFFFFFU | |||||
#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) == (BIT)) | |||||
#define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == 0U) | |||||
#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ | |||||
do{ \ | |||||
(__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \ | |||||
(__DMA_HANDLE__).Parent = (__HANDLE__); \ | |||||
} while(0U) | |||||
/** @brief Reset the Handle's State field. | |||||
* @param __HANDLE__ specifies the Peripheral Handle. | |||||
* @note This macro can be used for the following purpose: | |||||
* - When the Handle is declared as local variable; before passing it as parameter | |||||
* to HAL_PPP_Init() for the first time, it is mandatory to use this macro | |||||
* to set to 0 the Handle's "State" field. | |||||
* Otherwise, "State" field may have any random value and the first time the function | |||||
* HAL_PPP_Init() is called, the low level hardware initialization will be missed | |||||
* (i.e. HAL_PPP_MspInit() will not be executed). | |||||
* - When there is a need to reconfigure the low level hardware: instead of calling | |||||
* HAL_PPP_DeInit() then HAL_PPP_Init(), user can make a call to this macro then HAL_PPP_Init(). | |||||
* In this later function, when the Handle's "State" field is set to 0, it will execute the function | |||||
* HAL_PPP_MspInit() which will reconfigure the low level hardware. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0U) | |||||
#if (USE_RTOS == 1U) | |||||
/* Reserved for future use */ | |||||
#error "USE_RTOS should be 0 in the current HAL release" | |||||
#else | |||||
#define __HAL_LOCK(__HANDLE__) \ | |||||
do{ \ | |||||
if((__HANDLE__)->Lock == HAL_LOCKED) \ | |||||
{ \ | |||||
return HAL_BUSY; \ | |||||
} \ | |||||
else \ | |||||
{ \ | |||||
(__HANDLE__)->Lock = HAL_LOCKED; \ | |||||
} \ | |||||
}while (0U) | |||||
#define __HAL_UNLOCK(__HANDLE__) \ | |||||
do{ \ | |||||
(__HANDLE__)->Lock = HAL_UNLOCKED; \ | |||||
}while (0U) | |||||
#endif /* USE_RTOS */ | |||||
#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ | |||||
#ifndef __weak | |||||
#define __weak __attribute__((weak)) | |||||
#endif /* __weak */ | |||||
#ifndef __packed | |||||
#define __packed __attribute__((__packed__)) | |||||
#endif /* __packed */ | |||||
#endif /* __GNUC__ */ | |||||
/* Macro to get variable aligned on 4-bytes, for __ICCARM__ the directive "#pragma data_alignment=4" must be used instead */ | |||||
#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ | |||||
#ifndef __ALIGN_END | |||||
#define __ALIGN_END __attribute__ ((aligned (4))) | |||||
#endif /* __ALIGN_END */ | |||||
#ifndef __ALIGN_BEGIN | |||||
#define __ALIGN_BEGIN | |||||
#endif /* __ALIGN_BEGIN */ | |||||
#else | |||||
#ifndef __ALIGN_END | |||||
#define __ALIGN_END | |||||
#endif /* __ALIGN_END */ | |||||
#ifndef __ALIGN_BEGIN | |||||
#if defined (__CC_ARM) /* ARM Compiler */ | |||||
#define __ALIGN_BEGIN __align(4) | |||||
#elif defined (__ICCARM__) /* IAR Compiler */ | |||||
#define __ALIGN_BEGIN | |||||
#endif /* __CC_ARM */ | |||||
#endif /* __ALIGN_BEGIN */ | |||||
#endif /* __GNUC__ */ | |||||
/** | |||||
* @brief __RAM_FUNC definition | |||||
*/ | |||||
#if defined ( __CC_ARM ) | |||||
/* ARM Compiler | |||||
------------ | |||||
RAM functions are defined using the toolchain options. | |||||
Functions that are executed in RAM should reside in a separate source module. | |||||
Using the 'Options for File' dialog you can simply change the 'Code / Const' | |||||
area of a module to a memory space in physical RAM. | |||||
Available memory areas are declared in the 'Target' tab of the 'Options for Target' | |||||
dialog. | |||||
*/ | |||||
#define __RAM_FUNC | |||||
#elif defined ( __ICCARM__ ) | |||||
/* ICCARM Compiler | |||||
--------------- | |||||
RAM functions are defined using a specific toolchain keyword "__ramfunc". | |||||
*/ | |||||
#define __RAM_FUNC __ramfunc | |||||
#elif defined ( __GNUC__ ) | |||||
/* GNU Compiler | |||||
------------ | |||||
RAM functions are defined using a specific toolchain attribute | |||||
"__attribute__((section(".RamFunc")))". | |||||
*/ | |||||
#define __RAM_FUNC __attribute__((section(".RamFunc"))) | |||||
#endif | |||||
/** | |||||
* @brief __NOINLINE definition | |||||
*/ | |||||
#if defined ( __CC_ARM ) || defined ( __GNUC__ ) | |||||
/* ARM & GNUCompiler | |||||
---------------- | |||||
*/ | |||||
#define __NOINLINE __attribute__ ( (noinline) ) | |||||
#elif defined ( __ICCARM__ ) | |||||
/* ICCARM Compiler | |||||
--------------- | |||||
*/ | |||||
#define __NOINLINE _Pragma("optimize = no_inline") | |||||
#endif | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* ___STM32F4xx_HAL_DEF */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_dma.h | |||||
* @author MCD Application Team | |||||
* @brief Header file of DMA HAL module. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_HAL_DMA_H | |||||
#define __STM32F4xx_HAL_DMA_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_def.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup DMA | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/** @defgroup DMA_Exported_Types DMA Exported Types | |||||
* @brief DMA Exported Types | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief DMA Configuration Structure definition | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
uint32_t Channel; /*!< Specifies the channel used for the specified stream. | |||||
This parameter can be a value of @ref DMA_Channel_selection */ | |||||
uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, | |||||
from memory to memory or from peripheral to memory. | |||||
This parameter can be a value of @ref DMA_Data_transfer_direction */ | |||||
uint32_t PeriphInc; /*!< Specifies whether the Peripheral address register should be incremented or not. | |||||
This parameter can be a value of @ref DMA_Peripheral_incremented_mode */ | |||||
uint32_t MemInc; /*!< Specifies whether the memory address register should be incremented or not. | |||||
This parameter can be a value of @ref DMA_Memory_incremented_mode */ | |||||
uint32_t PeriphDataAlignment; /*!< Specifies the Peripheral data width. | |||||
This parameter can be a value of @ref DMA_Peripheral_data_size */ | |||||
uint32_t MemDataAlignment; /*!< Specifies the Memory data width. | |||||
This parameter can be a value of @ref DMA_Memory_data_size */ | |||||
uint32_t Mode; /*!< Specifies the operation mode of the DMAy Streamx. | |||||
This parameter can be a value of @ref DMA_mode | |||||
@note The circular buffer mode cannot be used if the memory-to-memory | |||||
data transfer is configured on the selected Stream */ | |||||
uint32_t Priority; /*!< Specifies the software priority for the DMAy Streamx. | |||||
This parameter can be a value of @ref DMA_Priority_level */ | |||||
uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. | |||||
This parameter can be a value of @ref DMA_FIFO_direct_mode | |||||
@note The Direct mode (FIFO mode disabled) cannot be used if the | |||||
memory-to-memory data transfer is configured on the selected stream */ | |||||
uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. | |||||
This parameter can be a value of @ref DMA_FIFO_threshold_level */ | |||||
uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. | |||||
It specifies the amount of data to be transferred in a single non interruptible | |||||
transaction. | |||||
This parameter can be a value of @ref DMA_Memory_burst | |||||
@note The burst mode is possible only if the address Increment mode is enabled. */ | |||||
uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. | |||||
It specifies the amount of data to be transferred in a single non interruptible | |||||
transaction. | |||||
This parameter can be a value of @ref DMA_Peripheral_burst | |||||
@note The burst mode is possible only if the address Increment mode is enabled. */ | |||||
}DMA_InitTypeDef; | |||||
/** | |||||
* @brief HAL DMA State structures definition | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
HAL_DMA_STATE_RESET = 0x00U, /*!< DMA not yet initialized or disabled */ | |||||
HAL_DMA_STATE_READY = 0x01U, /*!< DMA initialized and ready for use */ | |||||
HAL_DMA_STATE_BUSY = 0x02U, /*!< DMA process is ongoing */ | |||||
HAL_DMA_STATE_TIMEOUT = 0x03U, /*!< DMA timeout state */ | |||||
HAL_DMA_STATE_ERROR = 0x04U, /*!< DMA error state */ | |||||
HAL_DMA_STATE_ABORT = 0x05U, /*!< DMA Abort state */ | |||||
}HAL_DMA_StateTypeDef; | |||||
/** | |||||
* @brief HAL DMA Error Code structure definition | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
HAL_DMA_FULL_TRANSFER = 0x00U, /*!< Full transfer */ | |||||
HAL_DMA_HALF_TRANSFER = 0x01U /*!< Half Transfer */ | |||||
}HAL_DMA_LevelCompleteTypeDef; | |||||
/** | |||||
* @brief HAL DMA Error Code structure definition | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
HAL_DMA_XFER_CPLT_CB_ID = 0x00U, /*!< Full transfer */ | |||||
HAL_DMA_XFER_HALFCPLT_CB_ID = 0x01U, /*!< Half Transfer */ | |||||
HAL_DMA_XFER_M1CPLT_CB_ID = 0x02U, /*!< M1 Full Transfer */ | |||||
HAL_DMA_XFER_M1HALFCPLT_CB_ID = 0x03U, /*!< M1 Half Transfer */ | |||||
HAL_DMA_XFER_ERROR_CB_ID = 0x04U, /*!< Error */ | |||||
HAL_DMA_XFER_ABORT_CB_ID = 0x05U, /*!< Abort */ | |||||
HAL_DMA_XFER_ALL_CB_ID = 0x06U /*!< All */ | |||||
}HAL_DMA_CallbackIDTypeDef; | |||||
/** | |||||
* @brief DMA handle Structure definition | |||||
*/ | |||||
typedef struct __DMA_HandleTypeDef | |||||
{ | |||||
DMA_Stream_TypeDef *Instance; /*!< Register base address */ | |||||
DMA_InitTypeDef Init; /*!< DMA communication parameters */ | |||||
HAL_LockTypeDef Lock; /*!< DMA locking object */ | |||||
__IO HAL_DMA_StateTypeDef State; /*!< DMA transfer state */ | |||||
void *Parent; /*!< Parent object state */ | |||||
void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete callback */ | |||||
void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA Half transfer complete callback */ | |||||
void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete Memory1 callback */ | |||||
void (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Half complete Memory1 callback */ | |||||
void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer error callback */ | |||||
void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Abort callback */ | |||||
__IO uint32_t ErrorCode; /*!< DMA Error code */ | |||||
uint32_t StreamBaseAddress; /*!< DMA Stream Base Address */ | |||||
uint32_t StreamIndex; /*!< DMA Stream Index */ | |||||
}DMA_HandleTypeDef; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/** @defgroup DMA_Exported_Constants DMA Exported Constants | |||||
* @brief DMA Exported constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup DMA_Error_Code DMA Error Code | |||||
* @brief DMA Error Code | |||||
* @{ | |||||
*/ | |||||
#define HAL_DMA_ERROR_NONE 0x00000000U /*!< No error */ | |||||
#define HAL_DMA_ERROR_TE 0x00000001U /*!< Transfer error */ | |||||
#define HAL_DMA_ERROR_FE 0x00000002U /*!< FIFO error */ | |||||
#define HAL_DMA_ERROR_DME 0x00000004U /*!< Direct Mode error */ | |||||
#define HAL_DMA_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ | |||||
#define HAL_DMA_ERROR_PARAM 0x00000040U /*!< Parameter error */ | |||||
#define HAL_DMA_ERROR_NO_XFER 0x00000080U /*!< Abort requested with no Xfer ongoing */ | |||||
#define HAL_DMA_ERROR_NOT_SUPPORTED 0x00000100U /*!< Not supported mode */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_Channel_selection DMA Channel selection | |||||
* @brief DMA channel selection | |||||
* @{ | |||||
*/ | |||||
#define DMA_CHANNEL_0 0x00000000U /*!< DMA Channel 0 */ | |||||
#define DMA_CHANNEL_1 0x02000000U /*!< DMA Channel 1 */ | |||||
#define DMA_CHANNEL_2 0x04000000U /*!< DMA Channel 2 */ | |||||
#define DMA_CHANNEL_3 0x06000000U /*!< DMA Channel 3 */ | |||||
#define DMA_CHANNEL_4 0x08000000U /*!< DMA Channel 4 */ | |||||
#define DMA_CHANNEL_5 0x0A000000U /*!< DMA Channel 5 */ | |||||
#define DMA_CHANNEL_6 0x0C000000U /*!< DMA Channel 6 */ | |||||
#define DMA_CHANNEL_7 0x0E000000U /*!< DMA Channel 7 */ | |||||
#if defined (DMA_SxCR_CHSEL_3) | |||||
#define DMA_CHANNEL_8 0x10000000U /*!< DMA Channel 8 */ | |||||
#define DMA_CHANNEL_9 0x12000000U /*!< DMA Channel 9 */ | |||||
#define DMA_CHANNEL_10 0x14000000U /*!< DMA Channel 10 */ | |||||
#define DMA_CHANNEL_11 0x16000000U /*!< DMA Channel 11 */ | |||||
#define DMA_CHANNEL_12 0x18000000U /*!< DMA Channel 12 */ | |||||
#define DMA_CHANNEL_13 0x1A000000U /*!< DMA Channel 13 */ | |||||
#define DMA_CHANNEL_14 0x1C000000U /*!< DMA Channel 14 */ | |||||
#define DMA_CHANNEL_15 0x1E000000U /*!< DMA Channel 15 */ | |||||
#endif /* DMA_SxCR_CHSEL_3 */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_Data_transfer_direction DMA Data transfer direction | |||||
* @brief DMA data transfer direction | |||||
* @{ | |||||
*/ | |||||
#define DMA_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ | |||||
#define DMA_MEMORY_TO_PERIPH ((uint32_t)DMA_SxCR_DIR_0) /*!< Memory to peripheral direction */ | |||||
#define DMA_MEMORY_TO_MEMORY ((uint32_t)DMA_SxCR_DIR_1) /*!< Memory to memory direction */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_Peripheral_incremented_mode DMA Peripheral incremented mode | |||||
* @brief DMA peripheral incremented mode | |||||
* @{ | |||||
*/ | |||||
#define DMA_PINC_ENABLE ((uint32_t)DMA_SxCR_PINC) /*!< Peripheral increment mode enable */ | |||||
#define DMA_PINC_DISABLE 0x00000000U /*!< Peripheral increment mode disable */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_Memory_incremented_mode DMA Memory incremented mode | |||||
* @brief DMA memory incremented mode | |||||
* @{ | |||||
*/ | |||||
#define DMA_MINC_ENABLE ((uint32_t)DMA_SxCR_MINC) /*!< Memory increment mode enable */ | |||||
#define DMA_MINC_DISABLE 0x00000000U /*!< Memory increment mode disable */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_Peripheral_data_size DMA Peripheral data size | |||||
* @brief DMA peripheral data size | |||||
* @{ | |||||
*/ | |||||
#define DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment: Byte */ | |||||
#define DMA_PDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_PSIZE_0) /*!< Peripheral data alignment: HalfWord */ | |||||
#define DMA_PDATAALIGN_WORD ((uint32_t)DMA_SxCR_PSIZE_1) /*!< Peripheral data alignment: Word */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_Memory_data_size DMA Memory data size | |||||
* @brief DMA memory data size | |||||
* @{ | |||||
*/ | |||||
#define DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment: Byte */ | |||||
#define DMA_MDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_MSIZE_0) /*!< Memory data alignment: HalfWord */ | |||||
#define DMA_MDATAALIGN_WORD ((uint32_t)DMA_SxCR_MSIZE_1) /*!< Memory data alignment: Word */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_mode DMA mode | |||||
* @brief DMA mode | |||||
* @{ | |||||
*/ | |||||
#define DMA_NORMAL 0x00000000U /*!< Normal mode */ | |||||
#define DMA_CIRCULAR ((uint32_t)DMA_SxCR_CIRC) /*!< Circular mode */ | |||||
#define DMA_PFCTRL ((uint32_t)DMA_SxCR_PFCTRL) /*!< Peripheral flow control mode */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_Priority_level DMA Priority level | |||||
* @brief DMA priority levels | |||||
* @{ | |||||
*/ | |||||
#define DMA_PRIORITY_LOW 0x00000000U /*!< Priority level: Low */ | |||||
#define DMA_PRIORITY_MEDIUM ((uint32_t)DMA_SxCR_PL_0) /*!< Priority level: Medium */ | |||||
#define DMA_PRIORITY_HIGH ((uint32_t)DMA_SxCR_PL_1) /*!< Priority level: High */ | |||||
#define DMA_PRIORITY_VERY_HIGH ((uint32_t)DMA_SxCR_PL) /*!< Priority level: Very High */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_FIFO_direct_mode DMA FIFO direct mode | |||||
* @brief DMA FIFO direct mode | |||||
* @{ | |||||
*/ | |||||
#define DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ | |||||
#define DMA_FIFOMODE_ENABLE ((uint32_t)DMA_SxFCR_DMDIS) /*!< FIFO mode enable */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_FIFO_threshold_level DMA FIFO threshold level | |||||
* @brief DMA FIFO level | |||||
* @{ | |||||
*/ | |||||
#define DMA_FIFO_THRESHOLD_1QUARTERFULL 0x00000000U /*!< FIFO threshold 1 quart full configuration */ | |||||
#define DMA_FIFO_THRESHOLD_HALFFULL ((uint32_t)DMA_SxFCR_FTH_0) /*!< FIFO threshold half full configuration */ | |||||
#define DMA_FIFO_THRESHOLD_3QUARTERSFULL ((uint32_t)DMA_SxFCR_FTH_1) /*!< FIFO threshold 3 quarts full configuration */ | |||||
#define DMA_FIFO_THRESHOLD_FULL ((uint32_t)DMA_SxFCR_FTH) /*!< FIFO threshold full configuration */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_Memory_burst DMA Memory burst | |||||
* @brief DMA memory burst | |||||
* @{ | |||||
*/ | |||||
#define DMA_MBURST_SINGLE 0x00000000U | |||||
#define DMA_MBURST_INC4 ((uint32_t)DMA_SxCR_MBURST_0) | |||||
#define DMA_MBURST_INC8 ((uint32_t)DMA_SxCR_MBURST_1) | |||||
#define DMA_MBURST_INC16 ((uint32_t)DMA_SxCR_MBURST) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_Peripheral_burst DMA Peripheral burst | |||||
* @brief DMA peripheral burst | |||||
* @{ | |||||
*/ | |||||
#define DMA_PBURST_SINGLE 0x00000000U | |||||
#define DMA_PBURST_INC4 ((uint32_t)DMA_SxCR_PBURST_0) | |||||
#define DMA_PBURST_INC8 ((uint32_t)DMA_SxCR_PBURST_1) | |||||
#define DMA_PBURST_INC16 ((uint32_t)DMA_SxCR_PBURST) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_interrupt_enable_definitions DMA interrupt enable definitions | |||||
* @brief DMA interrupts definition | |||||
* @{ | |||||
*/ | |||||
#define DMA_IT_TC ((uint32_t)DMA_SxCR_TCIE) | |||||
#define DMA_IT_HT ((uint32_t)DMA_SxCR_HTIE) | |||||
#define DMA_IT_TE ((uint32_t)DMA_SxCR_TEIE) | |||||
#define DMA_IT_DME ((uint32_t)DMA_SxCR_DMEIE) | |||||
#define DMA_IT_FE 0x00000080U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_flag_definitions DMA flag definitions | |||||
* @brief DMA flag definitions | |||||
* @{ | |||||
*/ | |||||
#define DMA_FLAG_FEIF0_4 0x00000001U | |||||
#define DMA_FLAG_DMEIF0_4 0x00000004U | |||||
#define DMA_FLAG_TEIF0_4 0x00000008U | |||||
#define DMA_FLAG_HTIF0_4 0x00000010U | |||||
#define DMA_FLAG_TCIF0_4 0x00000020U | |||||
#define DMA_FLAG_FEIF1_5 0x00000040U | |||||
#define DMA_FLAG_DMEIF1_5 0x00000100U | |||||
#define DMA_FLAG_TEIF1_5 0x00000200U | |||||
#define DMA_FLAG_HTIF1_5 0x00000400U | |||||
#define DMA_FLAG_TCIF1_5 0x00000800U | |||||
#define DMA_FLAG_FEIF2_6 0x00010000U | |||||
#define DMA_FLAG_DMEIF2_6 0x00040000U | |||||
#define DMA_FLAG_TEIF2_6 0x00080000U | |||||
#define DMA_FLAG_HTIF2_6 0x00100000U | |||||
#define DMA_FLAG_TCIF2_6 0x00200000U | |||||
#define DMA_FLAG_FEIF3_7 0x00400000U | |||||
#define DMA_FLAG_DMEIF3_7 0x01000000U | |||||
#define DMA_FLAG_TEIF3_7 0x02000000U | |||||
#define DMA_FLAG_HTIF3_7 0x04000000U | |||||
#define DMA_FLAG_TCIF3_7 0x08000000U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
/** @brief Reset DMA handle state | |||||
* @param __HANDLE__ specifies the DMA handle. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_DMA_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DMA_STATE_RESET) | |||||
/** | |||||
* @brief Return the current DMA Stream FIFO filled level. | |||||
* @param __HANDLE__ DMA handle | |||||
* @retval The FIFO filling state. | |||||
* - DMA_FIFOStatus_Less1QuarterFull: when FIFO is less than 1 quarter-full | |||||
* and not empty. | |||||
* - DMA_FIFOStatus_1QuarterFull: if more than 1 quarter-full. | |||||
* - DMA_FIFOStatus_HalfFull: if more than 1 half-full. | |||||
* - DMA_FIFOStatus_3QuartersFull: if more than 3 quarters-full. | |||||
* - DMA_FIFOStatus_Empty: when FIFO is empty | |||||
* - DMA_FIFOStatus_Full: when FIFO is full | |||||
*/ | |||||
#define __HAL_DMA_GET_FS(__HANDLE__) (((__HANDLE__)->Instance->FCR & (DMA_SxFCR_FS))) | |||||
/** | |||||
* @brief Enable the specified DMA Stream. | |||||
* @param __HANDLE__ DMA handle | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA_SxCR_EN) | |||||
/** | |||||
* @brief Disable the specified DMA Stream. | |||||
* @param __HANDLE__ DMA handle | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~DMA_SxCR_EN) | |||||
/* Interrupt & Flag management */ | |||||
/** | |||||
* @brief Return the current DMA Stream transfer complete flag. | |||||
* @param __HANDLE__ DMA handle | |||||
* @retval The specified transfer complete flag index. | |||||
*/ | |||||
#define __HAL_DMA_GET_TC_FLAG_INDEX(__HANDLE__) \ | |||||
(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TCIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TCIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TCIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TCIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TCIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TCIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TCIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TCIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TCIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TCIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TCIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TCIF2_6 :\ | |||||
DMA_FLAG_TCIF3_7) | |||||
/** | |||||
* @brief Return the current DMA Stream half transfer complete flag. | |||||
* @param __HANDLE__ DMA handle | |||||
* @retval The specified half transfer complete flag index. | |||||
*/ | |||||
#define __HAL_DMA_GET_HT_FLAG_INDEX(__HANDLE__)\ | |||||
(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_HTIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_HTIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_HTIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_HTIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_HTIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_HTIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_HTIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_HTIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_HTIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_HTIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_HTIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_HTIF2_6 :\ | |||||
DMA_FLAG_HTIF3_7) | |||||
/** | |||||
* @brief Return the current DMA Stream transfer error flag. | |||||
* @param __HANDLE__ DMA handle | |||||
* @retval The specified transfer error flag index. | |||||
*/ | |||||
#define __HAL_DMA_GET_TE_FLAG_INDEX(__HANDLE__)\ | |||||
(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TEIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TEIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TEIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TEIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TEIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TEIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TEIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TEIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TEIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TEIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TEIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TEIF2_6 :\ | |||||
DMA_FLAG_TEIF3_7) | |||||
/** | |||||
* @brief Return the current DMA Stream FIFO error flag. | |||||
* @param __HANDLE__ DMA handle | |||||
* @retval The specified FIFO error flag index. | |||||
*/ | |||||
#define __HAL_DMA_GET_FE_FLAG_INDEX(__HANDLE__)\ | |||||
(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_FEIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_FEIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_FEIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_FEIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_FEIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_FEIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_FEIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_FEIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_FEIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_FEIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_FEIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_FEIF2_6 :\ | |||||
DMA_FLAG_FEIF3_7) | |||||
/** | |||||
* @brief Return the current DMA Stream direct mode error flag. | |||||
* @param __HANDLE__ DMA handle | |||||
* @retval The specified direct mode error flag index. | |||||
*/ | |||||
#define __HAL_DMA_GET_DME_FLAG_INDEX(__HANDLE__)\ | |||||
(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_DMEIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_DMEIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_DMEIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_DMEIF0_4 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_DMEIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_DMEIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_DMEIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_DMEIF1_5 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_DMEIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_DMEIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_DMEIF2_6 :\ | |||||
((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_DMEIF2_6 :\ | |||||
DMA_FLAG_DMEIF3_7) | |||||
/** | |||||
* @brief Get the DMA Stream pending flags. | |||||
* @param __HANDLE__ DMA handle | |||||
* @param __FLAG__ Get the specified flag. | |||||
* This parameter can be any combination of the following values: | |||||
* @arg DMA_FLAG_TCIFx: Transfer complete flag. | |||||
* @arg DMA_FLAG_HTIFx: Half transfer complete flag. | |||||
* @arg DMA_FLAG_TEIFx: Transfer error flag. | |||||
* @arg DMA_FLAG_DMEIFx: Direct mode error flag. | |||||
* @arg DMA_FLAG_FEIFx: FIFO error flag. | |||||
* Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. | |||||
* @retval The state of FLAG (SET or RESET). | |||||
*/ | |||||
#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)\ | |||||
(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HISR & (__FLAG__)) :\ | |||||
((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LISR & (__FLAG__)) :\ | |||||
((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HISR & (__FLAG__)) : (DMA1->LISR & (__FLAG__))) | |||||
/** | |||||
* @brief Clear the DMA Stream pending flags. | |||||
* @param __HANDLE__ DMA handle | |||||
* @param __FLAG__ specifies the flag to clear. | |||||
* This parameter can be any combination of the following values: | |||||
* @arg DMA_FLAG_TCIFx: Transfer complete flag. | |||||
* @arg DMA_FLAG_HTIFx: Half transfer complete flag. | |||||
* @arg DMA_FLAG_TEIFx: Transfer error flag. | |||||
* @arg DMA_FLAG_DMEIFx: Direct mode error flag. | |||||
* @arg DMA_FLAG_FEIFx: FIFO error flag. | |||||
* Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) \ | |||||
(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HIFCR = (__FLAG__)) :\ | |||||
((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LIFCR = (__FLAG__)) :\ | |||||
((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HIFCR = (__FLAG__)) : (DMA1->LIFCR = (__FLAG__))) | |||||
/** | |||||
* @brief Enable the specified DMA Stream interrupts. | |||||
* @param __HANDLE__ DMA handle | |||||
* @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. | |||||
* This parameter can be any combination of the following values: | |||||
* @arg DMA_IT_TC: Transfer complete interrupt mask. | |||||
* @arg DMA_IT_HT: Half transfer complete interrupt mask. | |||||
* @arg DMA_IT_TE: Transfer error interrupt mask. | |||||
* @arg DMA_IT_FE: FIFO error interrupt mask. | |||||
* @arg DMA_IT_DME: Direct mode error interrupt. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ | |||||
((__HANDLE__)->Instance->CR |= (__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR |= (__INTERRUPT__))) | |||||
/** | |||||
* @brief Disable the specified DMA Stream interrupts. | |||||
* @param __HANDLE__ DMA handle | |||||
* @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. | |||||
* This parameter can be any combination of the following values: | |||||
* @arg DMA_IT_TC: Transfer complete interrupt mask. | |||||
* @arg DMA_IT_HT: Half transfer complete interrupt mask. | |||||
* @arg DMA_IT_TE: Transfer error interrupt mask. | |||||
* @arg DMA_IT_FE: FIFO error interrupt mask. | |||||
* @arg DMA_IT_DME: Direct mode error interrupt. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ | |||||
((__HANDLE__)->Instance->CR &= ~(__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR &= ~(__INTERRUPT__))) | |||||
/** | |||||
* @brief Check whether the specified DMA Stream interrupt is enabled or disabled. | |||||
* @param __HANDLE__ DMA handle | |||||
* @param __INTERRUPT__ specifies the DMA interrupt source to check. | |||||
* This parameter can be one of the following values: | |||||
* @arg DMA_IT_TC: Transfer complete interrupt mask. | |||||
* @arg DMA_IT_HT: Half transfer complete interrupt mask. | |||||
* @arg DMA_IT_TE: Transfer error interrupt mask. | |||||
* @arg DMA_IT_FE: FIFO error interrupt mask. | |||||
* @arg DMA_IT_DME: Direct mode error interrupt. | |||||
* @retval The state of DMA_IT. | |||||
*/ | |||||
#define __HAL_DMA_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ | |||||
((__HANDLE__)->Instance->CR & (__INTERRUPT__)) : \ | |||||
((__HANDLE__)->Instance->FCR & (__INTERRUPT__))) | |||||
/** | |||||
* @brief Writes the number of data units to be transferred on the DMA Stream. | |||||
* @param __HANDLE__ DMA handle | |||||
* @param __COUNTER__ Number of data units to be transferred (from 0 to 65535) | |||||
* Number of data items depends only on the Peripheral data format. | |||||
* | |||||
* @note If Peripheral data format is Bytes: number of data units is equal | |||||
* to total number of bytes to be transferred. | |||||
* | |||||
* @note If Peripheral data format is Half-Word: number of data units is | |||||
* equal to total number of bytes to be transferred / 2. | |||||
* | |||||
* @note If Peripheral data format is Word: number of data units is equal | |||||
* to total number of bytes to be transferred / 4. | |||||
* | |||||
* @retval The number of remaining data units in the current DMAy Streamx transfer. | |||||
*/ | |||||
#define __HAL_DMA_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->NDTR = (uint16_t)(__COUNTER__)) | |||||
/** | |||||
* @brief Returns the number of remaining data units in the current DMAy Streamx transfer. | |||||
* @param __HANDLE__ DMA handle | |||||
* | |||||
* @retval The number of remaining data units in the current DMA Stream transfer. | |||||
*/ | |||||
#define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->NDTR) | |||||
/* Include DMA HAL Extension module */ | |||||
#include "stm32f4xx_hal_dma_ex.h" | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @defgroup DMA_Exported_Functions DMA Exported Functions | |||||
* @brief DMA Exported functions | |||||
* @{ | |||||
*/ | |||||
/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions | |||||
* @brief Initialization and de-initialization functions | |||||
* @{ | |||||
*/ | |||||
HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma); | |||||
HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_Exported_Functions_Group2 I/O operation functions | |||||
* @brief I/O operation functions | |||||
* @{ | |||||
*/ | |||||
HAL_StatusTypeDef HAL_DMA_Start (DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); | |||||
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); | |||||
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma); | |||||
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma); | |||||
HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout); | |||||
void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma); | |||||
HAL_StatusTypeDef HAL_DMA_CleanCallbacks(DMA_HandleTypeDef *hdma); | |||||
HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)); | |||||
HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup DMA_Exported_Functions_Group3 Peripheral State functions | |||||
* @brief Peripheral State functions | |||||
* @{ | |||||
*/ | |||||
HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma); | |||||
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private Constants -------------------------------------------------------------*/ | |||||
/** @defgroup DMA_Private_Constants DMA Private Constants | |||||
* @brief DMA private defines and constants | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/** @defgroup DMA_Private_Macros DMA Private Macros | |||||
* @brief DMA private macros | |||||
* @{ | |||||
*/ | |||||
#if defined (DMA_SxCR_CHSEL_3) | |||||
#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ | |||||
((CHANNEL) == DMA_CHANNEL_1) || \ | |||||
((CHANNEL) == DMA_CHANNEL_2) || \ | |||||
((CHANNEL) == DMA_CHANNEL_3) || \ | |||||
((CHANNEL) == DMA_CHANNEL_4) || \ | |||||
((CHANNEL) == DMA_CHANNEL_5) || \ | |||||
((CHANNEL) == DMA_CHANNEL_6) || \ | |||||
((CHANNEL) == DMA_CHANNEL_7) || \ | |||||
((CHANNEL) == DMA_CHANNEL_8) || \ | |||||
((CHANNEL) == DMA_CHANNEL_9) || \ | |||||
((CHANNEL) == DMA_CHANNEL_10)|| \ | |||||
((CHANNEL) == DMA_CHANNEL_11)|| \ | |||||
((CHANNEL) == DMA_CHANNEL_12)|| \ | |||||
((CHANNEL) == DMA_CHANNEL_13)|| \ | |||||
((CHANNEL) == DMA_CHANNEL_14)|| \ | |||||
((CHANNEL) == DMA_CHANNEL_15)) | |||||
#else | |||||
#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ | |||||
((CHANNEL) == DMA_CHANNEL_1) || \ | |||||
((CHANNEL) == DMA_CHANNEL_2) || \ | |||||
((CHANNEL) == DMA_CHANNEL_3) || \ | |||||
((CHANNEL) == DMA_CHANNEL_4) || \ | |||||
((CHANNEL) == DMA_CHANNEL_5) || \ | |||||
((CHANNEL) == DMA_CHANNEL_6) || \ | |||||
((CHANNEL) == DMA_CHANNEL_7)) | |||||
#endif /* DMA_SxCR_CHSEL_3 */ | |||||
#define IS_DMA_DIRECTION(DIRECTION) (((DIRECTION) == DMA_PERIPH_TO_MEMORY ) || \ | |||||
((DIRECTION) == DMA_MEMORY_TO_PERIPH) || \ | |||||
((DIRECTION) == DMA_MEMORY_TO_MEMORY)) | |||||
#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x01U) && ((SIZE) < 0x10000U)) | |||||
#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PINC_ENABLE) || \ | |||||
((STATE) == DMA_PINC_DISABLE)) | |||||
#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MINC_ENABLE) || \ | |||||
((STATE) == DMA_MINC_DISABLE)) | |||||
#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PDATAALIGN_BYTE) || \ | |||||
((SIZE) == DMA_PDATAALIGN_HALFWORD) || \ | |||||
((SIZE) == DMA_PDATAALIGN_WORD)) | |||||
#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MDATAALIGN_BYTE) || \ | |||||
((SIZE) == DMA_MDATAALIGN_HALFWORD) || \ | |||||
((SIZE) == DMA_MDATAALIGN_WORD )) | |||||
#define IS_DMA_MODE(MODE) (((MODE) == DMA_NORMAL ) || \ | |||||
((MODE) == DMA_CIRCULAR) || \ | |||||
((MODE) == DMA_PFCTRL)) | |||||
#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_PRIORITY_LOW ) || \ | |||||
((PRIORITY) == DMA_PRIORITY_MEDIUM) || \ | |||||
((PRIORITY) == DMA_PRIORITY_HIGH) || \ | |||||
((PRIORITY) == DMA_PRIORITY_VERY_HIGH)) | |||||
#define IS_DMA_FIFO_MODE_STATE(STATE) (((STATE) == DMA_FIFOMODE_DISABLE ) || \ | |||||
((STATE) == DMA_FIFOMODE_ENABLE)) | |||||
#define IS_DMA_FIFO_THRESHOLD(THRESHOLD) (((THRESHOLD) == DMA_FIFO_THRESHOLD_1QUARTERFULL ) || \ | |||||
((THRESHOLD) == DMA_FIFO_THRESHOLD_HALFFULL) || \ | |||||
((THRESHOLD) == DMA_FIFO_THRESHOLD_3QUARTERSFULL) || \ | |||||
((THRESHOLD) == DMA_FIFO_THRESHOLD_FULL)) | |||||
#define IS_DMA_MEMORY_BURST(BURST) (((BURST) == DMA_MBURST_SINGLE) || \ | |||||
((BURST) == DMA_MBURST_INC4) || \ | |||||
((BURST) == DMA_MBURST_INC8) || \ | |||||
((BURST) == DMA_MBURST_INC16)) | |||||
#define IS_DMA_PERIPHERAL_BURST(BURST) (((BURST) == DMA_PBURST_SINGLE) || \ | |||||
((BURST) == DMA_PBURST_INC4) || \ | |||||
((BURST) == DMA_PBURST_INC8) || \ | |||||
((BURST) == DMA_PBURST_INC16)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/** @defgroup DMA_Private_Functions DMA Private Functions | |||||
* @brief DMA private functions | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32F4xx_HAL_DMA_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_dma_ex.h | |||||
* @author MCD Application Team | |||||
* @brief Header file of DMA HAL extension module. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_HAL_DMA_EX_H | |||||
#define __STM32F4xx_HAL_DMA_EX_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_def.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup DMAEx | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/** @defgroup DMAEx_Exported_Types DMAEx Exported Types | |||||
* @brief DMAEx Exported types | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief HAL DMA Memory definition | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
MEMORY0 = 0x00U, /*!< Memory 0 */ | |||||
MEMORY1 = 0x01U /*!< Memory 1 */ | |||||
}HAL_DMA_MemoryTypeDef; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @defgroup DMAEx_Exported_Functions DMAEx Exported Functions | |||||
* @brief DMAEx Exported functions | |||||
* @{ | |||||
*/ | |||||
/** @defgroup DMAEx_Exported_Functions_Group1 Extended features functions | |||||
* @brief Extended features functions | |||||
* @{ | |||||
*/ | |||||
/* IO operation functions *******************************************************/ | |||||
HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); | |||||
HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); | |||||
HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/** @defgroup DMAEx_Private_Functions DMAEx Private Functions | |||||
* @brief DMAEx Private functions | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /*__STM32F4xx_HAL_DMA_EX_H*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_exti.h | |||||
* @author MCD Application Team | |||||
* @brief Header file of EXTI HAL module. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2018 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef STM32f4xx_HAL_EXTI_H | |||||
#define STM32f4xx_HAL_EXTI_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_def.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @defgroup EXTI EXTI | |||||
* @brief EXTI HAL module driver | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/** @defgroup EXTI_Exported_Types EXTI Exported Types | |||||
* @{ | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
HAL_EXTI_COMMON_CB_ID = 0x00U | |||||
} EXTI_CallbackIDTypeDef; | |||||
/** | |||||
* @brief EXTI Handle structure definition | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
uint32_t Line; /*!< Exti line number */ | |||||
void (* PendingCallback)(void); /*!< Exti pending callback */ | |||||
} EXTI_HandleTypeDef; | |||||
/** | |||||
* @brief EXTI Configuration structure definition | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
uint32_t Line; /*!< The Exti line to be configured. This parameter | |||||
can be a value of @ref EXTI_Line */ | |||||
uint32_t Mode; /*!< The Exit Mode to be configured for a core. | |||||
This parameter can be a combination of @ref EXTI_Mode */ | |||||
uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter | |||||
can be a value of @ref EXTI_Trigger */ | |||||
uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. | |||||
This parameter is only possible for line 0 to 15. It | |||||
can be a value of @ref EXTI_GPIOSel */ | |||||
} EXTI_ConfigTypeDef; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/** @defgroup EXTI_Exported_Constants EXTI Exported Constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup EXTI_Line EXTI Line | |||||
* @{ | |||||
*/ | |||||
#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ | |||||
#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ | |||||
#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ | |||||
#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ | |||||
#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ | |||||
#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ | |||||
#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ | |||||
#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ | |||||
#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ | |||||
#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ | |||||
#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ | |||||
#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ | |||||
#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ | |||||
#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ | |||||
#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ | |||||
#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ | |||||
#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ | |||||
#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ | |||||
#if defined(EXTI_IMR_IM18) | |||||
#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ | |||||
#else | |||||
#define EXTI_LINE_18 (EXTI_RESERVED | 0x12u) /*!< No interrupt supported in this line */ | |||||
#endif /* EXTI_IMR_IM18 */ | |||||
#if defined(EXTI_IMR_IM19) | |||||
#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ | |||||
#else | |||||
#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ | |||||
#endif /* EXTI_IMR_IM19 */ | |||||
#if defined(EXTI_IMR_IM20) | |||||
#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ | |||||
#else | |||||
#define EXTI_LINE_20 (EXTI_RESERVED | 0x14u) /*!< No interrupt supported in this line */ | |||||
#endif /* EXTI_IMR_IM20 */ | |||||
#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ | |||||
#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ | |||||
#if defined(EXTI_IMR_IM23) | |||||
#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM1 asynchronous event */ | |||||
#endif /* EXTI_IMR_IM23 */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup EXTI_Mode EXTI Mode | |||||
* @{ | |||||
*/ | |||||
#define EXTI_MODE_NONE 0x00000000u | |||||
#define EXTI_MODE_INTERRUPT 0x00000001u | |||||
#define EXTI_MODE_EVENT 0x00000002u | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup EXTI_Trigger EXTI Trigger | |||||
* @{ | |||||
*/ | |||||
#define EXTI_TRIGGER_NONE 0x00000000u | |||||
#define EXTI_TRIGGER_RISING 0x00000001u | |||||
#define EXTI_TRIGGER_FALLING 0x00000002u | |||||
#define EXTI_TRIGGER_RISING_FALLING (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup EXTI_GPIOSel EXTI GPIOSel | |||||
* @brief | |||||
* @{ | |||||
*/ | |||||
#define EXTI_GPIOA 0x00000000u | |||||
#define EXTI_GPIOB 0x00000001u | |||||
#define EXTI_GPIOC 0x00000002u | |||||
#if defined (GPIOD) | |||||
#define EXTI_GPIOD 0x00000003u | |||||
#endif /* GPIOD */ | |||||
#if defined (GPIOE) | |||||
#define EXTI_GPIOE 0x00000004u | |||||
#endif /* GPIOE */ | |||||
#if defined (GPIOF) | |||||
#define EXTI_GPIOF 0x00000005u | |||||
#endif /* GPIOF */ | |||||
#if defined (GPIOG) | |||||
#define EXTI_GPIOG 0x00000006u | |||||
#endif /* GPIOG */ | |||||
#if defined (GPIOH) | |||||
#define EXTI_GPIOH 0x00000007u | |||||
#endif /* GPIOH */ | |||||
#if defined (GPIOI) | |||||
#define EXTI_GPIOI 0x00000008u | |||||
#endif /* GPIOI */ | |||||
#if defined (GPIOJ) | |||||
#define EXTI_GPIOJ 0x00000009u | |||||
#endif /* GPIOJ */ | |||||
#if defined (GPIOK) | |||||
#define EXTI_GPIOK 0x0000000Au | |||||
#endif /* GPIOK */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
/** @defgroup EXTI_Exported_Macros EXTI Exported Macros | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private constants --------------------------------------------------------*/ | |||||
/** @defgroup EXTI_Private_Constants EXTI Private Constants | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief EXTI Line property definition | |||||
*/ | |||||
#define EXTI_PROPERTY_SHIFT 24u | |||||
#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) | |||||
#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) | |||||
#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) | |||||
#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) | |||||
/** | |||||
* @brief EXTI bit usage | |||||
*/ | |||||
#define EXTI_PIN_MASK 0x0000001Fu | |||||
/** | |||||
* @brief EXTI Mask for interrupt & event mode | |||||
*/ | |||||
#define EXTI_MODE_MASK (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT) | |||||
/** | |||||
* @brief EXTI Mask for trigger possibilities | |||||
*/ | |||||
#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) | |||||
/** | |||||
* @brief EXTI Line number | |||||
*/ | |||||
#if defined(EXTI_IMR_IM23) | |||||
#define EXTI_LINE_NB 24UL | |||||
#else | |||||
#define EXTI_LINE_NB 23UL | |||||
#endif /* EXTI_IMR_IM23 */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/** @defgroup EXTI_Private_Macros EXTI Private Macros | |||||
* @{ | |||||
*/ | |||||
#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ | |||||
((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ | |||||
(((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ | |||||
(((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) | |||||
#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ | |||||
(((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) | |||||
#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) | |||||
#define IS_EXTI_PENDING_EDGE(__LINE__) ((__LINE__) == EXTI_TRIGGER_RISING_FALLING) | |||||
#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) | |||||
#if !defined (GPIOD) | |||||
#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ | |||||
((__PORT__) == EXTI_GPIOB) || \ | |||||
((__PORT__) == EXTI_GPIOC) || \ | |||||
((__PORT__) == EXTI_GPIOH)) | |||||
#elif !defined (GPIOE) | |||||
#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ | |||||
((__PORT__) == EXTI_GPIOB) || \ | |||||
((__PORT__) == EXTI_GPIOC) || \ | |||||
((__PORT__) == EXTI_GPIOD) || \ | |||||
((__PORT__) == EXTI_GPIOH)) | |||||
#elif !defined (GPIOF) | |||||
#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ | |||||
((__PORT__) == EXTI_GPIOB) || \ | |||||
((__PORT__) == EXTI_GPIOC) || \ | |||||
((__PORT__) == EXTI_GPIOD) || \ | |||||
((__PORT__) == EXTI_GPIOE) || \ | |||||
((__PORT__) == EXTI_GPIOH)) | |||||
#elif !defined (GPIOI) | |||||
#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ | |||||
((__PORT__) == EXTI_GPIOB) || \ | |||||
((__PORT__) == EXTI_GPIOC) || \ | |||||
((__PORT__) == EXTI_GPIOD) || \ | |||||
((__PORT__) == EXTI_GPIOE) || \ | |||||
((__PORT__) == EXTI_GPIOF) || \ | |||||
((__PORT__) == EXTI_GPIOG) || \ | |||||
((__PORT__) == EXTI_GPIOH)) | |||||
#elif !defined (GPIOJ) | |||||
#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ | |||||
((__PORT__) == EXTI_GPIOB) || \ | |||||
((__PORT__) == EXTI_GPIOC) || \ | |||||
((__PORT__) == EXTI_GPIOD) || \ | |||||
((__PORT__) == EXTI_GPIOE) || \ | |||||
((__PORT__) == EXTI_GPIOF) || \ | |||||
((__PORT__) == EXTI_GPIOG) || \ | |||||
((__PORT__) == EXTI_GPIOH) || \ | |||||
((__PORT__) == EXTI_GPIOI)) | |||||
#else | |||||
#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ | |||||
((__PORT__) == EXTI_GPIOB) || \ | |||||
((__PORT__) == EXTI_GPIOC) || \ | |||||
((__PORT__) == EXTI_GPIOD) || \ | |||||
((__PORT__) == EXTI_GPIOE) || \ | |||||
((__PORT__) == EXTI_GPIOF) || \ | |||||
((__PORT__) == EXTI_GPIOG) || \ | |||||
((__PORT__) == EXTI_GPIOH) || \ | |||||
((__PORT__) == EXTI_GPIOI) || \ | |||||
((__PORT__) == EXTI_GPIOJ) || \ | |||||
((__PORT__) == EXTI_GPIOK)) | |||||
#endif /* GPIOD */ | |||||
#define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @defgroup EXTI_Exported_Functions EXTI Exported Functions | |||||
* @brief EXTI Exported Functions | |||||
* @{ | |||||
*/ | |||||
/** @defgroup EXTI_Exported_Functions_Group1 Configuration functions | |||||
* @brief Configuration functions | |||||
* @{ | |||||
*/ | |||||
/* Configuration functions ****************************************************/ | |||||
HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); | |||||
HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); | |||||
HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti); | |||||
HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)); | |||||
HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup EXTI_Exported_Functions_Group2 IO operation functions | |||||
* @brief IO operation functions | |||||
* @{ | |||||
*/ | |||||
/* IO operation functions *****************************************************/ | |||||
void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti); | |||||
uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); | |||||
void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); | |||||
void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* STM32f4xx_HAL_EXTI_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_flash.h | |||||
* @author MCD Application Team | |||||
* @brief Header file of FLASH HAL module. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_HAL_FLASH_H | |||||
#define __STM32F4xx_HAL_FLASH_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_def.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup FLASH | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/** @defgroup FLASH_Exported_Types FLASH Exported Types | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief FLASH Procedure structure definition | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
FLASH_PROC_NONE = 0U, | |||||
FLASH_PROC_SECTERASE, | |||||
FLASH_PROC_MASSERASE, | |||||
FLASH_PROC_PROGRAM | |||||
} FLASH_ProcedureTypeDef; | |||||
/** | |||||
* @brief FLASH handle Structure definition | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
__IO FLASH_ProcedureTypeDef ProcedureOnGoing; /*Internal variable to indicate which procedure is ongoing or not in IT context*/ | |||||
__IO uint32_t NbSectorsToErase; /*Internal variable to save the remaining sectors to erase in IT context*/ | |||||
__IO uint8_t VoltageForErase; /*Internal variable to provide voltage range selected by user in IT context*/ | |||||
__IO uint32_t Sector; /*Internal variable to define the current sector which is erasing*/ | |||||
__IO uint32_t Bank; /*Internal variable to save current bank selected during mass erase*/ | |||||
__IO uint32_t Address; /*Internal variable to save address selected for program*/ | |||||
HAL_LockTypeDef Lock; /* FLASH locking object */ | |||||
__IO uint32_t ErrorCode; /* FLASH error code */ | |||||
}FLASH_ProcessTypeDef; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/** @defgroup FLASH_Exported_Constants FLASH Exported Constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup FLASH_Error_Code FLASH Error Code | |||||
* @brief FLASH Error Code | |||||
* @{ | |||||
*/ | |||||
#define HAL_FLASH_ERROR_NONE 0x00000000U /*!< No error */ | |||||
#define HAL_FLASH_ERROR_RD 0x00000001U /*!< Read Protection error */ | |||||
#define HAL_FLASH_ERROR_PGS 0x00000002U /*!< Programming Sequence error */ | |||||
#define HAL_FLASH_ERROR_PGP 0x00000004U /*!< Programming Parallelism error */ | |||||
#define HAL_FLASH_ERROR_PGA 0x00000008U /*!< Programming Alignment error */ | |||||
#define HAL_FLASH_ERROR_WRP 0x00000010U /*!< Write protection error */ | |||||
#define HAL_FLASH_ERROR_OPERATION 0x00000020U /*!< Operation Error */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup FLASH_Type_Program FLASH Type Program | |||||
* @{ | |||||
*/ | |||||
#define FLASH_TYPEPROGRAM_BYTE 0x00000000U /*!< Program byte (8-bit) at a specified address */ | |||||
#define FLASH_TYPEPROGRAM_HALFWORD 0x00000001U /*!< Program a half-word (16-bit) at a specified address */ | |||||
#define FLASH_TYPEPROGRAM_WORD 0x00000002U /*!< Program a word (32-bit) at a specified address */ | |||||
#define FLASH_TYPEPROGRAM_DOUBLEWORD 0x00000003U /*!< Program a double word (64-bit) at a specified address */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup FLASH_Flag_definition FLASH Flag definition | |||||
* @brief Flag definition | |||||
* @{ | |||||
*/ | |||||
#define FLASH_FLAG_EOP FLASH_SR_EOP /*!< FLASH End of Operation flag */ | |||||
#define FLASH_FLAG_OPERR FLASH_SR_SOP /*!< FLASH operation Error flag */ | |||||
#define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /*!< FLASH Write protected error flag */ | |||||
#define FLASH_FLAG_PGAERR FLASH_SR_PGAERR /*!< FLASH Programming Alignment error flag */ | |||||
#define FLASH_FLAG_PGPERR FLASH_SR_PGPERR /*!< FLASH Programming Parallelism error flag */ | |||||
#define FLASH_FLAG_PGSERR FLASH_SR_PGSERR /*!< FLASH Programming Sequence error flag */ | |||||
#if defined(FLASH_SR_RDERR) | |||||
#define FLASH_FLAG_RDERR FLASH_SR_RDERR /*!< Read Protection error flag (PCROP) */ | |||||
#endif /* FLASH_SR_RDERR */ | |||||
#define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup FLASH_Interrupt_definition FLASH Interrupt definition | |||||
* @brief FLASH Interrupt definition | |||||
* @{ | |||||
*/ | |||||
#define FLASH_IT_EOP FLASH_CR_EOPIE /*!< End of FLASH Operation Interrupt source */ | |||||
#define FLASH_IT_ERR 0x02000000U /*!< Error Interrupt source */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup FLASH_Program_Parallelism FLASH Program Parallelism | |||||
* @{ | |||||
*/ | |||||
#define FLASH_PSIZE_BYTE 0x00000000U | |||||
#define FLASH_PSIZE_HALF_WORD 0x00000100U | |||||
#define FLASH_PSIZE_WORD 0x00000200U | |||||
#define FLASH_PSIZE_DOUBLE_WORD 0x00000300U | |||||
#define CR_PSIZE_MASK 0xFFFFFCFFU | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup FLASH_Keys FLASH Keys | |||||
* @{ | |||||
*/ | |||||
#define RDP_KEY ((uint16_t)0x00A5) | |||||
#define FLASH_KEY1 0x45670123U | |||||
#define FLASH_KEY2 0xCDEF89ABU | |||||
#define FLASH_OPT_KEY1 0x08192A3BU | |||||
#define FLASH_OPT_KEY2 0x4C5D6E7FU | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
/** @defgroup FLASH_Exported_Macros FLASH Exported Macros | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Set the FLASH Latency. | |||||
* @param __LATENCY__ FLASH Latency | |||||
* The value of this parameter depend on device used within the same series | |||||
* @retval none | |||||
*/ | |||||
#define __HAL_FLASH_SET_LATENCY(__LATENCY__) (*(__IO uint8_t *)ACR_BYTE0_ADDRESS = (uint8_t)(__LATENCY__)) | |||||
/** | |||||
* @brief Get the FLASH Latency. | |||||
* @retval FLASH Latency | |||||
* The value of this parameter depend on device used within the same series | |||||
*/ | |||||
#define __HAL_FLASH_GET_LATENCY() (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)) | |||||
/** | |||||
* @brief Enable the FLASH prefetch buffer. | |||||
* @retval none | |||||
*/ | |||||
#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE() (FLASH->ACR |= FLASH_ACR_PRFTEN) | |||||
/** | |||||
* @brief Disable the FLASH prefetch buffer. | |||||
* @retval none | |||||
*/ | |||||
#define __HAL_FLASH_PREFETCH_BUFFER_DISABLE() (FLASH->ACR &= (~FLASH_ACR_PRFTEN)) | |||||
/** | |||||
* @brief Enable the FLASH instruction cache. | |||||
* @retval none | |||||
*/ | |||||
#define __HAL_FLASH_INSTRUCTION_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_ICEN) | |||||
/** | |||||
* @brief Disable the FLASH instruction cache. | |||||
* @retval none | |||||
*/ | |||||
#define __HAL_FLASH_INSTRUCTION_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_ICEN)) | |||||
/** | |||||
* @brief Enable the FLASH data cache. | |||||
* @retval none | |||||
*/ | |||||
#define __HAL_FLASH_DATA_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_DCEN) | |||||
/** | |||||
* @brief Disable the FLASH data cache. | |||||
* @retval none | |||||
*/ | |||||
#define __HAL_FLASH_DATA_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_DCEN)) | |||||
/** | |||||
* @brief Resets the FLASH instruction Cache. | |||||
* @note This function must be used only when the Instruction Cache is disabled. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_FLASH_INSTRUCTION_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_ICRST; \ | |||||
FLASH->ACR &= ~FLASH_ACR_ICRST; \ | |||||
}while(0U) | |||||
/** | |||||
* @brief Resets the FLASH data Cache. | |||||
* @note This function must be used only when the data Cache is disabled. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_FLASH_DATA_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_DCRST; \ | |||||
FLASH->ACR &= ~FLASH_ACR_DCRST; \ | |||||
}while(0U) | |||||
/** | |||||
* @brief Enable the specified FLASH interrupt. | |||||
* @param __INTERRUPT__ FLASH interrupt | |||||
* This parameter can be any combination of the following values: | |||||
* @arg FLASH_IT_EOP: End of FLASH Operation Interrupt | |||||
* @arg FLASH_IT_ERR: Error Interrupt | |||||
* @retval none | |||||
*/ | |||||
#define __HAL_FLASH_ENABLE_IT(__INTERRUPT__) (FLASH->CR |= (__INTERRUPT__)) | |||||
/** | |||||
* @brief Disable the specified FLASH interrupt. | |||||
* @param __INTERRUPT__ FLASH interrupt | |||||
* This parameter can be any combination of the following values: | |||||
* @arg FLASH_IT_EOP: End of FLASH Operation Interrupt | |||||
* @arg FLASH_IT_ERR: Error Interrupt | |||||
* @retval none | |||||
*/ | |||||
#define __HAL_FLASH_DISABLE_IT(__INTERRUPT__) (FLASH->CR &= ~(uint32_t)(__INTERRUPT__)) | |||||
/** | |||||
* @brief Get the specified FLASH flag status. | |||||
* @param __FLAG__ specifies the FLASH flags to check. | |||||
* This parameter can be any combination of the following values: | |||||
* @arg FLASH_FLAG_EOP : FLASH End of Operation flag | |||||
* @arg FLASH_FLAG_OPERR : FLASH operation Error flag | |||||
* @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag | |||||
* @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag | |||||
* @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag | |||||
* @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag | |||||
* @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) | |||||
* @arg FLASH_FLAG_BSY : FLASH Busy flag | |||||
* (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices | |||||
* @retval The new state of __FLAG__ (SET or RESET). | |||||
*/ | |||||
#define __HAL_FLASH_GET_FLAG(__FLAG__) ((FLASH->SR & (__FLAG__))) | |||||
/** | |||||
* @brief Clear the specified FLASH flags. | |||||
* @param __FLAG__ specifies the FLASH flags to clear. | |||||
* This parameter can be any combination of the following values: | |||||
* @arg FLASH_FLAG_EOP : FLASH End of Operation flag | |||||
* @arg FLASH_FLAG_OPERR : FLASH operation Error flag | |||||
* @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag | |||||
* @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag | |||||
* @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag | |||||
* @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag | |||||
* @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) | |||||
* (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices | |||||
* @retval none | |||||
*/ | |||||
#define __HAL_FLASH_CLEAR_FLAG(__FLAG__) (FLASH->SR = (__FLAG__)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Include FLASH HAL Extension module */ | |||||
#include "stm32f4xx_hal_flash_ex.h" | |||||
#include "stm32f4xx_hal_flash_ramfunc.h" | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @addtogroup FLASH_Exported_Functions | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup FLASH_Exported_Functions_Group1 | |||||
* @{ | |||||
*/ | |||||
/* Program operation functions ***********************************************/ | |||||
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data); | |||||
HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data); | |||||
/* FLASH IRQ handler method */ | |||||
void HAL_FLASH_IRQHandler(void); | |||||
/* Callbacks in non blocking modes */ | |||||
void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue); | |||||
void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup FLASH_Exported_Functions_Group2 | |||||
* @{ | |||||
*/ | |||||
/* Peripheral Control functions **********************************************/ | |||||
HAL_StatusTypeDef HAL_FLASH_Unlock(void); | |||||
HAL_StatusTypeDef HAL_FLASH_Lock(void); | |||||
HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void); | |||||
HAL_StatusTypeDef HAL_FLASH_OB_Lock(void); | |||||
/* Option bytes control */ | |||||
HAL_StatusTypeDef HAL_FLASH_OB_Launch(void); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup FLASH_Exported_Functions_Group3 | |||||
* @{ | |||||
*/ | |||||
/* Peripheral State functions ************************************************/ | |||||
uint32_t HAL_FLASH_GetError(void); | |||||
HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private types -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/** @defgroup FLASH_Private_Variables FLASH Private Variables | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private constants ---------------------------------------------------------*/ | |||||
/** @defgroup FLASH_Private_Constants FLASH Private Constants | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief ACR register byte 0 (Bits[7:0]) base address | |||||
*/ | |||||
#define ACR_BYTE0_ADDRESS 0x40023C00U | |||||
/** | |||||
* @brief OPTCR register byte 0 (Bits[7:0]) base address | |||||
*/ | |||||
#define OPTCR_BYTE0_ADDRESS 0x40023C14U | |||||
/** | |||||
* @brief OPTCR register byte 1 (Bits[15:8]) base address | |||||
*/ | |||||
#define OPTCR_BYTE1_ADDRESS 0x40023C15U | |||||
/** | |||||
* @brief OPTCR register byte 2 (Bits[23:16]) base address | |||||
*/ | |||||
#define OPTCR_BYTE2_ADDRESS 0x40023C16U | |||||
/** | |||||
* @brief OPTCR register byte 3 (Bits[31:24]) base address | |||||
*/ | |||||
#define OPTCR_BYTE3_ADDRESS 0x40023C17U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/** @defgroup FLASH_Private_Macros FLASH Private Macros | |||||
* @{ | |||||
*/ | |||||
/** @defgroup FLASH_IS_FLASH_Definitions FLASH Private macros to check input parameters | |||||
* @{ | |||||
*/ | |||||
#define IS_FLASH_TYPEPROGRAM(VALUE)(((VALUE) == FLASH_TYPEPROGRAM_BYTE) || \ | |||||
((VALUE) == FLASH_TYPEPROGRAM_HALFWORD) || \ | |||||
((VALUE) == FLASH_TYPEPROGRAM_WORD) || \ | |||||
((VALUE) == FLASH_TYPEPROGRAM_DOUBLEWORD)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/** @defgroup FLASH_Private_Functions FLASH Private Functions | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32F4xx_HAL_FLASH_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_flash_ramfunc.h | |||||
* @author MCD Application Team | |||||
* @brief Header file of FLASH RAMFUNC driver. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_FLASH_RAMFUNC_H | |||||
#define __STM32F4xx_FLASH_RAMFUNC_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ | |||||
defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_def.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup FLASH_RAMFUNC | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @addtogroup FLASH_RAMFUNC_Exported_Functions | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup FLASH_RAMFUNC_Exported_Functions_Group1 | |||||
* @{ | |||||
*/ | |||||
__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void); | |||||
__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void); | |||||
__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void); | |||||
__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32F4xx_FLASH_RAMFUNC_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_gpio.h | |||||
* @author MCD Application Team | |||||
* @brief Header file of GPIO HAL module. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_HAL_GPIO_H | |||||
#define __STM32F4xx_HAL_GPIO_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_def.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup GPIO | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/** @defgroup GPIO_Exported_Types GPIO Exported Types | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief GPIO Init structure definition | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
uint32_t Pin; /*!< Specifies the GPIO pins to be configured. | |||||
This parameter can be any value of @ref GPIO_pins_define */ | |||||
uint32_t Mode; /*!< Specifies the operating mode for the selected pins. | |||||
This parameter can be a value of @ref GPIO_mode_define */ | |||||
uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. | |||||
This parameter can be a value of @ref GPIO_pull_define */ | |||||
uint32_t Speed; /*!< Specifies the speed for the selected pins. | |||||
This parameter can be a value of @ref GPIO_speed_define */ | |||||
uint32_t Alternate; /*!< Peripheral to be connected to the selected pins. | |||||
This parameter can be a value of @ref GPIO_Alternate_function_selection */ | |||||
}GPIO_InitTypeDef; | |||||
/** | |||||
* @brief GPIO Bit SET and Bit RESET enumeration | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
GPIO_PIN_RESET = 0, | |||||
GPIO_PIN_SET | |||||
}GPIO_PinState; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/** @defgroup GPIO_Exported_Constants GPIO Exported Constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup GPIO_pins_define GPIO pins define | |||||
* @{ | |||||
*/ | |||||
#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */ | |||||
#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */ | |||||
#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */ | |||||
#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */ | |||||
#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */ | |||||
#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */ | |||||
#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */ | |||||
#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */ | |||||
#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */ | |||||
#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */ | |||||
#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */ | |||||
#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */ | |||||
#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */ | |||||
#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */ | |||||
#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */ | |||||
#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */ | |||||
#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */ | |||||
#define GPIO_PIN_MASK 0x0000FFFFU /* PIN mask for assert test */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup GPIO_mode_define GPIO mode define | |||||
* @brief GPIO Configuration Mode | |||||
* Elements values convention: 0xX0yz00YZ | |||||
* - X : GPIO mode or EXTI Mode | |||||
* - y : External IT or Event trigger detection | |||||
* - z : IO configuration on External IT or Event | |||||
* - Y : Output type (Push Pull or Open Drain) | |||||
* - Z : IO Direction mode (Input, Output, Alternate or Analog) | |||||
* @{ | |||||
*/ | |||||
#define GPIO_MODE_INPUT 0x00000000U /*!< Input Floating Mode */ | |||||
#define GPIO_MODE_OUTPUT_PP 0x00000001U /*!< Output Push Pull Mode */ | |||||
#define GPIO_MODE_OUTPUT_OD 0x00000011U /*!< Output Open Drain Mode */ | |||||
#define GPIO_MODE_AF_PP 0x00000002U /*!< Alternate Function Push Pull Mode */ | |||||
#define GPIO_MODE_AF_OD 0x00000012U /*!< Alternate Function Open Drain Mode */ | |||||
#define GPIO_MODE_ANALOG 0x00000003U /*!< Analog Mode */ | |||||
#define GPIO_MODE_IT_RISING 0x10110000U /*!< External Interrupt Mode with Rising edge trigger detection */ | |||||
#define GPIO_MODE_IT_FALLING 0x10210000U /*!< External Interrupt Mode with Falling edge trigger detection */ | |||||
#define GPIO_MODE_IT_RISING_FALLING 0x10310000U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ | |||||
#define GPIO_MODE_EVT_RISING 0x10120000U /*!< External Event Mode with Rising edge trigger detection */ | |||||
#define GPIO_MODE_EVT_FALLING 0x10220000U /*!< External Event Mode with Falling edge trigger detection */ | |||||
#define GPIO_MODE_EVT_RISING_FALLING 0x10320000U /*!< External Event Mode with Rising/Falling edge trigger detection */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup GPIO_speed_define GPIO speed define | |||||
* @brief GPIO Output Maximum frequency | |||||
* @{ | |||||
*/ | |||||
#define GPIO_SPEED_FREQ_LOW 0x00000000U /*!< IO works at 2 MHz, please refer to the product datasheet */ | |||||
#define GPIO_SPEED_FREQ_MEDIUM 0x00000001U /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */ | |||||
#define GPIO_SPEED_FREQ_HIGH 0x00000002U /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */ | |||||
#define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup GPIO_pull_define GPIO pull define | |||||
* @brief GPIO Pull-Up or Pull-Down Activation | |||||
* @{ | |||||
*/ | |||||
#define GPIO_NOPULL 0x00000000U /*!< No Pull-up or Pull-down activation */ | |||||
#define GPIO_PULLUP 0x00000001U /*!< Pull-up activation */ | |||||
#define GPIO_PULLDOWN 0x00000002U /*!< Pull-down activation */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
/** @defgroup GPIO_Exported_Macros GPIO Exported Macros | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Checks whether the specified EXTI line flag is set or not. | |||||
* @param __EXTI_LINE__ specifies the EXTI line flag to check. | |||||
* This parameter can be GPIO_PIN_x where x can be(0..15) | |||||
* @retval The new state of __EXTI_LINE__ (SET or RESET). | |||||
*/ | |||||
#define __HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) | |||||
/** | |||||
* @brief Clears the EXTI's line pending flags. | |||||
* @param __EXTI_LINE__ specifies the EXTI lines flags to clear. | |||||
* This parameter can be any combination of GPIO_PIN_x where x can be (0..15) | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_GPIO_EXTI_CLEAR_FLAG(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) | |||||
/** | |||||
* @brief Checks whether the specified EXTI line is asserted or not. | |||||
* @param __EXTI_LINE__ specifies the EXTI line to check. | |||||
* This parameter can be GPIO_PIN_x where x can be(0..15) | |||||
* @retval The new state of __EXTI_LINE__ (SET or RESET). | |||||
*/ | |||||
#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) | |||||
/** | |||||
* @brief Clears the EXTI's line pending bits. | |||||
* @param __EXTI_LINE__ specifies the EXTI lines to clear. | |||||
* This parameter can be any combination of GPIO_PIN_x where x can be (0..15) | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) | |||||
/** | |||||
* @brief Generates a Software interrupt on selected EXTI line. | |||||
* @param __EXTI_LINE__ specifies the EXTI line to check. | |||||
* This parameter can be GPIO_PIN_x where x can be(0..15) | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__) (EXTI->SWIER |= (__EXTI_LINE__)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Include GPIO HAL Extension module */ | |||||
#include "stm32f4xx_hal_gpio_ex.h" | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @addtogroup GPIO_Exported_Functions | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup GPIO_Exported_Functions_Group1 | |||||
* @{ | |||||
*/ | |||||
/* Initialization and de-initialization functions *****************************/ | |||||
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); | |||||
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup GPIO_Exported_Functions_Group2 | |||||
* @{ | |||||
*/ | |||||
/* IO operation functions *****************************************************/ | |||||
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); | |||||
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); | |||||
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); | |||||
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); | |||||
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin); | |||||
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private types -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private constants ---------------------------------------------------------*/ | |||||
/** @defgroup GPIO_Private_Constants GPIO Private Constants | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/** @defgroup GPIO_Private_Macros GPIO Private Macros | |||||
* @{ | |||||
*/ | |||||
#define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) | |||||
#define IS_GPIO_PIN(PIN) (((((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00U) && ((((uint32_t)PIN) & ~GPIO_PIN_MASK) == 0x00U)) | |||||
#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ | |||||
((MODE) == GPIO_MODE_OUTPUT_PP) ||\ | |||||
((MODE) == GPIO_MODE_OUTPUT_OD) ||\ | |||||
((MODE) == GPIO_MODE_AF_PP) ||\ | |||||
((MODE) == GPIO_MODE_AF_OD) ||\ | |||||
((MODE) == GPIO_MODE_IT_RISING) ||\ | |||||
((MODE) == GPIO_MODE_IT_FALLING) ||\ | |||||
((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\ | |||||
((MODE) == GPIO_MODE_EVT_RISING) ||\ | |||||
((MODE) == GPIO_MODE_EVT_FALLING) ||\ | |||||
((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\ | |||||
((MODE) == GPIO_MODE_ANALOG)) | |||||
#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \ | |||||
((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH)) | |||||
#define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \ | |||||
((PULL) == GPIO_PULLDOWN)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/** @defgroup GPIO_Private_Functions GPIO Private Functions | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32F4xx_HAL_GPIO_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_pwr.h | |||||
* @author MCD Application Team | |||||
* @brief Header file of PWR HAL module. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_HAL_PWR_H | |||||
#define __STM32F4xx_HAL_PWR_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_def.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup PWR | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/** @defgroup PWR_Exported_Types PWR Exported Types | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief PWR PVD configuration structure definition | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
uint32_t PVDLevel; /*!< PVDLevel: Specifies the PVD detection level. | |||||
This parameter can be a value of @ref PWR_PVD_detection_level */ | |||||
uint32_t Mode; /*!< Mode: Specifies the operating mode for the selected pins. | |||||
This parameter can be a value of @ref PWR_PVD_Mode */ | |||||
}PWR_PVDTypeDef; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/** @defgroup PWR_Exported_Constants PWR Exported Constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins | |||||
* @{ | |||||
*/ | |||||
#define PWR_WAKEUP_PIN1 0x00000100U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PWR_PVD_detection_level PWR PVD detection level | |||||
* @{ | |||||
*/ | |||||
#define PWR_PVDLEVEL_0 PWR_CR_PLS_LEV0 | |||||
#define PWR_PVDLEVEL_1 PWR_CR_PLS_LEV1 | |||||
#define PWR_PVDLEVEL_2 PWR_CR_PLS_LEV2 | |||||
#define PWR_PVDLEVEL_3 PWR_CR_PLS_LEV3 | |||||
#define PWR_PVDLEVEL_4 PWR_CR_PLS_LEV4 | |||||
#define PWR_PVDLEVEL_5 PWR_CR_PLS_LEV5 | |||||
#define PWR_PVDLEVEL_6 PWR_CR_PLS_LEV6 | |||||
#define PWR_PVDLEVEL_7 PWR_CR_PLS_LEV7/* External input analog voltage | |||||
(Compare internally to VREFINT) */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PWR_PVD_Mode PWR PVD Mode | |||||
* @{ | |||||
*/ | |||||
#define PWR_PVD_MODE_NORMAL 0x00000000U /*!< basic mode is used */ | |||||
#define PWR_PVD_MODE_IT_RISING 0x00010001U /*!< External Interrupt Mode with Rising edge trigger detection */ | |||||
#define PWR_PVD_MODE_IT_FALLING 0x00010002U /*!< External Interrupt Mode with Falling edge trigger detection */ | |||||
#define PWR_PVD_MODE_IT_RISING_FALLING 0x00010003U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ | |||||
#define PWR_PVD_MODE_EVENT_RISING 0x00020001U /*!< Event Mode with Rising edge trigger detection */ | |||||
#define PWR_PVD_MODE_EVENT_FALLING 0x00020002U /*!< Event Mode with Falling edge trigger detection */ | |||||
#define PWR_PVD_MODE_EVENT_RISING_FALLING 0x00020003U /*!< Event Mode with Rising/Falling edge trigger detection */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PWR_Regulator_state_in_STOP_mode PWR Regulator state in SLEEP/STOP mode | |||||
* @{ | |||||
*/ | |||||
#define PWR_MAINREGULATOR_ON 0x00000000U | |||||
#define PWR_LOWPOWERREGULATOR_ON PWR_CR_LPDS | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PWR_SLEEP_mode_entry PWR SLEEP mode entry | |||||
* @{ | |||||
*/ | |||||
#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01) | |||||
#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PWR_STOP_mode_entry PWR STOP mode entry | |||||
* @{ | |||||
*/ | |||||
#define PWR_STOPENTRY_WFI ((uint8_t)0x01) | |||||
#define PWR_STOPENTRY_WFE ((uint8_t)0x02) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PWR_Flag PWR Flag | |||||
* @{ | |||||
*/ | |||||
#define PWR_FLAG_WU PWR_CSR_WUF | |||||
#define PWR_FLAG_SB PWR_CSR_SBF | |||||
#define PWR_FLAG_PVDO PWR_CSR_PVDO | |||||
#define PWR_FLAG_BRR PWR_CSR_BRR | |||||
#define PWR_FLAG_VOSRDY PWR_CSR_VOSRDY | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
/** @defgroup PWR_Exported_Macro PWR Exported Macro | |||||
* @{ | |||||
*/ | |||||
/** @brief Check PWR flag is set or not. | |||||
* @param __FLAG__ specifies the flag to check. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup event | |||||
* was received from the WKUP pin or from the RTC alarm (Alarm A | |||||
* or Alarm B), RTC Tamper event, RTC TimeStamp event or RTC Wakeup. | |||||
* An additional wakeup event is detected if the WKUP pin is enabled | |||||
* (by setting the EWUP bit) when the WKUP pin level is already high. | |||||
* @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the system was | |||||
* resumed from StandBy mode. | |||||
* @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD is enabled | |||||
* by the HAL_PWR_EnablePVD() function. The PVD is stopped by Standby mode | |||||
* For this reason, this bit is equal to 0 after Standby or reset | |||||
* until the PVDE bit is set. | |||||
* @arg PWR_FLAG_BRR: Backup regulator ready flag. This bit is not reset | |||||
* when the device wakes up from Standby mode or by a system reset | |||||
* or power reset. | |||||
* @arg PWR_FLAG_VOSRDY: This flag indicates that the Regulator voltage | |||||
* scaling output selection is ready. | |||||
* @retval The new state of __FLAG__ (TRUE or FALSE). | |||||
*/ | |||||
#define __HAL_PWR_GET_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) | |||||
/** @brief Clear the PWR's pending flags. | |||||
* @param __FLAG__ specifies the flag to clear. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_FLAG_WU: Wake Up flag | |||||
* @arg PWR_FLAG_SB: StandBy flag | |||||
*/ | |||||
#define __HAL_PWR_CLEAR_FLAG(__FLAG__) (PWR->CR |= (__FLAG__) << 2U) | |||||
/** | |||||
* @brief Enable the PVD Exti Line 16. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_ENABLE_IT() (EXTI->IMR |= (PWR_EXTI_LINE_PVD)) | |||||
/** | |||||
* @brief Disable the PVD EXTI Line 16. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_DISABLE_IT() (EXTI->IMR &= ~(PWR_EXTI_LINE_PVD)) | |||||
/** | |||||
* @brief Enable event on PVD Exti Line 16. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_ENABLE_EVENT() (EXTI->EMR |= (PWR_EXTI_LINE_PVD)) | |||||
/** | |||||
* @brief Disable event on PVD Exti Line 16. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_DISABLE_EVENT() (EXTI->EMR &= ~(PWR_EXTI_LINE_PVD)) | |||||
/** | |||||
* @brief Enable the PVD Extended Interrupt Rising Trigger. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE() SET_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) | |||||
/** | |||||
* @brief Disable the PVD Extended Interrupt Rising Trigger. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE() CLEAR_BIT(EXTI->RTSR, PWR_EXTI_LINE_PVD) | |||||
/** | |||||
* @brief Enable the PVD Extended Interrupt Falling Trigger. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE() SET_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) | |||||
/** | |||||
* @brief Disable the PVD Extended Interrupt Falling Trigger. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE() CLEAR_BIT(EXTI->FTSR, PWR_EXTI_LINE_PVD) | |||||
/** | |||||
* @brief PVD EXTI line configuration: set rising & falling edge trigger. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();\ | |||||
__HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE();\ | |||||
}while(0U) | |||||
/** | |||||
* @brief Disable the PVD Extended Interrupt Rising & Falling Trigger. | |||||
* This parameter can be: | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE() do{__HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();\ | |||||
__HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE();\ | |||||
}while(0U) | |||||
/** | |||||
* @brief checks whether the specified PVD Exti interrupt flag is set or not. | |||||
* @retval EXTI PVD Line Status. | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_GET_FLAG() (EXTI->PR & (PWR_EXTI_LINE_PVD)) | |||||
/** | |||||
* @brief Clear the PVD Exti flag. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_CLEAR_FLAG() (EXTI->PR = (PWR_EXTI_LINE_PVD)) | |||||
/** | |||||
* @brief Generates a Software interrupt on PVD EXTI line. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_PWR_PVD_EXTI_GENERATE_SWIT() (EXTI->SWIER |= (PWR_EXTI_LINE_PVD)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Include PWR HAL Extension module */ | |||||
#include "stm32f4xx_hal_pwr_ex.h" | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @addtogroup PWR_Exported_Functions PWR Exported Functions | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions | |||||
* @{ | |||||
*/ | |||||
/* Initialization and de-initialization functions *****************************/ | |||||
void HAL_PWR_DeInit(void); | |||||
void HAL_PWR_EnableBkUpAccess(void); | |||||
void HAL_PWR_DisableBkUpAccess(void); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup PWR_Exported_Functions_Group2 Peripheral Control functions | |||||
* @{ | |||||
*/ | |||||
/* Peripheral Control functions **********************************************/ | |||||
/* PVD configuration */ | |||||
void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD); | |||||
void HAL_PWR_EnablePVD(void); | |||||
void HAL_PWR_DisablePVD(void); | |||||
/* WakeUp pins configuration */ | |||||
void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx); | |||||
void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx); | |||||
/* Low Power modes entry */ | |||||
void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry); | |||||
void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry); | |||||
void HAL_PWR_EnterSTANDBYMode(void); | |||||
/* Power PVD IRQ Handler */ | |||||
void HAL_PWR_PVD_IRQHandler(void); | |||||
void HAL_PWR_PVDCallback(void); | |||||
/* Cortex System Control functions *******************************************/ | |||||
void HAL_PWR_EnableSleepOnExit(void); | |||||
void HAL_PWR_DisableSleepOnExit(void); | |||||
void HAL_PWR_EnableSEVOnPend(void); | |||||
void HAL_PWR_DisableSEVOnPend(void); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private types -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private constants ---------------------------------------------------------*/ | |||||
/** @defgroup PWR_Private_Constants PWR Private Constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup PWR_PVD_EXTI_Line PWR PVD EXTI Line | |||||
* @{ | |||||
*/ | |||||
#define PWR_EXTI_LINE_PVD ((uint32_t)EXTI_IMR_MR16) /*!< External interrupt line 16 Connected to the PVD EXTI Line */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PWR_register_alias_address PWR Register alias address | |||||
* @{ | |||||
*/ | |||||
/* ------------- PWR registers bit address in the alias region ---------------*/ | |||||
#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) | |||||
#define PWR_CR_OFFSET 0x00U | |||||
#define PWR_CSR_OFFSET 0x04U | |||||
#define PWR_CR_OFFSET_BB (PWR_OFFSET + PWR_CR_OFFSET) | |||||
#define PWR_CSR_OFFSET_BB (PWR_OFFSET + PWR_CSR_OFFSET) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PWR_CR_register_alias PWR CR Register alias address | |||||
* @{ | |||||
*/ | |||||
/* --- CR Register ---*/ | |||||
/* Alias word address of DBP bit */ | |||||
#define DBP_BIT_NUMBER PWR_CR_DBP_Pos | |||||
#define CR_DBP_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (DBP_BIT_NUMBER * 4U)) | |||||
/* Alias word address of PVDE bit */ | |||||
#define PVDE_BIT_NUMBER PWR_CR_PVDE_Pos | |||||
#define CR_PVDE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (PVDE_BIT_NUMBER * 4U)) | |||||
/* Alias word address of VOS bit */ | |||||
#define VOS_BIT_NUMBER PWR_CR_VOS_Pos | |||||
#define CR_VOS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (VOS_BIT_NUMBER * 4U)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PWR_CSR_register_alias PWR CSR Register alias address | |||||
* @{ | |||||
*/ | |||||
/* --- CSR Register ---*/ | |||||
/* Alias word address of EWUP bit */ | |||||
#define EWUP_BIT_NUMBER PWR_CSR_EWUP_Pos | |||||
#define CSR_EWUP_BB (PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (EWUP_BIT_NUMBER * 4U)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/** @defgroup PWR_Private_Macros PWR Private Macros | |||||
* @{ | |||||
*/ | |||||
/** @defgroup PWR_IS_PWR_Definitions PWR Private macros to check input parameters | |||||
* @{ | |||||
*/ | |||||
#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLEVEL_0) || ((LEVEL) == PWR_PVDLEVEL_1)|| \ | |||||
((LEVEL) == PWR_PVDLEVEL_2) || ((LEVEL) == PWR_PVDLEVEL_3)|| \ | |||||
((LEVEL) == PWR_PVDLEVEL_4) || ((LEVEL) == PWR_PVDLEVEL_5)|| \ | |||||
((LEVEL) == PWR_PVDLEVEL_6) || ((LEVEL) == PWR_PVDLEVEL_7)) | |||||
#define IS_PWR_PVD_MODE(MODE) (((MODE) == PWR_PVD_MODE_IT_RISING)|| ((MODE) == PWR_PVD_MODE_IT_FALLING) || \ | |||||
((MODE) == PWR_PVD_MODE_IT_RISING_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING) || \ | |||||
((MODE) == PWR_PVD_MODE_EVENT_FALLING) || ((MODE) == PWR_PVD_MODE_EVENT_RISING_FALLING) || \ | |||||
((MODE) == PWR_PVD_MODE_NORMAL)) | |||||
#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_ON) || \ | |||||
((REGULATOR) == PWR_LOWPOWERREGULATOR_ON)) | |||||
#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPENTRY_WFI) || ((ENTRY) == PWR_SLEEPENTRY_WFE)) | |||||
#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPENTRY_WFI) || ((ENTRY) == PWR_STOPENTRY_WFE)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32F4xx_HAL_PWR_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_pwr_ex.h | |||||
* @author MCD Application Team | |||||
* @brief Header file of PWR HAL Extension module. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_HAL_PWR_EX_H | |||||
#define __STM32F4xx_HAL_PWR_EX_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_def.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup PWREx | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/** @defgroup PWREx_Exported_Constants PWREx Exported Constants | |||||
* @{ | |||||
*/ | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ | |||||
defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) | |||||
/** @defgroup PWREx_Regulator_state_in_UnderDrive_mode PWREx Regulator state in UnderDrive mode | |||||
* @{ | |||||
*/ | |||||
#define PWR_MAINREGULATOR_UNDERDRIVE_ON PWR_CR_MRUDS | |||||
#define PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON ((uint32_t)(PWR_CR_LPDS | PWR_CR_LPUDS)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PWREx_Over_Under_Drive_Flag PWREx Over Under Drive Flag | |||||
* @{ | |||||
*/ | |||||
#define PWR_FLAG_ODRDY PWR_CSR_ODRDY | |||||
#define PWR_FLAG_ODSWRDY PWR_CSR_ODSWRDY | |||||
#define PWR_FLAG_UDRDY PWR_CSR_UDSWRDY | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ | |||||
/** @defgroup PWREx_Regulator_Voltage_Scale PWREx Regulator Voltage Scale | |||||
* @{ | |||||
*/ | |||||
#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) | |||||
#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK = 168 MHz. */ | |||||
#define PWR_REGULATOR_VOLTAGE_SCALE2 0x00000000U /* Scale 2 mode: the maximum value of fHCLK = 144 MHz. */ | |||||
#else | |||||
#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK is 168 MHz. It can be extended to | |||||
180 MHz by activating the over-drive mode. */ | |||||
#define PWR_REGULATOR_VOLTAGE_SCALE2 PWR_CR_VOS_1 /* Scale 2 mode: the maximum value of fHCLK is 144 MHz. It can be extended to | |||||
168 MHz by activating the over-drive mode. */ | |||||
#define PWR_REGULATOR_VOLTAGE_SCALE3 PWR_CR_VOS_0 /* Scale 3 mode: the maximum value of fHCLK is 120 MHz. */ | |||||
#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ | |||||
defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) | |||||
/** @defgroup PWREx_WakeUp_Pins PWREx WakeUp Pins | |||||
* @{ | |||||
*/ | |||||
#define PWR_WAKEUP_PIN2 0x00000080U | |||||
#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ | |||||
defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) | |||||
#define PWR_WAKEUP_PIN3 0x00000040U | |||||
#endif /* STM32F410xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Zx || STM32F412Vx || \ | |||||
STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* STM32F410xx || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || | |||||
STM32F413xx || STM32F423xx */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
/** @defgroup PWREx_Exported_Constants PWREx Exported Constants | |||||
* @{ | |||||
*/ | |||||
#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) | |||||
/** @brief macros configure the main internal regulator output voltage. | |||||
* @param __REGULATOR__ specifies the regulator output voltage to achieve | |||||
* a tradeoff between performance and power consumption when the device does | |||||
* not operate at the maximum frequency (refer to the datasheets for more details). | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode | |||||
* @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ | |||||
__IO uint32_t tmpreg = 0x00U; \ | |||||
MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ | |||||
/* Delay after an RCC peripheral clock enabling */ \ | |||||
tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ | |||||
UNUSED(tmpreg); \ | |||||
} while(0U) | |||||
#else | |||||
/** @brief macros configure the main internal regulator output voltage. | |||||
* @param __REGULATOR__ specifies the regulator output voltage to achieve | |||||
* a tradeoff between performance and power consumption when the device does | |||||
* not operate at the maximum frequency (refer to the datasheets for more details). | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode | |||||
* @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode | |||||
* @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ | |||||
__IO uint32_t tmpreg = 0x00U; \ | |||||
MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ | |||||
/* Delay after an RCC peripheral clock enabling */ \ | |||||
tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ | |||||
UNUSED(tmpreg); \ | |||||
} while(0U) | |||||
#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ | |||||
defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) | |||||
/** @brief Macros to enable or disable the Over drive mode. | |||||
* @note These macros can be used only for STM32F42xx/STM3243xx devices. | |||||
*/ | |||||
#define __HAL_PWR_OVERDRIVE_ENABLE() (*(__IO uint32_t *) CR_ODEN_BB = ENABLE) | |||||
#define __HAL_PWR_OVERDRIVE_DISABLE() (*(__IO uint32_t *) CR_ODEN_BB = DISABLE) | |||||
/** @brief Macros to enable or disable the Over drive switching. | |||||
* @note These macros can be used only for STM32F42xx/STM3243xx devices. | |||||
*/ | |||||
#define __HAL_PWR_OVERDRIVESWITCHING_ENABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = ENABLE) | |||||
#define __HAL_PWR_OVERDRIVESWITCHING_DISABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = DISABLE) | |||||
/** @brief Macros to enable or disable the Under drive mode. | |||||
* @note This mode is enabled only with STOP low power mode. | |||||
* In this mode, the 1.2V domain is preserved in reduced leakage mode. This | |||||
* mode is only available when the main regulator or the low power regulator | |||||
* is in low voltage mode. | |||||
* @note If the Under-drive mode was enabled, it is automatically disabled after | |||||
* exiting Stop mode. | |||||
* When the voltage regulator operates in Under-drive mode, an additional | |||||
* startup delay is induced when waking up from Stop mode. | |||||
*/ | |||||
#define __HAL_PWR_UNDERDRIVE_ENABLE() (PWR->CR |= (uint32_t)PWR_CR_UDEN) | |||||
#define __HAL_PWR_UNDERDRIVE_DISABLE() (PWR->CR &= (uint32_t)(~PWR_CR_UDEN)) | |||||
/** @brief Check PWR flag is set or not. | |||||
* @note These macros can be used only for STM32F42xx/STM3243xx devices. | |||||
* @param __FLAG__ specifies the flag to check. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_FLAG_ODRDY: This flag indicates that the Over-drive mode | |||||
* is ready | |||||
* @arg PWR_FLAG_ODSWRDY: This flag indicates that the Over-drive mode | |||||
* switching is ready | |||||
* @arg PWR_FLAG_UDRDY: This flag indicates that the Under-drive mode | |||||
* is enabled in Stop mode | |||||
* @retval The new state of __FLAG__ (TRUE or FALSE). | |||||
*/ | |||||
#define __HAL_PWR_GET_ODRUDR_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) | |||||
/** @brief Clear the Under-Drive Ready flag. | |||||
* @note These macros can be used only for STM32F42xx/STM3243xx devices. | |||||
*/ | |||||
#define __HAL_PWR_CLEAR_ODRUDR_FLAG() (PWR->CSR |= PWR_FLAG_UDRDY) | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @addtogroup PWREx_Exported_Functions PWREx Exported Functions | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup PWREx_Exported_Functions_Group1 | |||||
* @{ | |||||
*/ | |||||
void HAL_PWREx_EnableFlashPowerDown(void); | |||||
void HAL_PWREx_DisableFlashPowerDown(void); | |||||
HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void); | |||||
HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void); | |||||
uint32_t HAL_PWREx_GetVoltageRange(void); | |||||
HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling); | |||||
#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ | |||||
defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ | |||||
defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) | |||||
void HAL_PWREx_EnableMainRegulatorLowVoltage(void); | |||||
void HAL_PWREx_DisableMainRegulatorLowVoltage(void); | |||||
void HAL_PWREx_EnableLowRegulatorLowVoltage(void); | |||||
void HAL_PWREx_DisableLowRegulatorLowVoltage(void); | |||||
#endif /* STM32F410xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F412Zx || STM32F412Vx ||\ | |||||
STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ | |||||
defined(STM32F469xx) || defined(STM32F479xx) | |||||
HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void); | |||||
HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void); | |||||
HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry); | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private types -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private constants ---------------------------------------------------------*/ | |||||
/** @defgroup PWREx_Private_Constants PWREx Private Constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup PWREx_register_alias_address PWREx Register alias address | |||||
* @{ | |||||
*/ | |||||
/* ------------- PWR registers bit address in the alias region ---------------*/ | |||||
/* --- CR Register ---*/ | |||||
/* Alias word address of FPDS bit */ | |||||
#define FPDS_BIT_NUMBER PWR_CR_FPDS_Pos | |||||
#define CR_FPDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (FPDS_BIT_NUMBER * 4U)) | |||||
/* Alias word address of ODEN bit */ | |||||
#define ODEN_BIT_NUMBER PWR_CR_ODEN_Pos | |||||
#define CR_ODEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODEN_BIT_NUMBER * 4U)) | |||||
/* Alias word address of ODSWEN bit */ | |||||
#define ODSWEN_BIT_NUMBER PWR_CR_ODSWEN_Pos | |||||
#define CR_ODSWEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODSWEN_BIT_NUMBER * 4U)) | |||||
/* Alias word address of MRLVDS bit */ | |||||
#define MRLVDS_BIT_NUMBER PWR_CR_MRLVDS_Pos | |||||
#define CR_MRLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (MRLVDS_BIT_NUMBER * 4U)) | |||||
/* Alias word address of LPLVDS bit */ | |||||
#define LPLVDS_BIT_NUMBER PWR_CR_LPLVDS_Pos | |||||
#define CR_LPLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (LPLVDS_BIT_NUMBER * 4U)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PWREx_CSR_register_alias PWRx CSR Register alias address | |||||
* @{ | |||||
*/ | |||||
/* --- CSR Register ---*/ | |||||
/* Alias word address of BRE bit */ | |||||
#define BRE_BIT_NUMBER PWR_CSR_BRE_Pos | |||||
#define CSR_BRE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (BRE_BIT_NUMBER * 4U)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/** @defgroup PWREx_Private_Macros PWREx Private Macros | |||||
* @{ | |||||
*/ | |||||
/** @defgroup PWREx_IS_PWR_Definitions PWREx Private macros to check input parameters | |||||
* @{ | |||||
*/ | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ | |||||
defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) | |||||
#define IS_PWR_REGULATOR_UNDERDRIVE(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_UNDERDRIVE_ON) || \ | |||||
((REGULATOR) == PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON)) | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ | |||||
#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) | |||||
#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ | |||||
((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2)) | |||||
#else | |||||
#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ | |||||
((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2) || \ | |||||
((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE3)) | |||||
#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ | |||||
#if defined(STM32F446xx) | |||||
#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2)) | |||||
#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) ||\ | |||||
defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ | |||||
defined(STM32F423xx) | |||||
#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2) || \ | |||||
((PIN) == PWR_WAKEUP_PIN3)) | |||||
#else | |||||
#define IS_PWR_WAKEUP_PIN(PIN) ((PIN) == PWR_WAKEUP_PIN1) | |||||
#endif /* STM32F446xx */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32F4xx_HAL_PWR_EX_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_rtc.h | |||||
* @author MCD Application Team | |||||
* @brief Header file of RTC HAL module. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_HAL_RTC_H | |||||
#define __STM32F4xx_HAL_RTC_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_def.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup RTC | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/** @defgroup RTC_Exported_Types RTC Exported Types | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief HAL State structures definition | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
HAL_RTC_STATE_RESET = 0x00U, /*!< RTC not yet initialized or disabled */ | |||||
HAL_RTC_STATE_READY = 0x01U, /*!< RTC initialized and ready for use */ | |||||
HAL_RTC_STATE_BUSY = 0x02U, /*!< RTC process is ongoing */ | |||||
HAL_RTC_STATE_TIMEOUT = 0x03U, /*!< RTC timeout state */ | |||||
HAL_RTC_STATE_ERROR = 0x04U /*!< RTC error state */ | |||||
}HAL_RTCStateTypeDef; | |||||
/** | |||||
* @brief RTC Configuration Structure definition | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
uint32_t HourFormat; /*!< Specifies the RTC Hour Format. | |||||
This parameter can be a value of @ref RTC_Hour_Formats */ | |||||
uint32_t AsynchPrediv; /*!< Specifies the RTC Asynchronous Predivider value. | |||||
This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x7F */ | |||||
uint32_t SynchPrediv; /*!< Specifies the RTC Synchronous Predivider value. | |||||
This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x7FFFU */ | |||||
uint32_t OutPut; /*!< Specifies which signal will be routed to the RTC output. | |||||
This parameter can be a value of @ref RTC_Output_selection_Definitions */ | |||||
uint32_t OutPutPolarity; /*!< Specifies the polarity of the output signal. | |||||
This parameter can be a value of @ref RTC_Output_Polarity_Definitions */ | |||||
uint32_t OutPutType; /*!< Specifies the RTC Output Pin mode. | |||||
This parameter can be a value of @ref RTC_Output_Type_ALARM_OUT */ | |||||
}RTC_InitTypeDef; | |||||
/** | |||||
* @brief RTC Time structure definition | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
uint8_t Hours; /*!< Specifies the RTC Time Hour. | |||||
This parameter must be a number between Min_Data = 0 and Max_Data = 12 if the RTC_HourFormat_12 is selected. | |||||
This parameter must be a number between Min_Data = 0 and Max_Data = 23 if the RTC_HourFormat_24 is selected */ | |||||
uint8_t Minutes; /*!< Specifies the RTC Time Minutes. | |||||
This parameter must be a number between Min_Data = 0 and Max_Data = 59 */ | |||||
uint8_t Seconds; /*!< Specifies the RTC Time Seconds. | |||||
This parameter must be a number between Min_Data = 0 and Max_Data = 59 */ | |||||
uint8_t TimeFormat; /*!< Specifies the RTC AM/PM Time. | |||||
This parameter can be a value of @ref RTC_AM_PM_Definitions */ | |||||
uint32_t SubSeconds; /*!< Specifies the RTC_SSR RTC Sub Second register content. | |||||
This parameter corresponds to a time unit range between [0-1] Second | |||||
with [1 Sec / SecondFraction +1] granularity */ | |||||
uint32_t SecondFraction; /*!< Specifies the range or granularity of Sub Second register content | |||||
corresponding to Synchronous pre-scaler factor value (PREDIV_S) | |||||
This parameter corresponds to a time unit range between [0-1] Second | |||||
with [1 Sec / SecondFraction +1] granularity. | |||||
This field will be used only by HAL_RTC_GetTime function */ | |||||
uint32_t DayLightSaving; /*!< Specifies DayLight Save Operation. | |||||
This parameter can be a value of @ref RTC_DayLightSaving_Definitions */ | |||||
uint32_t StoreOperation; /*!< Specifies RTC_StoreOperation value to be written in the BCK bit | |||||
in CR register to store the operation. | |||||
This parameter can be a value of @ref RTC_StoreOperation_Definitions */ | |||||
}RTC_TimeTypeDef; | |||||
/** | |||||
* @brief RTC Date structure definition | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
uint8_t WeekDay; /*!< Specifies the RTC Date WeekDay. | |||||
This parameter can be a value of @ref RTC_WeekDay_Definitions */ | |||||
uint8_t Month; /*!< Specifies the RTC Date Month (in BCD format). | |||||
This parameter can be a value of @ref RTC_Month_Date_Definitions */ | |||||
uint8_t Date; /*!< Specifies the RTC Date. | |||||
This parameter must be a number between Min_Data = 1 and Max_Data = 31 */ | |||||
uint8_t Year; /*!< Specifies the RTC Date Year. | |||||
This parameter must be a number between Min_Data = 0 and Max_Data = 99 */ | |||||
}RTC_DateTypeDef; | |||||
/** | |||||
* @brief RTC Alarm structure definition | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
RTC_TimeTypeDef AlarmTime; /*!< Specifies the RTC Alarm Time members */ | |||||
uint32_t AlarmMask; /*!< Specifies the RTC Alarm Masks. | |||||
This parameter can be a value of @ref RTC_AlarmMask_Definitions */ | |||||
uint32_t AlarmSubSecondMask; /*!< Specifies the RTC Alarm SubSeconds Masks. | |||||
This parameter can be a value of @ref RTC_Alarm_Sub_Seconds_Masks_Definitions */ | |||||
uint32_t AlarmDateWeekDaySel; /*!< Specifies the RTC Alarm is on Date or WeekDay. | |||||
This parameter can be a value of @ref RTC_AlarmDateWeekDay_Definitions */ | |||||
uint8_t AlarmDateWeekDay; /*!< Specifies the RTC Alarm Date/WeekDay. | |||||
If the Alarm Date is selected, this parameter must be set to a value in the 1-31 range. | |||||
If the Alarm WeekDay is selected, this parameter can be a value of @ref RTC_WeekDay_Definitions */ | |||||
uint32_t Alarm; /*!< Specifies the alarm . | |||||
This parameter can be a value of @ref RTC_Alarms_Definitions */ | |||||
}RTC_AlarmTypeDef; | |||||
/** | |||||
* @brief RTC Handle Structure definition | |||||
*/ | |||||
#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) | |||||
typedef struct __RTC_HandleTypeDef | |||||
#else | |||||
typedef struct | |||||
#endif /* (USE_HAL_RTC_REGISTER_CALLBACKS) */ | |||||
{ | |||||
RTC_TypeDef *Instance; /*!< Register base address */ | |||||
RTC_InitTypeDef Init; /*!< RTC required parameters */ | |||||
HAL_LockTypeDef Lock; /*!< RTC locking object */ | |||||
__IO HAL_RTCStateTypeDef State; /*!< Time communication state */ | |||||
#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) | |||||
void (* AlarmAEventCallback) ( struct __RTC_HandleTypeDef * hrtc); /*!< RTC Alarm A Event callback */ | |||||
void (* AlarmBEventCallback) ( struct __RTC_HandleTypeDef * hrtc); /*!< RTC Alarm B Event callback */ | |||||
void (* TimeStampEventCallback) ( struct __RTC_HandleTypeDef * hrtc); /*!< RTC TimeStamp Event callback */ | |||||
void (* WakeUpTimerEventCallback) ( struct __RTC_HandleTypeDef * hrtc); /*!< RTC WakeUpTimer Event callback */ | |||||
void (* Tamper1EventCallback) ( struct __RTC_HandleTypeDef * hrtc); /*!< RTC Tamper 1 Event callback */ | |||||
void (* Tamper2EventCallback) ( struct __RTC_HandleTypeDef * hrtc); /*!< RTC Tamper 2 Event callback */ | |||||
void (* MspInitCallback) ( struct __RTC_HandleTypeDef * hrtc); /*!< RTC Msp Init callback */ | |||||
void (* MspDeInitCallback) ( struct __RTC_HandleTypeDef * hrtc); /*!< RTC Msp DeInit callback */ | |||||
#endif /* (USE_HAL_RTC_REGISTER_CALLBACKS) */ | |||||
}RTC_HandleTypeDef; | |||||
#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) | |||||
/** | |||||
* @brief HAL RTC Callback ID enumeration definition | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
HAL_RTC_ALARM_A_EVENT_CB_ID = 0x00u, /*!< RTC Alarm A Event Callback ID */ | |||||
HAL_RTC_ALARM_B_EVENT_CB_ID = 0x01u, /*!< RTC Alarm B Event Callback ID */ | |||||
HAL_RTC_TIMESTAMP_EVENT_CB_ID = 0x02u, /*!< RTC TimeStamp Event Callback ID */ | |||||
HAL_RTC_WAKEUPTIMER_EVENT_CB_ID = 0x03u, /*!< RTC Wake-Up Timer Event Callback ID */ | |||||
HAL_RTC_TAMPER1_EVENT_CB_ID = 0x04u, /*!< RTC Tamper 1 Callback ID */ | |||||
HAL_RTC_TAMPER2_EVENT_CB_ID = 0x05u, /*!< RTC Tamper 2 Callback ID */ | |||||
HAL_RTC_MSPINIT_CB_ID = 0x0Eu, /*!< RTC Msp Init callback ID */ | |||||
HAL_RTC_MSPDEINIT_CB_ID = 0x0Fu /*!< RTC Msp DeInit callback ID */ | |||||
}HAL_RTC_CallbackIDTypeDef; | |||||
/** | |||||
* @brief HAL RTC Callback pointer definition | |||||
*/ | |||||
typedef void (*pRTC_CallbackTypeDef)(RTC_HandleTypeDef * hrtc); /*!< pointer to an RTC callback function */ | |||||
#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/** @defgroup RTC_Exported_Constants RTC Exported Constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup RTC_Hour_Formats RTC Hour Formats | |||||
* @{ | |||||
*/ | |||||
#define RTC_HOURFORMAT_24 0x00000000U | |||||
#define RTC_HOURFORMAT_12 0x00000040U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_Output_selection_Definitions RTC Output Selection Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_OUTPUT_DISABLE 0x00000000U | |||||
#define RTC_OUTPUT_ALARMA 0x00200000U | |||||
#define RTC_OUTPUT_ALARMB 0x00400000U | |||||
#define RTC_OUTPUT_WAKEUP 0x00600000U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_Output_Polarity_Definitions RTC Output Polarity Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_OUTPUT_POLARITY_HIGH 0x00000000U | |||||
#define RTC_OUTPUT_POLARITY_LOW 0x00100000U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_Output_Type_ALARM_OUT RTC Output Type ALARM OUT | |||||
* @{ | |||||
*/ | |||||
#define RTC_OUTPUT_TYPE_OPENDRAIN 0x00000000U | |||||
#define RTC_OUTPUT_TYPE_PUSHPULL 0x00040000U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_AM_PM_Definitions RTC AM PM Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_HOURFORMAT12_AM ((uint8_t)0x00) | |||||
#define RTC_HOURFORMAT12_PM ((uint8_t)0x40) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_DayLightSaving_Definitions RTC DayLight Saving Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_DAYLIGHTSAVING_SUB1H 0x00020000U | |||||
#define RTC_DAYLIGHTSAVING_ADD1H 0x00010000U | |||||
#define RTC_DAYLIGHTSAVING_NONE 0x00000000U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_StoreOperation_Definitions RTC Store Operation Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_STOREOPERATION_RESET 0x00000000U | |||||
#define RTC_STOREOPERATION_SET 0x00040000U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_Input_parameter_format_definitions RTC Input Parameter Format Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_FORMAT_BIN 0x00000000U | |||||
#define RTC_FORMAT_BCD 0x00000001U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_Month_Date_Definitions RTC Month Date Definitions | |||||
* @{ | |||||
*/ | |||||
/* Coded in BCD format */ | |||||
#define RTC_MONTH_JANUARY ((uint8_t)0x01) | |||||
#define RTC_MONTH_FEBRUARY ((uint8_t)0x02) | |||||
#define RTC_MONTH_MARCH ((uint8_t)0x03) | |||||
#define RTC_MONTH_APRIL ((uint8_t)0x04) | |||||
#define RTC_MONTH_MAY ((uint8_t)0x05) | |||||
#define RTC_MONTH_JUNE ((uint8_t)0x06) | |||||
#define RTC_MONTH_JULY ((uint8_t)0x07) | |||||
#define RTC_MONTH_AUGUST ((uint8_t)0x08) | |||||
#define RTC_MONTH_SEPTEMBER ((uint8_t)0x09) | |||||
#define RTC_MONTH_OCTOBER ((uint8_t)0x10) | |||||
#define RTC_MONTH_NOVEMBER ((uint8_t)0x11) | |||||
#define RTC_MONTH_DECEMBER ((uint8_t)0x12) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_WeekDay_Definitions RTC WeekDay Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_WEEKDAY_MONDAY ((uint8_t)0x01) | |||||
#define RTC_WEEKDAY_TUESDAY ((uint8_t)0x02) | |||||
#define RTC_WEEKDAY_WEDNESDAY ((uint8_t)0x03) | |||||
#define RTC_WEEKDAY_THURSDAY ((uint8_t)0x04) | |||||
#define RTC_WEEKDAY_FRIDAY ((uint8_t)0x05) | |||||
#define RTC_WEEKDAY_SATURDAY ((uint8_t)0x06) | |||||
#define RTC_WEEKDAY_SUNDAY ((uint8_t)0x07) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_AlarmDateWeekDay_Definitions RTC Alarm Date WeekDay Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_ALARMDATEWEEKDAYSEL_DATE 0x00000000U | |||||
#define RTC_ALARMDATEWEEKDAYSEL_WEEKDAY 0x40000000U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_AlarmMask_Definitions RTC Alarm Mask Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_ALARMMASK_NONE 0x00000000U | |||||
#define RTC_ALARMMASK_DATEWEEKDAY RTC_ALRMAR_MSK4 | |||||
#define RTC_ALARMMASK_HOURS RTC_ALRMAR_MSK3 | |||||
#define RTC_ALARMMASK_MINUTES RTC_ALRMAR_MSK2 | |||||
#define RTC_ALARMMASK_SECONDS RTC_ALRMAR_MSK1 | |||||
#define RTC_ALARMMASK_ALL 0x80808080U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_Alarms_Definitions RTC Alarms Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_ALARM_A RTC_CR_ALRAE | |||||
#define RTC_ALARM_B RTC_CR_ALRBE | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_Alarm_Sub_Seconds_Masks_Definitions RTC Alarm Sub Seconds Masks Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_ALARMSUBSECONDMASK_ALL 0x00000000U /*!< All Alarm SS fields are masked. | |||||
There is no comparison on sub seconds | |||||
for Alarm */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_1 0x01000000U /*!< SS[14:1] are don't care in Alarm | |||||
comparison. Only SS[0] is compared. */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_2 0x02000000U /*!< SS[14:2] are don't care in Alarm | |||||
comparison. Only SS[1:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_3 0x03000000U /*!< SS[14:3] are don't care in Alarm | |||||
comparison. Only SS[2:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_4 0x04000000U /*!< SS[14:4] are don't care in Alarm | |||||
comparison. Only SS[3:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_5 0x05000000U /*!< SS[14:5] are don't care in Alarm | |||||
comparison. Only SS[4:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_6 0x06000000U /*!< SS[14:6] are don't care in Alarm | |||||
comparison. Only SS[5:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_7 0x07000000U /*!< SS[14:7] are don't care in Alarm | |||||
comparison. Only SS[6:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_8 0x08000000U /*!< SS[14:8] are don't care in Alarm | |||||
comparison. Only SS[7:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_9 0x09000000U /*!< SS[14:9] are don't care in Alarm | |||||
comparison. Only SS[8:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_10 0x0A000000U /*!< SS[14:10] are don't care in Alarm | |||||
comparison. Only SS[9:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_11 0x0B000000U /*!< SS[14:11] are don't care in Alarm | |||||
comparison. Only SS[10:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_12 0x0C000000U /*!< SS[14:12] are don't care in Alarm | |||||
comparison.Only SS[11:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14_13 0x0D000000U /*!< SS[14:13] are don't care in Alarm | |||||
comparison. Only SS[12:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_SS14 0x0E000000U /*!< SS[14] is don't care in Alarm | |||||
comparison.Only SS[13:0] are compared */ | |||||
#define RTC_ALARMSUBSECONDMASK_NONE 0x0F000000U /*!< SS[14:0] are compared and must match | |||||
to activate alarm. */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_Interrupts_Definitions RTC Interrupts Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_IT_TS 0x00008000U | |||||
#define RTC_IT_WUT 0x00004000U | |||||
#define RTC_IT_ALRB 0x00002000U | |||||
#define RTC_IT_ALRA 0x00001000U | |||||
#define RTC_IT_TAMP 0x00000004U /* Used only to Enable the Tamper Interrupt */ | |||||
#define RTC_IT_TAMP1 0x00020000U | |||||
#define RTC_IT_TAMP2 0x00040000U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup RTC_Flags_Definitions RTC Flags Definitions | |||||
* @{ | |||||
*/ | |||||
#define RTC_FLAG_RECALPF 0x00010000U | |||||
#define RTC_FLAG_TAMP2F 0x00004000U | |||||
#define RTC_FLAG_TAMP1F 0x00002000U | |||||
#define RTC_FLAG_TSOVF 0x00001000U | |||||
#define RTC_FLAG_TSF 0x00000800U | |||||
#define RTC_FLAG_WUTF 0x00000400U | |||||
#define RTC_FLAG_ALRBF 0x00000200U | |||||
#define RTC_FLAG_ALRAF 0x00000100U | |||||
#define RTC_FLAG_INITF 0x00000040U | |||||
#define RTC_FLAG_RSF 0x00000020U | |||||
#define RTC_FLAG_INITS 0x00000010U | |||||
#define RTC_FLAG_SHPF 0x00000008U | |||||
#define RTC_FLAG_WUTWF 0x00000004U | |||||
#define RTC_FLAG_ALRBWF 0x00000002U | |||||
#define RTC_FLAG_ALRAWF 0x00000001U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
/** @defgroup RTC_Exported_Macros RTC Exported Macros | |||||
* @{ | |||||
*/ | |||||
/** @brief Reset RTC handle state | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @retval None | |||||
*/ | |||||
#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) | |||||
#define __HAL_RTC_RESET_HANDLE_STATE(__HANDLE__) do{\ | |||||
(__HANDLE__)->State = HAL_RTC_STATE_RESET;\ | |||||
(__HANDLE__)->MspInitCallback = NULL;\ | |||||
(__HANDLE__)->MspDeInitCallback = NULL;\ | |||||
}while(0u) | |||||
#else | |||||
#define __HAL_RTC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_RTC_STATE_RESET) | |||||
#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ | |||||
/** | |||||
* @brief Disable the write protection for RTC registers. | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_WRITEPROTECTION_DISABLE(__HANDLE__) \ | |||||
do{ \ | |||||
(__HANDLE__)->Instance->WPR = 0xCAU; \ | |||||
(__HANDLE__)->Instance->WPR = 0x53U; \ | |||||
} while(0U) | |||||
/** | |||||
* @brief Enable the write protection for RTC registers. | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_WRITEPROTECTION_ENABLE(__HANDLE__) \ | |||||
do{ \ | |||||
(__HANDLE__)->Instance->WPR = 0xFFU; \ | |||||
} while(0U) | |||||
/** | |||||
* @brief Enable the RTC ALARMA peripheral. | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_ALARMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= (RTC_CR_ALRAE)) | |||||
/** | |||||
* @brief Disable the RTC ALARMA peripheral. | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_ALARMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~(RTC_CR_ALRAE)) | |||||
/** | |||||
* @brief Enable the RTC ALARMB peripheral. | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_ALARMB_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= (RTC_CR_ALRBE)) | |||||
/** | |||||
* @brief Disable the RTC ALARMB peripheral. | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_ALARMB_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~(RTC_CR_ALRBE)) | |||||
/** | |||||
* @brief Enable the RTC Alarm interrupt. | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @param __INTERRUPT__ specifies the RTC Alarm interrupt sources to be enabled or disabled. | |||||
* This parameter can be any combination of the following values: | |||||
* @arg RTC_IT_ALRA: Alarm A interrupt | |||||
* @arg RTC_IT_ALRB: Alarm B interrupt | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_ALARM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR |= (__INTERRUPT__)) | |||||
/** | |||||
* @brief Disable the RTC Alarm interrupt. | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @param __INTERRUPT__ specifies the RTC Alarm interrupt sources to be enabled or disabled. | |||||
* This parameter can be any combination of the following values: | |||||
* @arg RTC_IT_ALRA: Alarm A interrupt | |||||
* @arg RTC_IT_ALRB: Alarm B interrupt | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_ALARM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR &= ~(__INTERRUPT__)) | |||||
/** | |||||
* @brief Check whether the specified RTC Alarm interrupt has occurred or not. | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @param __INTERRUPT__ specifies the RTC Alarm interrupt to check. | |||||
* This parameter can be: | |||||
* @arg RTC_IT_ALRA: Alarm A interrupt | |||||
* @arg RTC_IT_ALRB: Alarm B interrupt | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_ALARM_GET_IT(__HANDLE__, __INTERRUPT__) (((((__HANDLE__)->Instance->ISR)& ((__INTERRUPT__)>> 4U)) != RESET)? SET : RESET) | |||||
/** | |||||
* @brief Get the selected RTC Alarm's flag status. | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @param __FLAG__ specifies the RTC Alarm Flag to check. | |||||
* This parameter can be: | |||||
* @arg RTC_FLAG_ALRAF | |||||
* @arg RTC_FLAG_ALRBF | |||||
* @arg RTC_FLAG_ALRAWF | |||||
* @arg RTC_FLAG_ALRBWF | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_ALARM_GET_FLAG(__HANDLE__, __FLAG__) (((((__HANDLE__)->Instance->ISR) & (__FLAG__)) != RESET)? SET : RESET) | |||||
/** | |||||
* @brief Clear the RTC Alarm's pending flags. | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @param __FLAG__ specifies the RTC Alarm Flag sources to be enabled or disabled. | |||||
* This parameter can be: | |||||
* @arg RTC_FLAG_ALRAF | |||||
* @arg RTC_FLAG_ALRBF | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_ALARM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ISR) = (~((__FLAG__) | RTC_ISR_INIT)|((__HANDLE__)->Instance->ISR & RTC_ISR_INIT)) | |||||
/** | |||||
* @brief Check whether the specified RTC Alarm interrupt has been enabled or not. | |||||
* @param __HANDLE__ specifies the RTC handle. | |||||
* @param __INTERRUPT__ specifies the RTC Alarm interrupt sources to check. | |||||
* This parameter can be: | |||||
* @arg RTC_IT_ALRA: Alarm A interrupt | |||||
* @arg RTC_IT_ALRB: Alarm B interrupt | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_ALARM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((((__HANDLE__)->Instance->CR) & (__INTERRUPT__)) != RESET) ? SET : RESET) | |||||
/** | |||||
* @brief Enable interrupt on the RTC Alarm associated Exti line. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_ENABLE_IT() (EXTI->IMR |= RTC_EXTI_LINE_ALARM_EVENT) | |||||
/** | |||||
* @brief Disable interrupt on the RTC Alarm associated Exti line. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_DISABLE_IT() (EXTI->IMR &= ~(RTC_EXTI_LINE_ALARM_EVENT)) | |||||
/** | |||||
* @brief Enable event on the RTC Alarm associated Exti line. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_ENABLE_EVENT() (EXTI->EMR |= RTC_EXTI_LINE_ALARM_EVENT) | |||||
/** | |||||
* @brief Disable event on the RTC Alarm associated Exti line. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_DISABLE_EVENT() (EXTI->EMR &= ~(RTC_EXTI_LINE_ALARM_EVENT)) | |||||
/** | |||||
* @brief Enable falling edge trigger on the RTC Alarm associated Exti line. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_ENABLE_FALLING_EDGE() (EXTI->FTSR |= RTC_EXTI_LINE_ALARM_EVENT) | |||||
/** | |||||
* @brief Disable falling edge trigger on the RTC Alarm associated Exti line. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_DISABLE_FALLING_EDGE() (EXTI->FTSR &= ~(RTC_EXTI_LINE_ALARM_EVENT)) | |||||
/** | |||||
* @brief Enable rising edge trigger on the RTC Alarm associated Exti line. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_ENABLE_RISING_EDGE() (EXTI->RTSR |= RTC_EXTI_LINE_ALARM_EVENT) | |||||
/** | |||||
* @brief Disable rising edge trigger on the RTC Alarm associated Exti line. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_DISABLE_RISING_EDGE() (EXTI->RTSR &= ~(RTC_EXTI_LINE_ALARM_EVENT)) | |||||
/** | |||||
* @brief Enable rising & falling edge trigger on the RTC Alarm associated Exti line. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_ENABLE_RISING_FALLING_EDGE() do { __HAL_RTC_ALARM_EXTI_ENABLE_RISING_EDGE(); \ | |||||
__HAL_RTC_ALARM_EXTI_ENABLE_FALLING_EDGE();\ | |||||
} while(0U) | |||||
/** | |||||
* @brief Disable rising & falling edge trigger on the RTC Alarm associated Exti line. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_DISABLE_RISING_FALLING_EDGE() do { __HAL_RTC_ALARM_EXTI_DISABLE_RISING_EDGE();\ | |||||
__HAL_RTC_ALARM_EXTI_DISABLE_FALLING_EDGE();\ | |||||
} while(0U) | |||||
/** | |||||
* @brief Check whether the RTC Alarm associated Exti line interrupt flag is set or not. | |||||
* @retval Line Status. | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_GET_FLAG() (EXTI->PR & RTC_EXTI_LINE_ALARM_EVENT) | |||||
/** | |||||
* @brief Clear the RTC Alarm associated Exti line flag. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_CLEAR_FLAG() (EXTI->PR = RTC_EXTI_LINE_ALARM_EVENT) | |||||
/** | |||||
* @brief Generate a Software interrupt on RTC Alarm associated Exti line. | |||||
* @retval None. | |||||
*/ | |||||
#define __HAL_RTC_ALARM_EXTI_GENERATE_SWIT() (EXTI->SWIER |= RTC_EXTI_LINE_ALARM_EVENT) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Include RTC HAL Extension module */ | |||||
#include "stm32f4xx_hal_rtc_ex.h" | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @addtogroup RTC_Exported_Functions | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup RTC_Exported_Functions_Group1 | |||||
* @{ | |||||
*/ | |||||
/* Initialization and de-initialization functions ****************************/ | |||||
HAL_StatusTypeDef HAL_RTC_Init(RTC_HandleTypeDef *hrtc); | |||||
HAL_StatusTypeDef HAL_RTC_DeInit(RTC_HandleTypeDef *hrtc); | |||||
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc); | |||||
void HAL_RTC_MspDeInit(RTC_HandleTypeDef *hrtc); | |||||
/* Callbacks Register/UnRegister functions ***********************************/ | |||||
#if (USE_HAL_RTC_REGISTER_CALLBACKS == 1) | |||||
HAL_StatusTypeDef HAL_RTC_RegisterCallback(RTC_HandleTypeDef *hrtc, HAL_RTC_CallbackIDTypeDef CallbackID, pRTC_CallbackTypeDef pCallback); | |||||
HAL_StatusTypeDef HAL_RTC_UnRegisterCallback(RTC_HandleTypeDef *hrtc, HAL_RTC_CallbackIDTypeDef CallbackID); | |||||
#endif /* USE_HAL_RTC_REGISTER_CALLBACKS */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup RTC_Exported_Functions_Group2 | |||||
* @{ | |||||
*/ | |||||
/* RTC Time and Date functions ************************************************/ | |||||
HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format); | |||||
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format); | |||||
HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format); | |||||
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup RTC_Exported_Functions_Group3 | |||||
* @{ | |||||
*/ | |||||
/* RTC Alarm functions ********************************************************/ | |||||
HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format); | |||||
HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format); | |||||
HAL_StatusTypeDef HAL_RTC_DeactivateAlarm(RTC_HandleTypeDef *hrtc, uint32_t Alarm); | |||||
HAL_StatusTypeDef HAL_RTC_GetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Alarm, uint32_t Format); | |||||
void HAL_RTC_AlarmIRQHandler(RTC_HandleTypeDef *hrtc); | |||||
HAL_StatusTypeDef HAL_RTC_PollForAlarmAEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout); | |||||
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup RTC_Exported_Functions_Group4 | |||||
* @{ | |||||
*/ | |||||
/* Peripheral Control functions ***********************************************/ | |||||
HAL_StatusTypeDef HAL_RTC_WaitForSynchro(RTC_HandleTypeDef* hrtc); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup RTC_Exported_Functions_Group5 | |||||
* @{ | |||||
*/ | |||||
/* Peripheral State functions *************************************************/ | |||||
HAL_RTCStateTypeDef HAL_RTC_GetState(RTC_HandleTypeDef *hrtc); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private types -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private constants ---------------------------------------------------------*/ | |||||
/** @defgroup RTC_Private_Constants RTC Private Constants | |||||
* @{ | |||||
*/ | |||||
/* Masks Definition */ | |||||
#define RTC_TR_RESERVED_MASK 0x007F7F7FU | |||||
#define RTC_DR_RESERVED_MASK 0x00FFFF3FU | |||||
#define RTC_INIT_MASK 0xFFFFFFFFU | |||||
#define RTC_RSF_MASK 0xFFFFFF5FU | |||||
#define RTC_FLAGS_MASK ((uint32_t)(RTC_FLAG_TSOVF | RTC_FLAG_TSF | RTC_FLAG_WUTF | \ | |||||
RTC_FLAG_ALRBF | RTC_FLAG_ALRAF | RTC_FLAG_INITF | \ | |||||
RTC_FLAG_RSF | RTC_FLAG_INITS | RTC_FLAG_WUTWF | \ | |||||
RTC_FLAG_ALRBWF | RTC_FLAG_ALRAWF | RTC_FLAG_TAMP1F | \ | |||||
RTC_FLAG_RECALPF | RTC_FLAG_SHPF)) | |||||
#define RTC_TIMEOUT_VALUE 1000 | |||||
#define RTC_EXTI_LINE_ALARM_EVENT ((uint32_t)EXTI_IMR_MR17) /*!< External interrupt line 17 Connected to the RTC Alarm event */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/** @defgroup RTC_Private_Macros RTC Private Macros | |||||
* @{ | |||||
*/ | |||||
/** @defgroup RTC_IS_RTC_Definitions RTC Private macros to check input parameters | |||||
* @{ | |||||
*/ | |||||
#define IS_RTC_HOUR_FORMAT(FORMAT) (((FORMAT) == RTC_HOURFORMAT_12) || \ | |||||
((FORMAT) == RTC_HOURFORMAT_24)) | |||||
#define IS_RTC_OUTPUT(OUTPUT) (((OUTPUT) == RTC_OUTPUT_DISABLE) || \ | |||||
((OUTPUT) == RTC_OUTPUT_ALARMA) || \ | |||||
((OUTPUT) == RTC_OUTPUT_ALARMB) || \ | |||||
((OUTPUT) == RTC_OUTPUT_WAKEUP)) | |||||
#define IS_RTC_OUTPUT_POL(POL) (((POL) == RTC_OUTPUT_POLARITY_HIGH) || \ | |||||
((POL) == RTC_OUTPUT_POLARITY_LOW)) | |||||
#define IS_RTC_OUTPUT_TYPE(TYPE) (((TYPE) == RTC_OUTPUT_TYPE_OPENDRAIN) || \ | |||||
((TYPE) == RTC_OUTPUT_TYPE_PUSHPULL)) | |||||
#define IS_RTC_HOUR12(HOUR) (((HOUR) > 0U) && ((HOUR) <= 12U)) | |||||
#define IS_RTC_HOUR24(HOUR) ((HOUR) <= 23U) | |||||
#define IS_RTC_ASYNCH_PREDIV(PREDIV) ((PREDIV) <= 0x7FU) | |||||
#define IS_RTC_SYNCH_PREDIV(PREDIV) ((PREDIV) <= 0x7FFFU) | |||||
#define IS_RTC_MINUTES(MINUTES) ((MINUTES) <= 59U) | |||||
#define IS_RTC_SECONDS(SECONDS) ((SECONDS) <= 59U) | |||||
#define IS_RTC_HOURFORMAT12(PM) (((PM) == RTC_HOURFORMAT12_AM) || ((PM) == RTC_HOURFORMAT12_PM)) | |||||
#define IS_RTC_DAYLIGHT_SAVING(SAVE) (((SAVE) == RTC_DAYLIGHTSAVING_SUB1H) || \ | |||||
((SAVE) == RTC_DAYLIGHTSAVING_ADD1H) || \ | |||||
((SAVE) == RTC_DAYLIGHTSAVING_NONE)) | |||||
#define IS_RTC_STORE_OPERATION(OPERATION) (((OPERATION) == RTC_STOREOPERATION_RESET) || \ | |||||
((OPERATION) == RTC_STOREOPERATION_SET)) | |||||
#define IS_RTC_FORMAT(FORMAT) (((FORMAT) == RTC_FORMAT_BIN) || ((FORMAT) == RTC_FORMAT_BCD)) | |||||
#define IS_RTC_YEAR(YEAR) ((YEAR) <= 99U) | |||||
#define IS_RTC_MONTH(MONTH) (((MONTH) >= 1U) && ((MONTH) <= 12U)) | |||||
#define IS_RTC_DATE(DATE) (((DATE) >= 1U) && ((DATE) <= 31U)) | |||||
#define IS_RTC_WEEKDAY(WEEKDAY) (((WEEKDAY) == RTC_WEEKDAY_MONDAY) || \ | |||||
((WEEKDAY) == RTC_WEEKDAY_TUESDAY) || \ | |||||
((WEEKDAY) == RTC_WEEKDAY_WEDNESDAY) || \ | |||||
((WEEKDAY) == RTC_WEEKDAY_THURSDAY) || \ | |||||
((WEEKDAY) == RTC_WEEKDAY_FRIDAY) || \ | |||||
((WEEKDAY) == RTC_WEEKDAY_SATURDAY) || \ | |||||
((WEEKDAY) == RTC_WEEKDAY_SUNDAY)) | |||||
#define IS_RTC_ALARM_DATE_WEEKDAY_DATE(DATE) (((DATE) > 0U) && ((DATE) <= 31U)) | |||||
#define IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(WEEKDAY) (((WEEKDAY) == RTC_WEEKDAY_MONDAY) || \ | |||||
((WEEKDAY) == RTC_WEEKDAY_TUESDAY) || \ | |||||
((WEEKDAY) == RTC_WEEKDAY_WEDNESDAY) || \ | |||||
((WEEKDAY) == RTC_WEEKDAY_THURSDAY) || \ | |||||
((WEEKDAY) == RTC_WEEKDAY_FRIDAY) || \ | |||||
((WEEKDAY) == RTC_WEEKDAY_SATURDAY) || \ | |||||
((WEEKDAY) == RTC_WEEKDAY_SUNDAY)) | |||||
#define IS_RTC_ALARM_DATE_WEEKDAY_SEL(SEL) (((SEL) == RTC_ALARMDATEWEEKDAYSEL_DATE) || \ | |||||
((SEL) == RTC_ALARMDATEWEEKDAYSEL_WEEKDAY)) | |||||
#define IS_RTC_ALARM_MASK(MASK) (((MASK) & 0x7F7F7F7FU) == (uint32_t)RESET) | |||||
#define IS_RTC_ALARM(ALARM) (((ALARM) == RTC_ALARM_A) || ((ALARM) == RTC_ALARM_B)) | |||||
#define IS_RTC_ALARM_SUB_SECOND_VALUE(VALUE) ((VALUE) <= 0x00007FFFU) | |||||
#define IS_RTC_ALARM_SUB_SECOND_MASK(MASK) (((MASK) == RTC_ALARMSUBSECONDMASK_ALL) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_1) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_2) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_3) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_4) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_5) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_6) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_7) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_8) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_9) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_10) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_11) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_12) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14_13) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_SS14) || \ | |||||
((MASK) == RTC_ALARMSUBSECONDMASK_NONE)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/** @defgroup RTC_Private_Functions RTC Private Functions | |||||
* @{ | |||||
*/ | |||||
HAL_StatusTypeDef RTC_EnterInitMode(RTC_HandleTypeDef* hrtc); | |||||
uint8_t RTC_ByteToBcd2(uint8_t Value); | |||||
uint8_t RTC_Bcd2ToByte(uint8_t Value); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32F4xx_HAL_RTC_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_tim_ex.h | |||||
* @author MCD Application Team | |||||
* @brief Header file of TIM HAL Extended module. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2016 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef STM32F4xx_HAL_TIM_EX_H | |||||
#define STM32F4xx_HAL_TIM_EX_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_def.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup TIMEx | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/** @defgroup TIMEx_Exported_Types TIM Extended Exported Types | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief TIM Hall sensor Configuration Structure definition | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. | |||||
This parameter can be a value of @ref TIM_Input_Capture_Polarity */ | |||||
uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. | |||||
This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ | |||||
uint32_t IC1Filter; /*!< Specifies the input capture filter. | |||||
This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ | |||||
uint32_t Commutation_Delay; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. | |||||
This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ | |||||
} TIM_HallSensor_InitTypeDef; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* End of exported types -----------------------------------------------------*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/** @defgroup TIMEx_Exported_Constants TIM Extended Exported Constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup TIMEx_Remap TIM Extended Remapping | |||||
* @{ | |||||
*/ | |||||
#if defined (TIM2) | |||||
#if defined(TIM8) | |||||
#define TIM_TIM2_TIM8_TRGO 0x00000000U /*!< TIM2 ITR1 is connected to TIM8 TRGO */ | |||||
#else | |||||
#define TIM_TIM2_ETH_PTP TIM_OR_ITR1_RMP_0 /*!< TIM2 ITR1 is connected to PTP trigger output */ | |||||
#endif /* TIM8 */ | |||||
#define TIM_TIM2_USBFS_SOF TIM_OR_ITR1_RMP_1 /*!< TIM2 ITR1 is connected to OTG FS SOF */ | |||||
#define TIM_TIM2_USBHS_SOF (TIM_OR_ITR1_RMP_1 | TIM_OR_ITR1_RMP_0) /*!< TIM2 ITR1 is connected to OTG HS SOF */ | |||||
#endif /* TIM2 */ | |||||
#define TIM_TIM5_GPIO 0x00000000U /*!< TIM5 TI4 is connected to GPIO */ | |||||
#define TIM_TIM5_LSI TIM_OR_TI4_RMP_0 /*!< TIM5 TI4 is connected to LSI */ | |||||
#define TIM_TIM5_LSE TIM_OR_TI4_RMP_1 /*!< TIM5 TI4 is connected to LSE */ | |||||
#define TIM_TIM5_RTC (TIM_OR_TI4_RMP_1 | TIM_OR_TI4_RMP_0) /*!< TIM5 TI4 is connected to the RTC wakeup interrupt */ | |||||
#define TIM_TIM11_GPIO 0x00000000U /*!< TIM11 TI1 is connected to GPIO */ | |||||
#define TIM_TIM11_HSE TIM_OR_TI1_RMP_1 /*!< TIM11 TI1 is connected to HSE_RTC clock */ | |||||
#if defined(SPDIFRX) | |||||
#define TIM_TIM11_SPDIFRX TIM_OR_TI1_RMP_0 /*!< TIM11 TI1 is connected to SPDIFRX_FRAME_SYNC */ | |||||
#endif /* SPDIFRX*/ | |||||
#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) | |||||
#define LPTIM_REMAP_MASK 0x10000000U | |||||
#define TIM_TIM9_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM9 ITR1 is connected to TIM3 TRGO */ | |||||
#define TIM_TIM9_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM9_ITR1_RMP) /*!< TIM9 ITR1 is connected to LPTIM1 output */ | |||||
#define TIM_TIM5_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM5 ITR1 is connected to TIM3 TRGO */ | |||||
#define TIM_TIM5_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM5_ITR1_RMP) /*!< TIM5 ITR1 is connected to LPTIM1 output */ | |||||
#define TIM_TIM1_TIM3_TRGO LPTIM_REMAP_MASK /*!< TIM1 ITR2 is connected to TIM3 TRGO */ | |||||
#define TIM_TIM1_LPTIM (LPTIM_REMAP_MASK | LPTIM_OR_TIM1_ITR2_RMP) /*!< TIM1 ITR2 is connected to LPTIM1 output */ | |||||
#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* End of exported constants -------------------------------------------------*/ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
/** @defgroup TIMEx_Exported_Macros TIM Extended Exported Macros | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* End of exported macro -----------------------------------------------------*/ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/** @defgroup TIMEx_Private_Macros TIM Extended Private Macros | |||||
* @{ | |||||
*/ | |||||
#if defined(SPDIFRX) | |||||
#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ | |||||
((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ | |||||
((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ | |||||
((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ | |||||
(((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ | |||||
((TIM_REMAP) == TIM_TIM5_LSI) || \ | |||||
((TIM_REMAP) == TIM_TIM5_LSE) || \ | |||||
((TIM_REMAP) == TIM_TIM5_RTC))) || \ | |||||
(((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ | |||||
((TIM_REMAP) == TIM_TIM11_SPDIFRX) || \ | |||||
((TIM_REMAP) == TIM_TIM11_HSE)))) | |||||
#elif defined(TIM2) | |||||
#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) | |||||
#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ | |||||
((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ | |||||
((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ | |||||
((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ | |||||
(((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ | |||||
((TIM_REMAP) == TIM_TIM5_LSI) || \ | |||||
((TIM_REMAP) == TIM_TIM5_LSE) || \ | |||||
((TIM_REMAP) == TIM_TIM5_RTC))) || \ | |||||
(((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ | |||||
((TIM_REMAP) == TIM_TIM11_HSE))) || \ | |||||
(((INSTANCE) == TIM1) && (((TIM_REMAP) == TIM_TIM1_TIM3_TRGO) || \ | |||||
((TIM_REMAP) == TIM_TIM1_LPTIM))) || \ | |||||
(((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_TIM3_TRGO) || \ | |||||
((TIM_REMAP) == TIM_TIM5_LPTIM))) || \ | |||||
(((INSTANCE) == TIM9) && (((TIM_REMAP) == TIM_TIM9_TIM3_TRGO) || \ | |||||
((TIM_REMAP) == TIM_TIM9_LPTIM)))) | |||||
#elif defined(TIM8) | |||||
#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ | |||||
((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO) || \ | |||||
((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ | |||||
((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ | |||||
(((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ | |||||
((TIM_REMAP) == TIM_TIM5_LSI) || \ | |||||
((TIM_REMAP) == TIM_TIM5_LSE) || \ | |||||
((TIM_REMAP) == TIM_TIM5_RTC))) || \ | |||||
(((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ | |||||
((TIM_REMAP) == TIM_TIM11_HSE)))) | |||||
#else | |||||
#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ | |||||
((((INSTANCE) == TIM2) && (((TIM_REMAP) == TIM_TIM2_ETH_PTP) || \ | |||||
((TIM_REMAP) == TIM_TIM2_USBFS_SOF) || \ | |||||
((TIM_REMAP) == TIM_TIM2_USBHS_SOF))) || \ | |||||
(((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ | |||||
((TIM_REMAP) == TIM_TIM5_LSI) || \ | |||||
((TIM_REMAP) == TIM_TIM5_LSE) || \ | |||||
((TIM_REMAP) == TIM_TIM5_RTC))) || \ | |||||
(((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ | |||||
((TIM_REMAP) == TIM_TIM11_HSE)))) | |||||
#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM5_ITR1_RMP */ | |||||
#else | |||||
#define IS_TIM_REMAP(INSTANCE, TIM_REMAP) \ | |||||
((((INSTANCE) == TIM5) && (((TIM_REMAP) == TIM_TIM5_GPIO) || \ | |||||
((TIM_REMAP) == TIM_TIM5_LSI) || \ | |||||
((TIM_REMAP) == TIM_TIM5_LSE) || \ | |||||
((TIM_REMAP) == TIM_TIM5_RTC))) || \ | |||||
(((INSTANCE) == TIM11) && (((TIM_REMAP) == TIM_TIM11_GPIO) || \ | |||||
((TIM_REMAP) == TIM_TIM11_HSE)))) | |||||
#endif /* SPDIFRX */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* End of private macro ------------------------------------------------------*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @addtogroup TIMEx_Exported_Functions TIM Extended Exported Functions | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions | |||||
* @brief Timer Hall Sensor functions | |||||
* @{ | |||||
*/ | |||||
/* Timer Hall Sensor functions **********************************************/ | |||||
HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); | |||||
HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); | |||||
void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim); | |||||
void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim); | |||||
/* Blocking mode: Polling */ | |||||
HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim); | |||||
HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim); | |||||
/* Non-Blocking mode: Interrupt */ | |||||
HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim); | |||||
HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim); | |||||
/* Non-Blocking mode: DMA */ | |||||
HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); | |||||
HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions | |||||
* @brief Timer Complementary Output Compare functions | |||||
* @{ | |||||
*/ | |||||
/* Timer Complementary Output Compare functions *****************************/ | |||||
/* Blocking mode: Polling */ | |||||
HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); | |||||
HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); | |||||
/* Non-Blocking mode: Interrupt */ | |||||
HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); | |||||
HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); | |||||
/* Non-Blocking mode: DMA */ | |||||
HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); | |||||
HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions | |||||
* @brief Timer Complementary PWM functions | |||||
* @{ | |||||
*/ | |||||
/* Timer Complementary PWM functions ****************************************/ | |||||
/* Blocking mode: Polling */ | |||||
HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); | |||||
HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); | |||||
/* Non-Blocking mode: Interrupt */ | |||||
HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); | |||||
HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); | |||||
/* Non-Blocking mode: DMA */ | |||||
HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); | |||||
HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions | |||||
* @brief Timer Complementary One Pulse functions | |||||
* @{ | |||||
*/ | |||||
/* Timer Complementary One Pulse functions **********************************/ | |||||
/* Blocking mode: Polling */ | |||||
HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); | |||||
HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); | |||||
/* Non-Blocking mode: Interrupt */ | |||||
HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); | |||||
HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions | |||||
* @brief Peripheral Control functions | |||||
* @{ | |||||
*/ | |||||
/* Extended Control functions ************************************************/ | |||||
HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, | |||||
uint32_t CommutationSource); | |||||
HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, | |||||
uint32_t CommutationSource); | |||||
HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, | |||||
uint32_t CommutationSource); | |||||
HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, | |||||
TIM_MasterConfigTypeDef *sMasterConfig); | |||||
HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, | |||||
TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); | |||||
HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions | |||||
* @brief Extended Callbacks functions | |||||
* @{ | |||||
*/ | |||||
/* Extended Callback **********************************************************/ | |||||
void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim); | |||||
void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim); | |||||
void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions | |||||
* @brief Extended Peripheral State functions | |||||
* @{ | |||||
*/ | |||||
/* Extended Peripheral State functions ***************************************/ | |||||
HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* End of exported functions -------------------------------------------------*/ | |||||
/* Private functions----------------------------------------------------------*/ | |||||
/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions | |||||
* @{ | |||||
*/ | |||||
void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); | |||||
void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* End of private functions --------------------------------------------------*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* STM32F4xx_HAL_TIM_EX_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_uart.h | |||||
* @author MCD Application Team | |||||
* @brief Header file of UART HAL module. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2016 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32F4xx_HAL_UART_H | |||||
#define __STM32F4xx_HAL_UART_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal_def.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup UART | |||||
* @{ | |||||
*/ | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/** @defgroup UART_Exported_Types UART Exported Types | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief UART Init Structure definition | |||||
*/ | |||||
typedef struct | |||||
{ | |||||
uint32_t BaudRate; /*!< This member configures the UART communication baud rate. | |||||
The baud rate is computed using the following formula: | |||||
- IntegerDivider = ((PCLKx) / (8 * (OVR8+1) * (huart->Init.BaudRate))) | |||||
- FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 8 * (OVR8+1)) + 0.5 | |||||
Where OVR8 is the "oversampling by 8 mode" configuration bit in the CR1 register. */ | |||||
uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. | |||||
This parameter can be a value of @ref UART_Word_Length */ | |||||
uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. | |||||
This parameter can be a value of @ref UART_Stop_Bits */ | |||||
uint32_t Parity; /*!< Specifies the parity mode. | |||||
This parameter can be a value of @ref UART_Parity | |||||
@note When parity is enabled, the computed parity is inserted | |||||
at the MSB position of the transmitted data (9th bit when | |||||
the word length is set to 9 data bits; 8th bit when the | |||||
word length is set to 8 data bits). */ | |||||
uint32_t Mode; /*!< Specifies whether the Receive or Transmit mode is enabled or disabled. | |||||
This parameter can be a value of @ref UART_Mode */ | |||||
uint32_t HwFlowCtl; /*!< Specifies whether the hardware flow control mode is enabled or disabled. | |||||
This parameter can be a value of @ref UART_Hardware_Flow_Control */ | |||||
uint32_t OverSampling; /*!< Specifies whether the Over sampling 8 is enabled or disabled, to achieve higher speed (up to fPCLK/8). | |||||
This parameter can be a value of @ref UART_Over_Sampling */ | |||||
} UART_InitTypeDef; | |||||
/** | |||||
* @brief HAL UART State structures definition | |||||
* @note HAL UART State value is a combination of 2 different substates: gState and RxState. | |||||
* - gState contains UART state information related to global Handle management | |||||
* and also information related to Tx operations. | |||||
* gState value coding follow below described bitmap : | |||||
* b7-b6 Error information | |||||
* 00 : No Error | |||||
* 01 : (Not Used) | |||||
* 10 : Timeout | |||||
* 11 : Error | |||||
* b5 Peripheral initialization status | |||||
* 0 : Reset (Peripheral not initialized) | |||||
* 1 : Init done (Peripheral not initialized. HAL UART Init function already called) | |||||
* b4-b3 (not used) | |||||
* xx : Should be set to 00 | |||||
* b2 Intrinsic process state | |||||
* 0 : Ready | |||||
* 1 : Busy (Peripheral busy with some configuration or internal operations) | |||||
* b1 (not used) | |||||
* x : Should be set to 0 | |||||
* b0 Tx state | |||||
* 0 : Ready (no Tx operation ongoing) | |||||
* 1 : Busy (Tx operation ongoing) | |||||
* - RxState contains information related to Rx operations. | |||||
* RxState value coding follow below described bitmap : | |||||
* b7-b6 (not used) | |||||
* xx : Should be set to 00 | |||||
* b5 Peripheral initialization status | |||||
* 0 : Reset (Peripheral not initialized) | |||||
* 1 : Init done (Peripheral not initialized) | |||||
* b4-b2 (not used) | |||||
* xxx : Should be set to 000 | |||||
* b1 Rx state | |||||
* 0 : Ready (no Rx operation ongoing) | |||||
* 1 : Busy (Rx operation ongoing) | |||||
* b0 (not used) | |||||
* x : Should be set to 0. | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
HAL_UART_STATE_RESET = 0x00U, /*!< Peripheral is not yet Initialized | |||||
Value is allowed for gState and RxState */ | |||||
HAL_UART_STATE_READY = 0x20U, /*!< Peripheral Initialized and ready for use | |||||
Value is allowed for gState and RxState */ | |||||
HAL_UART_STATE_BUSY = 0x24U, /*!< an internal process is ongoing | |||||
Value is allowed for gState only */ | |||||
HAL_UART_STATE_BUSY_TX = 0x21U, /*!< Data Transmission process is ongoing | |||||
Value is allowed for gState only */ | |||||
HAL_UART_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing | |||||
Value is allowed for RxState only */ | |||||
HAL_UART_STATE_BUSY_TX_RX = 0x23U, /*!< Data Transmission and Reception process is ongoing | |||||
Not to be used for neither gState nor RxState. | |||||
Value is result of combination (Or) between gState and RxState values */ | |||||
HAL_UART_STATE_TIMEOUT = 0xA0U, /*!< Timeout state | |||||
Value is allowed for gState only */ | |||||
HAL_UART_STATE_ERROR = 0xE0U /*!< Error | |||||
Value is allowed for gState only */ | |||||
} HAL_UART_StateTypeDef; | |||||
/** | |||||
* @brief UART handle Structure definition | |||||
*/ | |||||
typedef struct __UART_HandleTypeDef | |||||
{ | |||||
USART_TypeDef *Instance; /*!< UART registers base address */ | |||||
UART_InitTypeDef Init; /*!< UART communication parameters */ | |||||
uint8_t *pTxBuffPtr; /*!< Pointer to UART Tx transfer Buffer */ | |||||
uint16_t TxXferSize; /*!< UART Tx Transfer size */ | |||||
__IO uint16_t TxXferCount; /*!< UART Tx Transfer Counter */ | |||||
uint8_t *pRxBuffPtr; /*!< Pointer to UART Rx transfer Buffer */ | |||||
uint16_t RxXferSize; /*!< UART Rx Transfer size */ | |||||
__IO uint16_t RxXferCount; /*!< UART Rx Transfer Counter */ | |||||
DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA Handle parameters */ | |||||
DMA_HandleTypeDef *hdmarx; /*!< UART Rx DMA Handle parameters */ | |||||
HAL_LockTypeDef Lock; /*!< Locking object */ | |||||
__IO HAL_UART_StateTypeDef gState; /*!< UART state information related to global Handle management | |||||
and also related to Tx operations. | |||||
This parameter can be a value of @ref HAL_UART_StateTypeDef */ | |||||
__IO HAL_UART_StateTypeDef RxState; /*!< UART state information related to Rx operations. | |||||
This parameter can be a value of @ref HAL_UART_StateTypeDef */ | |||||
__IO uint32_t ErrorCode; /*!< UART Error code */ | |||||
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) | |||||
void (* TxHalfCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Tx Half Complete Callback */ | |||||
void (* TxCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Tx Complete Callback */ | |||||
void (* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Rx Half Complete Callback */ | |||||
void (* RxCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Rx Complete Callback */ | |||||
void (* ErrorCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Error Callback */ | |||||
void (* AbortCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Complete Callback */ | |||||
void (* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Transmit Complete Callback */ | |||||
void (* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Receive Complete Callback */ | |||||
void (* WakeupCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Wakeup Callback */ | |||||
void (* MspInitCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Msp Init callback */ | |||||
void (* MspDeInitCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Msp DeInit callback */ | |||||
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ | |||||
} UART_HandleTypeDef; | |||||
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) | |||||
/** | |||||
* @brief HAL UART Callback ID enumeration definition | |||||
*/ | |||||
typedef enum | |||||
{ | |||||
HAL_UART_TX_HALFCOMPLETE_CB_ID = 0x00U, /*!< UART Tx Half Complete Callback ID */ | |||||
HAL_UART_TX_COMPLETE_CB_ID = 0x01U, /*!< UART Tx Complete Callback ID */ | |||||
HAL_UART_RX_HALFCOMPLETE_CB_ID = 0x02U, /*!< UART Rx Half Complete Callback ID */ | |||||
HAL_UART_RX_COMPLETE_CB_ID = 0x03U, /*!< UART Rx Complete Callback ID */ | |||||
HAL_UART_ERROR_CB_ID = 0x04U, /*!< UART Error Callback ID */ | |||||
HAL_UART_ABORT_COMPLETE_CB_ID = 0x05U, /*!< UART Abort Complete Callback ID */ | |||||
HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID = 0x06U, /*!< UART Abort Transmit Complete Callback ID */ | |||||
HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID = 0x07U, /*!< UART Abort Receive Complete Callback ID */ | |||||
HAL_UART_WAKEUP_CB_ID = 0x08U, /*!< UART Wakeup Callback ID */ | |||||
HAL_UART_MSPINIT_CB_ID = 0x0BU, /*!< UART MspInit callback ID */ | |||||
HAL_UART_MSPDEINIT_CB_ID = 0x0CU /*!< UART MspDeInit callback ID */ | |||||
} HAL_UART_CallbackIDTypeDef; | |||||
/** | |||||
* @brief HAL UART Callback pointer definition | |||||
*/ | |||||
typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer to an UART callback function */ | |||||
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/** @defgroup UART_Exported_Constants UART Exported Constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup UART_Error_Code UART Error Code | |||||
* @{ | |||||
*/ | |||||
#define HAL_UART_ERROR_NONE 0x00000000U /*!< No error */ | |||||
#define HAL_UART_ERROR_PE 0x00000001U /*!< Parity error */ | |||||
#define HAL_UART_ERROR_NE 0x00000002U /*!< Noise error */ | |||||
#define HAL_UART_ERROR_FE 0x00000004U /*!< Frame error */ | |||||
#define HAL_UART_ERROR_ORE 0x00000008U /*!< Overrun error */ | |||||
#define HAL_UART_ERROR_DMA 0x00000010U /*!< DMA transfer error */ | |||||
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) | |||||
#define HAL_UART_ERROR_INVALID_CALLBACK 0x00000020U /*!< Invalid Callback error */ | |||||
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup UART_Word_Length UART Word Length | |||||
* @{ | |||||
*/ | |||||
#define UART_WORDLENGTH_8B 0x00000000U | |||||
#define UART_WORDLENGTH_9B ((uint32_t)USART_CR1_M) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup UART_Stop_Bits UART Number of Stop Bits | |||||
* @{ | |||||
*/ | |||||
#define UART_STOPBITS_1 0x00000000U | |||||
#define UART_STOPBITS_2 ((uint32_t)USART_CR2_STOP_1) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup UART_Parity UART Parity | |||||
* @{ | |||||
*/ | |||||
#define UART_PARITY_NONE 0x00000000U | |||||
#define UART_PARITY_EVEN ((uint32_t)USART_CR1_PCE) | |||||
#define UART_PARITY_ODD ((uint32_t)(USART_CR1_PCE | USART_CR1_PS)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup UART_Hardware_Flow_Control UART Hardware Flow Control | |||||
* @{ | |||||
*/ | |||||
#define UART_HWCONTROL_NONE 0x00000000U | |||||
#define UART_HWCONTROL_RTS ((uint32_t)USART_CR3_RTSE) | |||||
#define UART_HWCONTROL_CTS ((uint32_t)USART_CR3_CTSE) | |||||
#define UART_HWCONTROL_RTS_CTS ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup UART_Mode UART Transfer Mode | |||||
* @{ | |||||
*/ | |||||
#define UART_MODE_RX ((uint32_t)USART_CR1_RE) | |||||
#define UART_MODE_TX ((uint32_t)USART_CR1_TE) | |||||
#define UART_MODE_TX_RX ((uint32_t)(USART_CR1_TE | USART_CR1_RE)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup UART_State UART State | |||||
* @{ | |||||
*/ | |||||
#define UART_STATE_DISABLE 0x00000000U | |||||
#define UART_STATE_ENABLE ((uint32_t)USART_CR1_UE) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup UART_Over_Sampling UART Over Sampling | |||||
* @{ | |||||
*/ | |||||
#define UART_OVERSAMPLING_16 0x00000000U | |||||
#define UART_OVERSAMPLING_8 ((uint32_t)USART_CR1_OVER8) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup UART_LIN_Break_Detection_Length UART LIN Break Detection Length | |||||
* @{ | |||||
*/ | |||||
#define UART_LINBREAKDETECTLENGTH_10B 0x00000000U | |||||
#define UART_LINBREAKDETECTLENGTH_11B ((uint32_t)USART_CR2_LBDL) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup UART_WakeUp_functions UART Wakeup Functions | |||||
* @{ | |||||
*/ | |||||
#define UART_WAKEUPMETHOD_IDLELINE 0x00000000U | |||||
#define UART_WAKEUPMETHOD_ADDRESSMARK ((uint32_t)USART_CR1_WAKE) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup UART_Flags UART FLags | |||||
* Elements values convention: 0xXXXX | |||||
* - 0xXXXX : Flag mask in the SR register | |||||
* @{ | |||||
*/ | |||||
#define UART_FLAG_CTS ((uint32_t)USART_SR_CTS) | |||||
#define UART_FLAG_LBD ((uint32_t)USART_SR_LBD) | |||||
#define UART_FLAG_TXE ((uint32_t)USART_SR_TXE) | |||||
#define UART_FLAG_TC ((uint32_t)USART_SR_TC) | |||||
#define UART_FLAG_RXNE ((uint32_t)USART_SR_RXNE) | |||||
#define UART_FLAG_IDLE ((uint32_t)USART_SR_IDLE) | |||||
#define UART_FLAG_ORE ((uint32_t)USART_SR_ORE) | |||||
#define UART_FLAG_NE ((uint32_t)USART_SR_NE) | |||||
#define UART_FLAG_FE ((uint32_t)USART_SR_FE) | |||||
#define UART_FLAG_PE ((uint32_t)USART_SR_PE) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup UART_Interrupt_definition UART Interrupt Definitions | |||||
* Elements values convention: 0xY000XXXX | |||||
* - XXXX : Interrupt mask (16 bits) in the Y register | |||||
* - Y : Interrupt source register (2bits) | |||||
* - 0001: CR1 register | |||||
* - 0010: CR2 register | |||||
* - 0011: CR3 register | |||||
* @{ | |||||
*/ | |||||
#define UART_IT_PE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_PEIE)) | |||||
#define UART_IT_TXE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_TXEIE)) | |||||
#define UART_IT_TC ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_TCIE)) | |||||
#define UART_IT_RXNE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_RXNEIE)) | |||||
#define UART_IT_IDLE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_IDLEIE)) | |||||
#define UART_IT_LBD ((uint32_t)(UART_CR2_REG_INDEX << 28U | USART_CR2_LBDIE)) | |||||
#define UART_IT_CTS ((uint32_t)(UART_CR3_REG_INDEX << 28U | USART_CR3_CTSIE)) | |||||
#define UART_IT_ERR ((uint32_t)(UART_CR3_REG_INDEX << 28U | USART_CR3_EIE)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
/** @defgroup UART_Exported_Macros UART Exported Macros | |||||
* @{ | |||||
*/ | |||||
/** @brief Reset UART handle gstate & RxState | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* UART Handle selects the USARTx or UARTy peripheral | |||||
* (USART,UART availability and x,y values depending on device). | |||||
* @retval None | |||||
*/ | |||||
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) | |||||
#define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__) do{ \ | |||||
(__HANDLE__)->gState = HAL_UART_STATE_RESET; \ | |||||
(__HANDLE__)->RxState = HAL_UART_STATE_RESET; \ | |||||
(__HANDLE__)->MspInitCallback = NULL; \ | |||||
(__HANDLE__)->MspDeInitCallback = NULL; \ | |||||
} while(0U) | |||||
#else | |||||
#define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__) do{ \ | |||||
(__HANDLE__)->gState = HAL_UART_STATE_RESET; \ | |||||
(__HANDLE__)->RxState = HAL_UART_STATE_RESET; \ | |||||
} while(0U) | |||||
#endif /*USE_HAL_UART_REGISTER_CALLBACKS */ | |||||
/** @brief Flushes the UART DR register | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* UART Handle selects the USARTx or UARTy peripheral | |||||
* (USART,UART availability and x,y values depending on device). | |||||
*/ | |||||
#define __HAL_UART_FLUSH_DRREGISTER(__HANDLE__) ((__HANDLE__)->Instance->DR) | |||||
/** @brief Checks whether the specified UART flag is set or not. | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* UART Handle selects the USARTx or UARTy peripheral | |||||
* (USART,UART availability and x,y values depending on device). | |||||
* @param __FLAG__ specifies the flag to check. | |||||
* This parameter can be one of the following values: | |||||
* @arg UART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5) | |||||
* @arg UART_FLAG_LBD: LIN Break detection flag | |||||
* @arg UART_FLAG_TXE: Transmit data register empty flag | |||||
* @arg UART_FLAG_TC: Transmission Complete flag | |||||
* @arg UART_FLAG_RXNE: Receive data register not empty flag | |||||
* @arg UART_FLAG_IDLE: Idle Line detection flag | |||||
* @arg UART_FLAG_ORE: Overrun Error flag | |||||
* @arg UART_FLAG_NE: Noise Error flag | |||||
* @arg UART_FLAG_FE: Framing Error flag | |||||
* @arg UART_FLAG_PE: Parity Error flag | |||||
* @retval The new state of __FLAG__ (TRUE or FALSE). | |||||
*/ | |||||
#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__)) | |||||
/** @brief Clears the specified UART pending flag. | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* UART Handle selects the USARTx or UARTy peripheral | |||||
* (USART,UART availability and x,y values depending on device). | |||||
* @param __FLAG__ specifies the flag to check. | |||||
* This parameter can be any combination of the following values: | |||||
* @arg UART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5). | |||||
* @arg UART_FLAG_LBD: LIN Break detection flag. | |||||
* @arg UART_FLAG_TC: Transmission Complete flag. | |||||
* @arg UART_FLAG_RXNE: Receive data register not empty flag. | |||||
* | |||||
* @note PE (Parity error), FE (Framing error), NE (Noise error), ORE (Overrun | |||||
* error) and IDLE (Idle line detected) flags are cleared by software | |||||
* sequence: a read operation to USART_SR register followed by a read | |||||
* operation to USART_DR register. | |||||
* @note RXNE flag can be also cleared by a read to the USART_DR register. | |||||
* @note TC flag can be also cleared by software sequence: a read operation to | |||||
* USART_SR register followed by a write operation to USART_DR register. | |||||
* @note TXE flag is cleared only by a write to the USART_DR register. | |||||
* | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) | |||||
/** @brief Clears the UART PE pending flag. | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* UART Handle selects the USARTx or UARTy peripheral | |||||
* (USART,UART availability and x,y values depending on device). | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_CLEAR_PEFLAG(__HANDLE__) \ | |||||
do{ \ | |||||
__IO uint32_t tmpreg = 0x00U; \ | |||||
tmpreg = (__HANDLE__)->Instance->SR; \ | |||||
tmpreg = (__HANDLE__)->Instance->DR; \ | |||||
UNUSED(tmpreg); \ | |||||
} while(0U) | |||||
/** @brief Clears the UART FE pending flag. | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* UART Handle selects the USARTx or UARTy peripheral | |||||
* (USART,UART availability and x,y values depending on device). | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_CLEAR_FEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) | |||||
/** @brief Clears the UART NE pending flag. | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* UART Handle selects the USARTx or UARTy peripheral | |||||
* (USART,UART availability and x,y values depending on device). | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_CLEAR_NEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) | |||||
/** @brief Clears the UART ORE pending flag. | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* UART Handle selects the USARTx or UARTy peripheral | |||||
* (USART,UART availability and x,y values depending on device). | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_CLEAR_OREFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) | |||||
/** @brief Clears the UART IDLE pending flag. | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* UART Handle selects the USARTx or UARTy peripheral | |||||
* (USART,UART availability and x,y values depending on device). | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) | |||||
/** @brief Enable the specified UART interrupt. | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* UART Handle selects the USARTx or UARTy peripheral | |||||
* (USART,UART availability and x,y values depending on device). | |||||
* @param __INTERRUPT__ specifies the UART interrupt source to enable. | |||||
* This parameter can be one of the following values: | |||||
* @arg UART_IT_CTS: CTS change interrupt | |||||
* @arg UART_IT_LBD: LIN Break detection interrupt | |||||
* @arg UART_IT_TXE: Transmit Data Register empty interrupt | |||||
* @arg UART_IT_TC: Transmission complete interrupt | |||||
* @arg UART_IT_RXNE: Receive Data register not empty interrupt | |||||
* @arg UART_IT_IDLE: Idle line detection interrupt | |||||
* @arg UART_IT_PE: Parity Error interrupt | |||||
* @arg UART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__HANDLE__)->Instance->CR1 |= ((__INTERRUPT__) & UART_IT_MASK)): \ | |||||
(((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__HANDLE__)->Instance->CR2 |= ((__INTERRUPT__) & UART_IT_MASK)): \ | |||||
((__HANDLE__)->Instance->CR3 |= ((__INTERRUPT__) & UART_IT_MASK))) | |||||
/** @brief Disable the specified UART interrupt. | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* UART Handle selects the USARTx or UARTy peripheral | |||||
* (USART,UART availability and x,y values depending on device). | |||||
* @param __INTERRUPT__ specifies the UART interrupt source to disable. | |||||
* This parameter can be one of the following values: | |||||
* @arg UART_IT_CTS: CTS change interrupt | |||||
* @arg UART_IT_LBD: LIN Break detection interrupt | |||||
* @arg UART_IT_TXE: Transmit Data Register empty interrupt | |||||
* @arg UART_IT_TC: Transmission complete interrupt | |||||
* @arg UART_IT_RXNE: Receive Data register not empty interrupt | |||||
* @arg UART_IT_IDLE: Idle line detection interrupt | |||||
* @arg UART_IT_PE: Parity Error interrupt | |||||
* @arg UART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__HANDLE__)->Instance->CR1 &= ~((__INTERRUPT__) & UART_IT_MASK)): \ | |||||
(((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__HANDLE__)->Instance->CR2 &= ~((__INTERRUPT__) & UART_IT_MASK)): \ | |||||
((__HANDLE__)->Instance->CR3 &= ~ ((__INTERRUPT__) & UART_IT_MASK))) | |||||
/** @brief Checks whether the specified UART interrupt source is enabled or not. | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* UART Handle selects the USARTx or UARTy peripheral | |||||
* (USART,UART availability and x,y values depending on device). | |||||
* @param __IT__ specifies the UART interrupt source to check. | |||||
* This parameter can be one of the following values: | |||||
* @arg UART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) | |||||
* @arg UART_IT_LBD: LIN Break detection interrupt | |||||
* @arg UART_IT_TXE: Transmit Data Register empty interrupt | |||||
* @arg UART_IT_TC: Transmission complete interrupt | |||||
* @arg UART_IT_RXNE: Receive Data register not empty interrupt | |||||
* @arg UART_IT_IDLE: Idle line detection interrupt | |||||
* @arg UART_IT_ERR: Error interrupt | |||||
* @retval The new state of __IT__ (TRUE or FALSE). | |||||
*/ | |||||
#define __HAL_UART_GET_IT_SOURCE(__HANDLE__, __IT__) (((((__IT__) >> 28U) == UART_CR1_REG_INDEX)? (__HANDLE__)->Instance->CR1:(((((uint32_t)(__IT__)) >> 28U) == UART_CR2_REG_INDEX)? \ | |||||
(__HANDLE__)->Instance->CR2 : (__HANDLE__)->Instance->CR3)) & (((uint32_t)(__IT__)) & UART_IT_MASK)) | |||||
/** @brief Enable CTS flow control | |||||
* @note This macro allows to enable CTS hardware flow control for a given UART instance, | |||||
* without need to call HAL_UART_Init() function. | |||||
* As involving direct access to UART registers, usage of this macro should be fully endorsed by user. | |||||
* @note As macro is expected to be used for modifying CTS Hw flow control feature activation, without need | |||||
* for USART instance Deinit/Init, following conditions for macro call should be fulfilled : | |||||
* - UART instance should have already been initialised (through call of HAL_UART_Init() ) | |||||
* - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) | |||||
* and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* The Handle Instance can be any USARTx (supporting the HW Flow control feature). | |||||
* It is used to select the USART peripheral (USART availability and x value depending on device). | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_HWCONTROL_CTS_ENABLE(__HANDLE__) \ | |||||
do{ \ | |||||
SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE); \ | |||||
(__HANDLE__)->Init.HwFlowCtl |= USART_CR3_CTSE; \ | |||||
} while(0U) | |||||
/** @brief Disable CTS flow control | |||||
* @note This macro allows to disable CTS hardware flow control for a given UART instance, | |||||
* without need to call HAL_UART_Init() function. | |||||
* As involving direct access to UART registers, usage of this macro should be fully endorsed by user. | |||||
* @note As macro is expected to be used for modifying CTS Hw flow control feature activation, without need | |||||
* for USART instance Deinit/Init, following conditions for macro call should be fulfilled : | |||||
* - UART instance should have already been initialised (through call of HAL_UART_Init() ) | |||||
* - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) | |||||
* and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* The Handle Instance can be any USARTx (supporting the HW Flow control feature). | |||||
* It is used to select the USART peripheral (USART availability and x value depending on device). | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_HWCONTROL_CTS_DISABLE(__HANDLE__) \ | |||||
do{ \ | |||||
CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE); \ | |||||
(__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_CTSE); \ | |||||
} while(0U) | |||||
/** @brief Enable RTS flow control | |||||
* This macro allows to enable RTS hardware flow control for a given UART instance, | |||||
* without need to call HAL_UART_Init() function. | |||||
* As involving direct access to UART registers, usage of this macro should be fully endorsed by user. | |||||
* @note As macro is expected to be used for modifying RTS Hw flow control feature activation, without need | |||||
* for USART instance Deinit/Init, following conditions for macro call should be fulfilled : | |||||
* - UART instance should have already been initialised (through call of HAL_UART_Init() ) | |||||
* - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) | |||||
* and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* The Handle Instance can be any USARTx (supporting the HW Flow control feature). | |||||
* It is used to select the USART peripheral (USART availability and x value depending on device). | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_HWCONTROL_RTS_ENABLE(__HANDLE__) \ | |||||
do{ \ | |||||
SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE); \ | |||||
(__HANDLE__)->Init.HwFlowCtl |= USART_CR3_RTSE; \ | |||||
} while(0U) | |||||
/** @brief Disable RTS flow control | |||||
* This macro allows to disable RTS hardware flow control for a given UART instance, | |||||
* without need to call HAL_UART_Init() function. | |||||
* As involving direct access to UART registers, usage of this macro should be fully endorsed by user. | |||||
* @note As macro is expected to be used for modifying RTS Hw flow control feature activation, without need | |||||
* for USART instance Deinit/Init, following conditions for macro call should be fulfilled : | |||||
* - UART instance should have already been initialised (through call of HAL_UART_Init() ) | |||||
* - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) | |||||
* and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* The Handle Instance can be any USARTx (supporting the HW Flow control feature). | |||||
* It is used to select the USART peripheral (USART availability and x value depending on device). | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_HWCONTROL_RTS_DISABLE(__HANDLE__) \ | |||||
do{ \ | |||||
CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE);\ | |||||
(__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_RTSE); \ | |||||
} while(0U) | |||||
/** @brief Macro to enable the UART's one bit sample method | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_ONE_BIT_SAMPLE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3|= USART_CR3_ONEBIT) | |||||
/** @brief Macro to disable the UART's one bit sample method | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_ONE_BIT_SAMPLE_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_ONEBIT)) | |||||
/** @brief Enable UART | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE) | |||||
/** @brief Disable UART | |||||
* @param __HANDLE__ specifies the UART Handle. | |||||
* @retval None | |||||
*/ | |||||
#define __HAL_UART_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~USART_CR1_UE) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @addtogroup UART_Exported_Functions | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup UART_Exported_Functions_Group1 Initialization and de-initialization functions | |||||
* @{ | |||||
*/ | |||||
/* Initialization/de-initialization functions **********************************/ | |||||
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength); | |||||
HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod); | |||||
HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart); | |||||
void HAL_UART_MspInit(UART_HandleTypeDef *huart); | |||||
void HAL_UART_MspDeInit(UART_HandleTypeDef *huart); | |||||
/* Callbacks Register/UnRegister functions ***********************************/ | |||||
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) | |||||
HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, pUART_CallbackTypeDef pCallback); | |||||
HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID); | |||||
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup UART_Exported_Functions_Group2 IO operation functions | |||||
* @{ | |||||
*/ | |||||
/* IO operation functions *******************************************************/ | |||||
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); | |||||
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); | |||||
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); | |||||
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); | |||||
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); | |||||
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); | |||||
HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart); | |||||
/* Transfer Abort functions */ | |||||
HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart); | |||||
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart); | |||||
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); | |||||
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); | |||||
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); | |||||
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart); | |||||
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart); | |||||
void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart); | |||||
void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart); | |||||
void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup UART_Exported_Functions_Group3 | |||||
* @{ | |||||
*/ | |||||
/* Peripheral Control functions ************************************************/ | |||||
HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart); | |||||
HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup UART_Exported_Functions_Group4 | |||||
* @{ | |||||
*/ | |||||
/* Peripheral State functions **************************************************/ | |||||
HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart); | |||||
uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private types -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private constants ---------------------------------------------------------*/ | |||||
/** @defgroup UART_Private_Constants UART Private Constants | |||||
* @{ | |||||
*/ | |||||
/** @brief UART interruptions flag mask | |||||
* | |||||
*/ | |||||
#define UART_IT_MASK 0x0000FFFFU | |||||
#define UART_CR1_REG_INDEX 1U | |||||
#define UART_CR2_REG_INDEX 2U | |||||
#define UART_CR3_REG_INDEX 3U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/** @defgroup UART_Private_Macros UART Private Macros | |||||
* @{ | |||||
*/ | |||||
#define IS_UART_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B) || \ | |||||
((LENGTH) == UART_WORDLENGTH_9B)) | |||||
#define IS_UART_LIN_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B)) | |||||
#define IS_UART_STOPBITS(STOPBITS) (((STOPBITS) == UART_STOPBITS_1) || \ | |||||
((STOPBITS) == UART_STOPBITS_2)) | |||||
#define IS_UART_PARITY(PARITY) (((PARITY) == UART_PARITY_NONE) || \ | |||||
((PARITY) == UART_PARITY_EVEN) || \ | |||||
((PARITY) == UART_PARITY_ODD)) | |||||
#define IS_UART_HARDWARE_FLOW_CONTROL(CONTROL)\ | |||||
(((CONTROL) == UART_HWCONTROL_NONE) || \ | |||||
((CONTROL) == UART_HWCONTROL_RTS) || \ | |||||
((CONTROL) == UART_HWCONTROL_CTS) || \ | |||||
((CONTROL) == UART_HWCONTROL_RTS_CTS)) | |||||
#define IS_UART_MODE(MODE) ((((MODE) & 0x0000FFF3U) == 0x00U) && ((MODE) != 0x00U)) | |||||
#define IS_UART_STATE(STATE) (((STATE) == UART_STATE_DISABLE) || \ | |||||
((STATE) == UART_STATE_ENABLE)) | |||||
#define IS_UART_OVERSAMPLING(SAMPLING) (((SAMPLING) == UART_OVERSAMPLING_16) || \ | |||||
((SAMPLING) == UART_OVERSAMPLING_8)) | |||||
#define IS_UART_LIN_OVERSAMPLING(SAMPLING) (((SAMPLING) == UART_OVERSAMPLING_16)) | |||||
#define IS_UART_LIN_BREAK_DETECT_LENGTH(LENGTH) (((LENGTH) == UART_LINBREAKDETECTLENGTH_10B) || \ | |||||
((LENGTH) == UART_LINBREAKDETECTLENGTH_11B)) | |||||
#define IS_UART_WAKEUPMETHOD(WAKEUP) (((WAKEUP) == UART_WAKEUPMETHOD_IDLELINE) || \ | |||||
((WAKEUP) == UART_WAKEUPMETHOD_ADDRESSMARK)) | |||||
#define IS_UART_BAUDRATE(BAUDRATE) ((BAUDRATE) <= 10500000U) | |||||
#define IS_UART_ADDRESS(ADDRESS) ((ADDRESS) <= 0x0FU) | |||||
#define UART_DIV_SAMPLING16(_PCLK_, _BAUD_) ((uint32_t)((((uint64_t)(_PCLK_))*25U)/(4U*((uint64_t)(_BAUD_))))) | |||||
#define UART_DIVMANT_SAMPLING16(_PCLK_, _BAUD_) (UART_DIV_SAMPLING16((_PCLK_), (_BAUD_))/100U) | |||||
#define UART_DIVFRAQ_SAMPLING16(_PCLK_, _BAUD_) ((((UART_DIV_SAMPLING16((_PCLK_), (_BAUD_)) - (UART_DIVMANT_SAMPLING16((_PCLK_), (_BAUD_)) * 100U)) * 16U) + 50U) / 100U) | |||||
/* UART BRR = mantissa + overflow + fraction | |||||
= (UART DIVMANT << 4) + (UART DIVFRAQ & 0xF0) + (UART DIVFRAQ & 0x0FU) */ | |||||
#define UART_BRR_SAMPLING16(_PCLK_, _BAUD_) ((UART_DIVMANT_SAMPLING16((_PCLK_), (_BAUD_)) << 4U) + \ | |||||
(UART_DIVFRAQ_SAMPLING16((_PCLK_), (_BAUD_)) & 0xF0U) + \ | |||||
(UART_DIVFRAQ_SAMPLING16((_PCLK_), (_BAUD_)) & 0x0FU)) | |||||
#define UART_DIV_SAMPLING8(_PCLK_, _BAUD_) ((uint32_t)((((uint64_t)(_PCLK_))*25U)/(2U*((uint64_t)(_BAUD_))))) | |||||
#define UART_DIVMANT_SAMPLING8(_PCLK_, _BAUD_) (UART_DIV_SAMPLING8((_PCLK_), (_BAUD_))/100U) | |||||
#define UART_DIVFRAQ_SAMPLING8(_PCLK_, _BAUD_) ((((UART_DIV_SAMPLING8((_PCLK_), (_BAUD_)) - (UART_DIVMANT_SAMPLING8((_PCLK_), (_BAUD_)) * 100U)) * 8U) + 50U) / 100U) | |||||
/* UART BRR = mantissa + overflow + fraction | |||||
= (UART DIVMANT << 4) + ((UART DIVFRAQ & 0xF8) << 1) + (UART DIVFRAQ & 0x07U) */ | |||||
#define UART_BRR_SAMPLING8(_PCLK_, _BAUD_) ((UART_DIVMANT_SAMPLING8((_PCLK_), (_BAUD_)) << 4U) + \ | |||||
((UART_DIVFRAQ_SAMPLING8((_PCLK_), (_BAUD_)) & 0xF8U) << 1U) + \ | |||||
(UART_DIVFRAQ_SAMPLING8((_PCLK_), (_BAUD_)) & 0x07U)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/** @defgroup UART_Private_Functions UART Private Functions | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32F4xx_HAL_UART_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal.c | |||||
* @author MCD Application Team | |||||
* @brief HAL module driver. | |||||
* This is the common part of the HAL initialization | |||||
* | |||||
@verbatim | |||||
============================================================================== | |||||
##### How to use this driver ##### | |||||
============================================================================== | |||||
[..] | |||||
The common HAL driver contains a set of generic and common APIs that can be | |||||
used by the PPP peripheral drivers and the user to start using the HAL. | |||||
[..] | |||||
The HAL contains two APIs' categories: | |||||
(+) Common HAL APIs | |||||
(+) Services HAL APIs | |||||
@endverbatim | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @defgroup HAL HAL | |||||
* @brief HAL module driver. | |||||
* @{ | |||||
*/ | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* Private define ------------------------------------------------------------*/ | |||||
/** @addtogroup HAL_Private_Constants | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief STM32F4xx HAL Driver version number V1.7.10 | |||||
*/ | |||||
#define __STM32F4xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ | |||||
#define __STM32F4xx_HAL_VERSION_SUB1 (0x07U) /*!< [23:16] sub1 version */ | |||||
#define __STM32F4xx_HAL_VERSION_SUB2 (0x0AU) /*!< [15:8] sub2 version */ | |||||
#define __STM32F4xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ | |||||
#define __STM32F4xx_HAL_VERSION ((__STM32F4xx_HAL_VERSION_MAIN << 24U)\ | |||||
|(__STM32F4xx_HAL_VERSION_SUB1 << 16U)\ | |||||
|(__STM32F4xx_HAL_VERSION_SUB2 << 8U )\ | |||||
|(__STM32F4xx_HAL_VERSION_RC)) | |||||
#define IDCODE_DEVID_MASK 0x00000FFFU | |||||
/* ------------ RCC registers bit address in the alias region ----------- */ | |||||
#define SYSCFG_OFFSET (SYSCFG_BASE - PERIPH_BASE) | |||||
/* --- MEMRMP Register ---*/ | |||||
/* Alias word address of UFB_MODE bit */ | |||||
#define MEMRMP_OFFSET SYSCFG_OFFSET | |||||
#define UFB_MODE_BIT_NUMBER SYSCFG_MEMRMP_UFB_MODE_Pos | |||||
#define UFB_MODE_BB (uint32_t)(PERIPH_BB_BASE + (MEMRMP_OFFSET * 32U) + (UFB_MODE_BIT_NUMBER * 4U)) | |||||
/* --- CMPCR Register ---*/ | |||||
/* Alias word address of CMP_PD bit */ | |||||
#define CMPCR_OFFSET (SYSCFG_OFFSET + 0x20U) | |||||
#define CMP_PD_BIT_NUMBER SYSCFG_CMPCR_CMP_PD_Pos | |||||
#define CMPCR_CMP_PD_BB (uint32_t)(PERIPH_BB_BASE + (CMPCR_OFFSET * 32U) + (CMP_PD_BIT_NUMBER * 4U)) | |||||
/* --- MCHDLYCR Register ---*/ | |||||
/* Alias word address of BSCKSEL bit */ | |||||
#define MCHDLYCR_OFFSET (SYSCFG_OFFSET + 0x30U) | |||||
#define BSCKSEL_BIT_NUMBER SYSCFG_MCHDLYCR_BSCKSEL_Pos | |||||
#define MCHDLYCR_BSCKSEL_BB (uint32_t)(PERIPH_BB_BASE + (MCHDLYCR_OFFSET * 32U) + (BSCKSEL_BIT_NUMBER * 4U)) | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/** @addtogroup HAL_Private_Variables | |||||
* @{ | |||||
*/ | |||||
__IO uint32_t uwTick; | |||||
uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */ | |||||
HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/** @defgroup HAL_Exported_Functions HAL Exported Functions | |||||
* @{ | |||||
*/ | |||||
/** @defgroup HAL_Exported_Functions_Group1 Initialization and de-initialization Functions | |||||
* @brief Initialization and de-initialization functions | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### Initialization and Configuration functions ##### | |||||
=============================================================================== | |||||
[..] This section provides functions allowing to: | |||||
(+) Initializes the Flash interface the NVIC allocation and initial clock | |||||
configuration. It initializes the systick also when timeout is needed | |||||
and the backup domain when enabled. | |||||
(+) De-Initializes common part of the HAL. | |||||
(+) Configure the time base source to have 1ms time base with a dedicated | |||||
Tick interrupt priority. | |||||
(++) SysTick timer is used by default as source of time base, but user | |||||
can eventually implement his proper time base source (a general purpose | |||||
timer for example or other time source), keeping in mind that Time base | |||||
duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and | |||||
handled in milliseconds basis. | |||||
(++) Time base configuration function (HAL_InitTick ()) is called automatically | |||||
at the beginning of the program after reset by HAL_Init() or at any time | |||||
when clock is configured, by HAL_RCC_ClockConfig(). | |||||
(++) Source of time base is configured to generate interrupts at regular | |||||
time intervals. Care must be taken if HAL_Delay() is called from a | |||||
peripheral ISR process, the Tick interrupt line must have higher priority | |||||
(numerically lower) than the peripheral interrupt. Otherwise the caller | |||||
ISR process will be blocked. | |||||
(++) functions affecting time base configurations are declared as __weak | |||||
to make override possible in case of other implementations in user file. | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief This function is used to initialize the HAL Library; it must be the first | |||||
* instruction to be executed in the main program (before to call any other | |||||
* HAL function), it performs the following: | |||||
* Configure the Flash prefetch, instruction and Data caches. | |||||
* Configures the SysTick to generate an interrupt each 1 millisecond, | |||||
* which is clocked by the HSI (at this stage, the clock is not yet | |||||
* configured and thus the system is running from the internal HSI at 16 MHz). | |||||
* Set NVIC Group Priority to 4. | |||||
* Calls the HAL_MspInit() callback function defined in user file | |||||
* "stm32f4xx_hal_msp.c" to do the global low level hardware initialization | |||||
* | |||||
* @note SysTick is used as time base for the HAL_Delay() function, the application | |||||
* need to ensure that the SysTick time base is always set to 1 millisecond | |||||
* to have correct HAL operation. | |||||
* @retval HAL status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_Init(void) | |||||
{ | |||||
/* Configure Flash prefetch, Instruction cache, Data cache */ | |||||
#if (INSTRUCTION_CACHE_ENABLE != 0U) | |||||
__HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); | |||||
#endif /* INSTRUCTION_CACHE_ENABLE */ | |||||
#if (DATA_CACHE_ENABLE != 0U) | |||||
__HAL_FLASH_DATA_CACHE_ENABLE(); | |||||
#endif /* DATA_CACHE_ENABLE */ | |||||
#if (PREFETCH_ENABLE != 0U) | |||||
__HAL_FLASH_PREFETCH_BUFFER_ENABLE(); | |||||
#endif /* PREFETCH_ENABLE */ | |||||
/* Set Interrupt Group Priority */ | |||||
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); | |||||
/* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ | |||||
HAL_InitTick(TICK_INT_PRIORITY); | |||||
/* Init the low level hardware */ | |||||
HAL_MspInit(); | |||||
/* Return function status */ | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief This function de-Initializes common part of the HAL and stops the systick. | |||||
* This function is optional. | |||||
* @retval HAL status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_DeInit(void) | |||||
{ | |||||
/* Reset of all peripherals */ | |||||
__HAL_RCC_APB1_FORCE_RESET(); | |||||
__HAL_RCC_APB1_RELEASE_RESET(); | |||||
__HAL_RCC_APB2_FORCE_RESET(); | |||||
__HAL_RCC_APB2_RELEASE_RESET(); | |||||
__HAL_RCC_AHB1_FORCE_RESET(); | |||||
__HAL_RCC_AHB1_RELEASE_RESET(); | |||||
__HAL_RCC_AHB2_FORCE_RESET(); | |||||
__HAL_RCC_AHB2_RELEASE_RESET(); | |||||
__HAL_RCC_AHB3_FORCE_RESET(); | |||||
__HAL_RCC_AHB3_RELEASE_RESET(); | |||||
/* De-Init the low level hardware */ | |||||
HAL_MspDeInit(); | |||||
/* Return function status */ | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Initialize the MSP. | |||||
* @retval None | |||||
*/ | |||||
__weak void HAL_MspInit(void) | |||||
{ | |||||
/* NOTE : This function should not be modified, when the callback is needed, | |||||
the HAL_MspInit could be implemented in the user file | |||||
*/ | |||||
} | |||||
/** | |||||
* @brief DeInitializes the MSP. | |||||
* @retval None | |||||
*/ | |||||
__weak void HAL_MspDeInit(void) | |||||
{ | |||||
/* NOTE : This function should not be modified, when the callback is needed, | |||||
the HAL_MspDeInit could be implemented in the user file | |||||
*/ | |||||
} | |||||
/** | |||||
* @brief This function configures the source of the time base. | |||||
* The time source is configured to have 1ms time base with a dedicated | |||||
* Tick interrupt priority. | |||||
* @note This function is called automatically at the beginning of program after | |||||
* reset by HAL_Init() or at any time when clock is reconfigured by HAL_RCC_ClockConfig(). | |||||
* @note In the default implementation, SysTick timer is the source of time base. | |||||
* It is used to generate interrupts at regular time intervals. | |||||
* Care must be taken if HAL_Delay() is called from a peripheral ISR process, | |||||
* The SysTick interrupt must have higher priority (numerically lower) | |||||
* than the peripheral interrupt. Otherwise the caller ISR process will be blocked. | |||||
* The function is declared as __weak to be overwritten in case of other | |||||
* implementation in user file. | |||||
* @param TickPriority Tick interrupt priority. | |||||
* @retval HAL status | |||||
*/ | |||||
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) | |||||
{ | |||||
/* Configure the SysTick to have interrupt in 1ms time basis*/ | |||||
if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) | |||||
{ | |||||
return HAL_ERROR; | |||||
} | |||||
/* Configure the SysTick IRQ priority */ | |||||
if (TickPriority < (1UL << __NVIC_PRIO_BITS)) | |||||
{ | |||||
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); | |||||
uwTickPrio = TickPriority; | |||||
} | |||||
else | |||||
{ | |||||
return HAL_ERROR; | |||||
} | |||||
/* Return function status */ | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup HAL_Exported_Functions_Group2 HAL Control functions | |||||
* @brief HAL Control functions | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### HAL Control functions ##### | |||||
=============================================================================== | |||||
[..] This section provides functions allowing to: | |||||
(+) Provide a tick value in millisecond | |||||
(+) Provide a blocking delay in millisecond | |||||
(+) Suspend the time base source interrupt | |||||
(+) Resume the time base source interrupt | |||||
(+) Get the HAL API driver version | |||||
(+) Get the device identifier | |||||
(+) Get the device revision identifier | |||||
(+) Enable/Disable Debug module during SLEEP mode | |||||
(+) Enable/Disable Debug module during STOP mode | |||||
(+) Enable/Disable Debug module during STANDBY mode | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief This function is called to increment a global variable "uwTick" | |||||
* used as application time base. | |||||
* @note In the default implementation, this variable is incremented each 1ms | |||||
* in SysTick ISR. | |||||
* @note This function is declared as __weak to be overwritten in case of other | |||||
* implementations in user file. | |||||
* @retval None | |||||
*/ | |||||
__weak void HAL_IncTick(void) | |||||
{ | |||||
uwTick += uwTickFreq; | |||||
} | |||||
/** | |||||
* @brief Provides a tick value in millisecond. | |||||
* @note This function is declared as __weak to be overwritten in case of other | |||||
* implementations in user file. | |||||
* @retval tick value | |||||
*/ | |||||
__weak uint32_t HAL_GetTick(void) | |||||
{ | |||||
return uwTick; | |||||
} | |||||
/** | |||||
* @brief This function returns a tick priority. | |||||
* @retval tick priority | |||||
*/ | |||||
uint32_t HAL_GetTickPrio(void) | |||||
{ | |||||
return uwTickPrio; | |||||
} | |||||
/** | |||||
* @brief Set new tick Freq. | |||||
* @retval Status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) | |||||
{ | |||||
HAL_StatusTypeDef status = HAL_OK; | |||||
HAL_TickFreqTypeDef prevTickFreq; | |||||
assert_param(IS_TICKFREQ(Freq)); | |||||
if (uwTickFreq != Freq) | |||||
{ | |||||
/* Back up uwTickFreq frequency */ | |||||
prevTickFreq = uwTickFreq; | |||||
/* Update uwTickFreq global variable used by HAL_InitTick() */ | |||||
uwTickFreq = Freq; | |||||
/* Apply the new tick Freq */ | |||||
status = HAL_InitTick(uwTickPrio); | |||||
if (status != HAL_OK) | |||||
{ | |||||
/* Restore previous tick frequency */ | |||||
uwTickFreq = prevTickFreq; | |||||
} | |||||
} | |||||
return status; | |||||
} | |||||
/** | |||||
* @brief Return tick frequency. | |||||
* @retval tick period in Hz | |||||
*/ | |||||
HAL_TickFreqTypeDef HAL_GetTickFreq(void) | |||||
{ | |||||
return uwTickFreq; | |||||
} | |||||
/** | |||||
* @brief This function provides minimum delay (in milliseconds) based | |||||
* on variable incremented. | |||||
* @note In the default implementation , SysTick timer is the source of time base. | |||||
* It is used to generate interrupts at regular time intervals where uwTick | |||||
* is incremented. | |||||
* @note This function is declared as __weak to be overwritten in case of other | |||||
* implementations in user file. | |||||
* @param Delay specifies the delay time length, in milliseconds. | |||||
* @retval None | |||||
*/ | |||||
__weak void HAL_Delay(uint32_t Delay) | |||||
{ | |||||
uint32_t tickstart = HAL_GetTick(); | |||||
uint32_t wait = Delay; | |||||
/* Add a freq to guarantee minimum wait */ | |||||
if (wait < HAL_MAX_DELAY) | |||||
{ | |||||
wait += (uint32_t)(uwTickFreq); | |||||
} | |||||
while((HAL_GetTick() - tickstart) < wait) | |||||
{ | |||||
} | |||||
} | |||||
/** | |||||
* @brief Suspend Tick increment. | |||||
* @note In the default implementation , SysTick timer is the source of time base. It is | |||||
* used to generate interrupts at regular time intervals. Once HAL_SuspendTick() | |||||
* is called, the SysTick interrupt will be disabled and so Tick increment | |||||
* is suspended. | |||||
* @note This function is declared as __weak to be overwritten in case of other | |||||
* implementations in user file. | |||||
* @retval None | |||||
*/ | |||||
__weak void HAL_SuspendTick(void) | |||||
{ | |||||
/* Disable SysTick Interrupt */ | |||||
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; | |||||
} | |||||
/** | |||||
* @brief Resume Tick increment. | |||||
* @note In the default implementation , SysTick timer is the source of time base. It is | |||||
* used to generate interrupts at regular time intervals. Once HAL_ResumeTick() | |||||
* is called, the SysTick interrupt will be enabled and so Tick increment | |||||
* is resumed. | |||||
* @note This function is declared as __weak to be overwritten in case of other | |||||
* implementations in user file. | |||||
* @retval None | |||||
*/ | |||||
__weak void HAL_ResumeTick(void) | |||||
{ | |||||
/* Enable SysTick Interrupt */ | |||||
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; | |||||
} | |||||
/** | |||||
* @brief Returns the HAL revision | |||||
* @retval version : 0xXYZR (8bits for each decimal, R for RC) | |||||
*/ | |||||
uint32_t HAL_GetHalVersion(void) | |||||
{ | |||||
return __STM32F4xx_HAL_VERSION; | |||||
} | |||||
/** | |||||
* @brief Returns the device revision identifier. | |||||
* @retval Device revision identifier | |||||
*/ | |||||
uint32_t HAL_GetREVID(void) | |||||
{ | |||||
return((DBGMCU->IDCODE) >> 16U); | |||||
} | |||||
/** | |||||
* @brief Returns the device identifier. | |||||
* @retval Device identifier | |||||
*/ | |||||
uint32_t HAL_GetDEVID(void) | |||||
{ | |||||
return((DBGMCU->IDCODE) & IDCODE_DEVID_MASK); | |||||
} | |||||
/** | |||||
* @brief Enable the Debug Module during SLEEP mode | |||||
* @retval None | |||||
*/ | |||||
void HAL_DBGMCU_EnableDBGSleepMode(void) | |||||
{ | |||||
SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); | |||||
} | |||||
/** | |||||
* @brief Disable the Debug Module during SLEEP mode | |||||
* @retval None | |||||
*/ | |||||
void HAL_DBGMCU_DisableDBGSleepMode(void) | |||||
{ | |||||
CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); | |||||
} | |||||
/** | |||||
* @brief Enable the Debug Module during STOP mode | |||||
* @retval None | |||||
*/ | |||||
void HAL_DBGMCU_EnableDBGStopMode(void) | |||||
{ | |||||
SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); | |||||
} | |||||
/** | |||||
* @brief Disable the Debug Module during STOP mode | |||||
* @retval None | |||||
*/ | |||||
void HAL_DBGMCU_DisableDBGStopMode(void) | |||||
{ | |||||
CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); | |||||
} | |||||
/** | |||||
* @brief Enable the Debug Module during STANDBY mode | |||||
* @retval None | |||||
*/ | |||||
void HAL_DBGMCU_EnableDBGStandbyMode(void) | |||||
{ | |||||
SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); | |||||
} | |||||
/** | |||||
* @brief Disable the Debug Module during STANDBY mode | |||||
* @retval None | |||||
*/ | |||||
void HAL_DBGMCU_DisableDBGStandbyMode(void) | |||||
{ | |||||
CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); | |||||
} | |||||
/** | |||||
* @brief Enables the I/O Compensation Cell. | |||||
* @note The I/O compensation cell can be used only when the device supply | |||||
* voltage ranges from 2.4 to 3.6 V. | |||||
* @retval None | |||||
*/ | |||||
void HAL_EnableCompensationCell(void) | |||||
{ | |||||
*(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)ENABLE; | |||||
} | |||||
/** | |||||
* @brief Power-down the I/O Compensation Cell. | |||||
* @note The I/O compensation cell can be used only when the device supply | |||||
* voltage ranges from 2.4 to 3.6 V. | |||||
* @retval None | |||||
*/ | |||||
void HAL_DisableCompensationCell(void) | |||||
{ | |||||
*(__IO uint32_t *)CMPCR_CMP_PD_BB = (uint32_t)DISABLE; | |||||
} | |||||
/** | |||||
* @brief Returns first word of the unique device identifier (UID based on 96 bits) | |||||
* @retval Device identifier | |||||
*/ | |||||
uint32_t HAL_GetUIDw0(void) | |||||
{ | |||||
return (READ_REG(*((uint32_t *)UID_BASE))); | |||||
} | |||||
/** | |||||
* @brief Returns second word of the unique device identifier (UID based on 96 bits) | |||||
* @retval Device identifier | |||||
*/ | |||||
uint32_t HAL_GetUIDw1(void) | |||||
{ | |||||
return (READ_REG(*((uint32_t *)(UID_BASE + 4U)))); | |||||
} | |||||
/** | |||||
* @brief Returns third word of the unique device identifier (UID based on 96 bits) | |||||
* @retval Device identifier | |||||
*/ | |||||
uint32_t HAL_GetUIDw2(void) | |||||
{ | |||||
return (READ_REG(*((uint32_t *)(UID_BASE + 8U)))); | |||||
} | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ | |||||
defined(STM32F469xx) || defined(STM32F479xx) | |||||
/** | |||||
* @brief Enables the Internal FLASH Bank Swapping. | |||||
* | |||||
* @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. | |||||
* | |||||
* @note Flash Bank2 mapped at 0x08000000 (and aliased @0x00000000) | |||||
* and Flash Bank1 mapped at 0x08100000 (and aliased at 0x00100000) | |||||
* | |||||
* @retval None | |||||
*/ | |||||
void HAL_EnableMemorySwappingBank(void) | |||||
{ | |||||
*(__IO uint32_t *)UFB_MODE_BB = (uint32_t)ENABLE; | |||||
} | |||||
/** | |||||
* @brief Disables the Internal FLASH Bank Swapping. | |||||
* | |||||
* @note This function can be used only for STM32F42xxx/43xxx/469xx/479xx devices. | |||||
* | |||||
* @note The default state : Flash Bank1 mapped at 0x08000000 (and aliased @0x00000000) | |||||
* and Flash Bank2 mapped at 0x08100000 (and aliased at 0x00100000) | |||||
* | |||||
* @retval None | |||||
*/ | |||||
void HAL_DisableMemorySwappingBank(void) | |||||
{ | |||||
*(__IO uint32_t *)UFB_MODE_BB = (uint32_t)DISABLE; | |||||
} | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_cortex.c | |||||
* @author MCD Application Team | |||||
* @brief CORTEX HAL module driver. | |||||
* This file provides firmware functions to manage the following | |||||
* functionalities of the CORTEX: | |||||
* + Initialization and de-initialization functions | |||||
* + Peripheral Control functions | |||||
* | |||||
@verbatim | |||||
============================================================================== | |||||
##### How to use this driver ##### | |||||
============================================================================== | |||||
[..] | |||||
*** How to configure Interrupts using CORTEX HAL driver *** | |||||
=========================================================== | |||||
[..] | |||||
This section provides functions allowing to configure the NVIC interrupts (IRQ). | |||||
The Cortex-M4 exceptions are managed by CMSIS functions. | |||||
(#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() | |||||
function according to the following table. | |||||
(#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority(). | |||||
(#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). | |||||
(#) please refer to programming manual for details in how to configure priority. | |||||
-@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible. | |||||
The pending IRQ priority will be managed only by the sub priority. | |||||
-@- IRQ priority order (sorted by highest to lowest priority): | |||||
(+@) Lowest preemption priority | |||||
(+@) Lowest sub priority | |||||
(+@) Lowest hardware priority (IRQ number) | |||||
[..] | |||||
*** How to configure Systick using CORTEX HAL driver *** | |||||
======================================================== | |||||
[..] | |||||
Setup SysTick Timer for time base. | |||||
(+) The HAL_SYSTICK_Config() function calls the SysTick_Config() function which | |||||
is a CMSIS function that: | |||||
(++) Configures the SysTick Reload register with value passed as function parameter. | |||||
(++) Configures the SysTick IRQ priority to the lowest value 0x0F. | |||||
(++) Resets the SysTick Counter register. | |||||
(++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). | |||||
(++) Enables the SysTick Interrupt. | |||||
(++) Starts the SysTick Counter. | |||||
(+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro | |||||
__HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the | |||||
HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined | |||||
inside the stm32f4xx_hal_cortex.h file. | |||||
(+) You can change the SysTick IRQ priority by calling the | |||||
HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function | |||||
call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function. | |||||
(+) To adjust the SysTick time base, use the following formula: | |||||
Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) | |||||
(++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function | |||||
(++) Reload Value should not exceed 0xFFFFFF | |||||
@endverbatim | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @defgroup CORTEX CORTEX | |||||
* @brief CORTEX HAL module driver | |||||
* @{ | |||||
*/ | |||||
#ifdef HAL_CORTEX_MODULE_ENABLED | |||||
/* Private types -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private constants ---------------------------------------------------------*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions | |||||
* @{ | |||||
*/ | |||||
/** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions | |||||
* @brief Initialization and Configuration functions | |||||
* | |||||
@verbatim | |||||
============================================================================== | |||||
##### Initialization and de-initialization functions ##### | |||||
============================================================================== | |||||
[..] | |||||
This section provides the CORTEX HAL driver functions allowing to configure Interrupts | |||||
Systick functionalities | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Sets the priority grouping field (preemption priority and subpriority) | |||||
* using the required unlock sequence. | |||||
* @param PriorityGroup The priority grouping bits length. | |||||
* This parameter can be one of the following values: | |||||
* @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority | |||||
* 4 bits for subpriority | |||||
* @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority | |||||
* 3 bits for subpriority | |||||
* @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority | |||||
* 2 bits for subpriority | |||||
* @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority | |||||
* 1 bits for subpriority | |||||
* @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority | |||||
* 0 bits for subpriority | |||||
* @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible. | |||||
* The pending IRQ priority will be managed only by the subpriority. | |||||
* @retval None | |||||
*/ | |||||
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); | |||||
/* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ | |||||
NVIC_SetPriorityGrouping(PriorityGroup); | |||||
} | |||||
/** | |||||
* @brief Sets the priority of an interrupt. | |||||
* @param IRQn External interrupt number. | |||||
* This parameter can be an enumerator of IRQn_Type enumeration | |||||
* (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) | |||||
* @param PreemptPriority The preemption priority for the IRQn channel. | |||||
* This parameter can be a value between 0 and 15 | |||||
* A lower priority value indicates a higher priority | |||||
* @param SubPriority the subpriority level for the IRQ channel. | |||||
* This parameter can be a value between 0 and 15 | |||||
* A lower priority value indicates a higher priority. | |||||
* @retval None | |||||
*/ | |||||
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) | |||||
{ | |||||
uint32_t prioritygroup = 0x00U; | |||||
/* Check the parameters */ | |||||
assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); | |||||
assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); | |||||
prioritygroup = NVIC_GetPriorityGrouping(); | |||||
NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); | |||||
} | |||||
/** | |||||
* @brief Enables a device specific interrupt in the NVIC interrupt controller. | |||||
* @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() | |||||
* function should be called before. | |||||
* @param IRQn External interrupt number. | |||||
* This parameter can be an enumerator of IRQn_Type enumeration | |||||
* (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) | |||||
* @retval None | |||||
*/ | |||||
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); | |||||
/* Enable interrupt */ | |||||
NVIC_EnableIRQ(IRQn); | |||||
} | |||||
/** | |||||
* @brief Disables a device specific interrupt in the NVIC interrupt controller. | |||||
* @param IRQn External interrupt number. | |||||
* This parameter can be an enumerator of IRQn_Type enumeration | |||||
* (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) | |||||
* @retval None | |||||
*/ | |||||
void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); | |||||
/* Disable interrupt */ | |||||
NVIC_DisableIRQ(IRQn); | |||||
} | |||||
/** | |||||
* @brief Initiates a system reset request to reset the MCU. | |||||
* @retval None | |||||
*/ | |||||
void HAL_NVIC_SystemReset(void) | |||||
{ | |||||
/* System Reset */ | |||||
NVIC_SystemReset(); | |||||
} | |||||
/** | |||||
* @brief Initializes the System Timer and its interrupt, and starts the System Tick Timer. | |||||
* Counter is in free running mode to generate periodic interrupts. | |||||
* @param TicksNumb Specifies the ticks Number of ticks between two interrupts. | |||||
* @retval status: - 0 Function succeeded. | |||||
* - 1 Function failed. | |||||
*/ | |||||
uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) | |||||
{ | |||||
return SysTick_Config(TicksNumb); | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions | |||||
* @brief Cortex control functions | |||||
* | |||||
@verbatim | |||||
============================================================================== | |||||
##### Peripheral Control functions ##### | |||||
============================================================================== | |||||
[..] | |||||
This subsection provides a set of functions allowing to control the CORTEX | |||||
(NVIC, SYSTICK, MPU) functionalities. | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
#if (__MPU_PRESENT == 1U) | |||||
/** | |||||
* @brief Disables the MPU | |||||
* @retval None | |||||
*/ | |||||
void HAL_MPU_Disable(void) | |||||
{ | |||||
/* Make sure outstanding transfers are done */ | |||||
__DMB(); | |||||
/* Disable fault exceptions */ | |||||
SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; | |||||
/* Disable the MPU and clear the control register*/ | |||||
MPU->CTRL = 0U; | |||||
} | |||||
/** | |||||
* @brief Enable the MPU. | |||||
* @param MPU_Control Specifies the control mode of the MPU during hard fault, | |||||
* NMI, FAULTMASK and privileged access to the default memory | |||||
* This parameter can be one of the following values: | |||||
* @arg MPU_HFNMI_PRIVDEF_NONE | |||||
* @arg MPU_HARDFAULT_NMI | |||||
* @arg MPU_PRIVILEGED_DEFAULT | |||||
* @arg MPU_HFNMI_PRIVDEF | |||||
* @retval None | |||||
*/ | |||||
void HAL_MPU_Enable(uint32_t MPU_Control) | |||||
{ | |||||
/* Enable the MPU */ | |||||
MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; | |||||
/* Enable fault exceptions */ | |||||
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; | |||||
/* Ensure MPU setting take effects */ | |||||
__DSB(); | |||||
__ISB(); | |||||
} | |||||
/** | |||||
* @brief Initializes and configures the Region and the memory to be protected. | |||||
* @param MPU_Init Pointer to a MPU_Region_InitTypeDef structure that contains | |||||
* the initialization and configuration information. | |||||
* @retval None | |||||
*/ | |||||
void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_MPU_REGION_NUMBER(MPU_Init->Number)); | |||||
assert_param(IS_MPU_REGION_ENABLE(MPU_Init->Enable)); | |||||
/* Set the Region number */ | |||||
MPU->RNR = MPU_Init->Number; | |||||
if ((MPU_Init->Enable) != RESET) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_MPU_INSTRUCTION_ACCESS(MPU_Init->DisableExec)); | |||||
assert_param(IS_MPU_REGION_PERMISSION_ATTRIBUTE(MPU_Init->AccessPermission)); | |||||
assert_param(IS_MPU_TEX_LEVEL(MPU_Init->TypeExtField)); | |||||
assert_param(IS_MPU_ACCESS_SHAREABLE(MPU_Init->IsShareable)); | |||||
assert_param(IS_MPU_ACCESS_CACHEABLE(MPU_Init->IsCacheable)); | |||||
assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable)); | |||||
assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable)); | |||||
assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size)); | |||||
MPU->RBAR = MPU_Init->BaseAddress; | |||||
MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) | | |||||
((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) | | |||||
((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) | | |||||
((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) | | |||||
((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) | | |||||
((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) | | |||||
((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) | | |||||
((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) | | |||||
((uint32_t)MPU_Init->Enable << MPU_RASR_ENABLE_Pos); | |||||
} | |||||
else | |||||
{ | |||||
MPU->RBAR = 0x00U; | |||||
MPU->RASR = 0x00U; | |||||
} | |||||
} | |||||
#endif /* __MPU_PRESENT */ | |||||
/** | |||||
* @brief Gets the priority grouping field from the NVIC Interrupt Controller. | |||||
* @retval Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field) | |||||
*/ | |||||
uint32_t HAL_NVIC_GetPriorityGrouping(void) | |||||
{ | |||||
/* Get the PRIGROUP[10:8] field value */ | |||||
return NVIC_GetPriorityGrouping(); | |||||
} | |||||
/** | |||||
* @brief Gets the priority of an interrupt. | |||||
* @param IRQn External interrupt number. | |||||
* This parameter can be an enumerator of IRQn_Type enumeration | |||||
* (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) | |||||
* @param PriorityGroup the priority grouping bits length. | |||||
* This parameter can be one of the following values: | |||||
* @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority | |||||
* 4 bits for subpriority | |||||
* @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority | |||||
* 3 bits for subpriority | |||||
* @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority | |||||
* 2 bits for subpriority | |||||
* @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority | |||||
* 1 bits for subpriority | |||||
* @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority | |||||
* 0 bits for subpriority | |||||
* @param pPreemptPriority Pointer on the Preemptive priority value (starting from 0). | |||||
* @param pSubPriority Pointer on the Subpriority value (starting from 0). | |||||
* @retval None | |||||
*/ | |||||
void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); | |||||
/* Get priority for Cortex-M system or device specific interrupts */ | |||||
NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); | |||||
} | |||||
/** | |||||
* @brief Sets Pending bit of an external interrupt. | |||||
* @param IRQn External interrupt number | |||||
* This parameter can be an enumerator of IRQn_Type enumeration | |||||
* (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) | |||||
* @retval None | |||||
*/ | |||||
void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); | |||||
/* Set interrupt pending */ | |||||
NVIC_SetPendingIRQ(IRQn); | |||||
} | |||||
/** | |||||
* @brief Gets Pending Interrupt (reads the pending register in the NVIC | |||||
* and returns the pending bit for the specified interrupt). | |||||
* @param IRQn External interrupt number. | |||||
* This parameter can be an enumerator of IRQn_Type enumeration | |||||
* (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) | |||||
* @retval status: - 0 Interrupt status is not pending. | |||||
* - 1 Interrupt status is pending. | |||||
*/ | |||||
uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); | |||||
/* Return 1 if pending else 0 */ | |||||
return NVIC_GetPendingIRQ(IRQn); | |||||
} | |||||
/** | |||||
* @brief Clears the pending bit of an external interrupt. | |||||
* @param IRQn External interrupt number. | |||||
* This parameter can be an enumerator of IRQn_Type enumeration | |||||
* (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) | |||||
* @retval None | |||||
*/ | |||||
void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); | |||||
/* Clear pending interrupt */ | |||||
NVIC_ClearPendingIRQ(IRQn); | |||||
} | |||||
/** | |||||
* @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit). | |||||
* @param IRQn External interrupt number | |||||
* This parameter can be an enumerator of IRQn_Type enumeration | |||||
* (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) | |||||
* @retval status: - 0 Interrupt status is not pending. | |||||
* - 1 Interrupt status is pending. | |||||
*/ | |||||
uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); | |||||
/* Return 1 if active else 0 */ | |||||
return NVIC_GetActive(IRQn); | |||||
} | |||||
/** | |||||
* @brief Configures the SysTick clock source. | |||||
* @param CLKSource specifies the SysTick clock source. | |||||
* This parameter can be one of the following values: | |||||
* @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. | |||||
* @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. | |||||
* @retval None | |||||
*/ | |||||
void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); | |||||
if (CLKSource == SYSTICK_CLKSOURCE_HCLK) | |||||
{ | |||||
SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; | |||||
} | |||||
else | |||||
{ | |||||
SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; | |||||
} | |||||
} | |||||
/** | |||||
* @brief This function handles SYSTICK interrupt request. | |||||
* @retval None | |||||
*/ | |||||
void HAL_SYSTICK_IRQHandler(void) | |||||
{ | |||||
HAL_SYSTICK_Callback(); | |||||
} | |||||
/** | |||||
* @brief SYSTICK callback. | |||||
* @retval None | |||||
*/ | |||||
__weak void HAL_SYSTICK_Callback(void) | |||||
{ | |||||
/* NOTE : This function Should not be modified, when the callback is needed, | |||||
the HAL_SYSTICK_Callback could be implemented in the user file | |||||
*/ | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* HAL_CORTEX_MODULE_ENABLED */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_dma_ex.c | |||||
* @author MCD Application Team | |||||
* @brief DMA Extension HAL module driver | |||||
* This file provides firmware functions to manage the following | |||||
* functionalities of the DMA Extension peripheral: | |||||
* + Extended features functions | |||||
* | |||||
@verbatim | |||||
============================================================================== | |||||
##### How to use this driver ##### | |||||
============================================================================== | |||||
[..] | |||||
The DMA Extension HAL driver can be used as follows: | |||||
(#) Start a multi buffer transfer using the HAL_DMA_MultiBufferStart() function | |||||
for polling mode or HAL_DMA_MultiBufferStart_IT() for interrupt mode. | |||||
-@- In Memory-to-Memory transfer mode, Multi (Double) Buffer mode is not allowed. | |||||
-@- When Multi (Double) Buffer mode is enabled the, transfer is circular by default. | |||||
-@- In Multi (Double) buffer mode, it is possible to update the base address for | |||||
the AHB memory port on the fly (DMA_SxM0AR or DMA_SxM1AR) when the stream is enabled. | |||||
@endverbatim | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @defgroup DMAEx DMAEx | |||||
* @brief DMA Extended HAL module driver | |||||
* @{ | |||||
*/ | |||||
#ifdef HAL_DMA_MODULE_ENABLED | |||||
/* Private types -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private Constants ---------------------------------------------------------*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/** @addtogroup DMAEx_Private_Functions | |||||
* @{ | |||||
*/ | |||||
static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported functions ---------------------------------------------------------*/ | |||||
/** @addtogroup DMAEx_Exported_Functions | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup DMAEx_Exported_Functions_Group1 | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### Extended features functions ##### | |||||
=============================================================================== | |||||
[..] This section provides functions allowing to: | |||||
(+) Configure the source, destination address and data length and | |||||
Start MultiBuffer DMA transfer | |||||
(+) Configure the source, destination address and data length and | |||||
Start MultiBuffer DMA transfer with interrupt | |||||
(+) Change on the fly the memory0 or memory1 address. | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Starts the multi_buffer DMA Transfer. | |||||
* @param hdma pointer to a DMA_HandleTypeDef structure that contains | |||||
* the configuration information for the specified DMA Stream. | |||||
* @param SrcAddress The source memory Buffer address | |||||
* @param DstAddress The destination memory Buffer address | |||||
* @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer | |||||
* @param DataLength The length of data to be transferred from source to destination | |||||
* @retval HAL status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) | |||||
{ | |||||
HAL_StatusTypeDef status = HAL_OK; | |||||
/* Check the parameters */ | |||||
assert_param(IS_DMA_BUFFER_SIZE(DataLength)); | |||||
/* Memory-to-memory transfer not supported in double buffering mode */ | |||||
if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) | |||||
{ | |||||
hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; | |||||
status = HAL_ERROR; | |||||
} | |||||
else | |||||
{ | |||||
/* Process Locked */ | |||||
__HAL_LOCK(hdma); | |||||
if(HAL_DMA_STATE_READY == hdma->State) | |||||
{ | |||||
/* Change DMA peripheral state */ | |||||
hdma->State = HAL_DMA_STATE_BUSY; | |||||
/* Enable the double buffer mode */ | |||||
hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; | |||||
/* Configure DMA Stream destination address */ | |||||
hdma->Instance->M1AR = SecondMemAddress; | |||||
/* Configure the source, destination address and the data length */ | |||||
DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); | |||||
/* Enable the peripheral */ | |||||
__HAL_DMA_ENABLE(hdma); | |||||
} | |||||
else | |||||
{ | |||||
/* Return error status */ | |||||
status = HAL_BUSY; | |||||
} | |||||
} | |||||
return status; | |||||
} | |||||
/** | |||||
* @brief Starts the multi_buffer DMA Transfer with interrupt enabled. | |||||
* @param hdma pointer to a DMA_HandleTypeDef structure that contains | |||||
* the configuration information for the specified DMA Stream. | |||||
* @param SrcAddress The source memory Buffer address | |||||
* @param DstAddress The destination memory Buffer address | |||||
* @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer | |||||
* @param DataLength The length of data to be transferred from source to destination | |||||
* @retval HAL status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) | |||||
{ | |||||
HAL_StatusTypeDef status = HAL_OK; | |||||
/* Check the parameters */ | |||||
assert_param(IS_DMA_BUFFER_SIZE(DataLength)); | |||||
/* Memory-to-memory transfer not supported in double buffering mode */ | |||||
if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) | |||||
{ | |||||
hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; | |||||
return HAL_ERROR; | |||||
} | |||||
/* Check callback functions */ | |||||
if ((NULL == hdma->XferCpltCallback) || (NULL == hdma->XferM1CpltCallback) || (NULL == hdma->XferErrorCallback)) | |||||
{ | |||||
hdma->ErrorCode = HAL_DMA_ERROR_PARAM; | |||||
return HAL_ERROR; | |||||
} | |||||
/* Process locked */ | |||||
__HAL_LOCK(hdma); | |||||
if(HAL_DMA_STATE_READY == hdma->State) | |||||
{ | |||||
/* Change DMA peripheral state */ | |||||
hdma->State = HAL_DMA_STATE_BUSY; | |||||
/* Initialize the error code */ | |||||
hdma->ErrorCode = HAL_DMA_ERROR_NONE; | |||||
/* Enable the Double buffer mode */ | |||||
hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; | |||||
/* Configure DMA Stream destination address */ | |||||
hdma->Instance->M1AR = SecondMemAddress; | |||||
/* Configure the source, destination address and the data length */ | |||||
DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); | |||||
/* Clear all flags */ | |||||
__HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)); | |||||
__HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)); | |||||
__HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)); | |||||
__HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma)); | |||||
__HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma)); | |||||
/* Enable Common interrupts*/ | |||||
hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; | |||||
hdma->Instance->FCR |= DMA_IT_FE; | |||||
if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) | |||||
{ | |||||
hdma->Instance->CR |= DMA_IT_HT; | |||||
} | |||||
/* Enable the peripheral */ | |||||
__HAL_DMA_ENABLE(hdma); | |||||
} | |||||
else | |||||
{ | |||||
/* Process unlocked */ | |||||
__HAL_UNLOCK(hdma); | |||||
/* Return error status */ | |||||
status = HAL_BUSY; | |||||
} | |||||
return status; | |||||
} | |||||
/** | |||||
* @brief Change the memory0 or memory1 address on the fly. | |||||
* @param hdma pointer to a DMA_HandleTypeDef structure that contains | |||||
* the configuration information for the specified DMA Stream. | |||||
* @param Address The new address | |||||
* @param memory the memory to be changed, This parameter can be one of | |||||
* the following values: | |||||
* MEMORY0 / | |||||
* MEMORY1 | |||||
* @note The MEMORY0 address can be changed only when the current transfer use | |||||
* MEMORY1 and the MEMORY1 address can be changed only when the current | |||||
* transfer use MEMORY0. | |||||
* @retval HAL status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory) | |||||
{ | |||||
if(memory == MEMORY0) | |||||
{ | |||||
/* change the memory0 address */ | |||||
hdma->Instance->M0AR = Address; | |||||
} | |||||
else | |||||
{ | |||||
/* change the memory1 address */ | |||||
hdma->Instance->M1AR = Address; | |||||
} | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup DMAEx_Private_Functions | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Set the DMA Transfer parameter. | |||||
* @param hdma pointer to a DMA_HandleTypeDef structure that contains | |||||
* the configuration information for the specified DMA Stream. | |||||
* @param SrcAddress The source memory Buffer address | |||||
* @param DstAddress The destination memory Buffer address | |||||
* @param DataLength The length of data to be transferred from source to destination | |||||
* @retval HAL status | |||||
*/ | |||||
static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) | |||||
{ | |||||
/* Configure DMA Stream data length */ | |||||
hdma->Instance->NDTR = DataLength; | |||||
/* Peripheral to Memory */ | |||||
if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) | |||||
{ | |||||
/* Configure DMA Stream destination address */ | |||||
hdma->Instance->PAR = DstAddress; | |||||
/* Configure DMA Stream source address */ | |||||
hdma->Instance->M0AR = SrcAddress; | |||||
} | |||||
/* Memory to Peripheral */ | |||||
else | |||||
{ | |||||
/* Configure DMA Stream source address */ | |||||
hdma->Instance->PAR = SrcAddress; | |||||
/* Configure DMA Stream destination address */ | |||||
hdma->Instance->M0AR = DstAddress; | |||||
} | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* HAL_DMA_MODULE_ENABLED */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_exti.c | |||||
* @author MCD Application Team | |||||
* @brief EXTI HAL module driver. | |||||
* This file provides firmware functions to manage the following | |||||
* functionalities of the Extended Interrupts and events controller (EXTI) peripheral: | |||||
* + Initialization and de-initialization functions | |||||
* + IO operation functions | |||||
* | |||||
@verbatim | |||||
============================================================================== | |||||
##### EXTI Peripheral features ##### | |||||
============================================================================== | |||||
[..] | |||||
(+) Each Exti line can be configured within this driver. | |||||
(+) Exti line can be configured in 3 different modes | |||||
(++) Interrupt | |||||
(++) Event | |||||
(++) Both of them | |||||
(+) Configurable Exti lines can be configured with 3 different triggers | |||||
(++) Rising | |||||
(++) Falling | |||||
(++) Both of them | |||||
(+) When set in interrupt mode, configurable Exti lines have two different | |||||
interrupts pending registers which allow to distinguish which transition | |||||
occurs: | |||||
(++) Rising edge pending interrupt | |||||
(++) Falling | |||||
(+) Exti lines 0 to 15 are linked to gpio pin number 0 to 15. Gpio port can | |||||
be selected through multiplexer. | |||||
##### How to use this driver ##### | |||||
============================================================================== | |||||
[..] | |||||
(#) Configure the EXTI line using HAL_EXTI_SetConfigLine(). | |||||
(++) Choose the interrupt line number by setting "Line" member from | |||||
EXTI_ConfigTypeDef structure. | |||||
(++) Configure the interrupt and/or event mode using "Mode" member from | |||||
EXTI_ConfigTypeDef structure. | |||||
(++) For configurable lines, configure rising and/or falling trigger | |||||
"Trigger" member from EXTI_ConfigTypeDef structure. | |||||
(++) For Exti lines linked to gpio, choose gpio port using "GPIOSel" | |||||
member from GPIO_InitTypeDef structure. | |||||
(#) Get current Exti configuration of a dedicated line using | |||||
HAL_EXTI_GetConfigLine(). | |||||
(++) Provide exiting handle as parameter. | |||||
(++) Provide pointer on EXTI_ConfigTypeDef structure as second parameter. | |||||
(#) Clear Exti configuration of a dedicated line using HAL_EXTI_GetConfigLine(). | |||||
(++) Provide exiting handle as parameter. | |||||
(#) Register callback to treat Exti interrupts using HAL_EXTI_RegisterCallback(). | |||||
(++) Provide exiting handle as first parameter. | |||||
(++) Provide which callback will be registered using one value from | |||||
EXTI_CallbackIDTypeDef. | |||||
(++) Provide callback function pointer. | |||||
(#) Get interrupt pending bit using HAL_EXTI_GetPending(). | |||||
(#) Clear interrupt pending bit using HAL_EXTI_GetPending(). | |||||
(#) Generate software interrupt using HAL_EXTI_GenerateSWI(). | |||||
@endverbatim | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2018 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup EXTI | |||||
* @{ | |||||
*/ | |||||
/** MISRA C:2012 deviation rule has been granted for following rule: | |||||
* Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out | |||||
* of bounds [0,3] in following API : | |||||
* HAL_EXTI_SetConfigLine | |||||
* HAL_EXTI_GetConfigLine | |||||
* HAL_EXTI_ClearConfigLine | |||||
*/ | |||||
#ifdef HAL_EXTI_MODULE_ENABLED | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* Private defines -----------------------------------------------------------*/ | |||||
/** @defgroup EXTI_Private_Constants EXTI Private Constants | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macros ------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @addtogroup EXTI_Exported_Functions | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup EXTI_Exported_Functions_Group1 | |||||
* @brief Configuration functions | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### Configuration functions ##### | |||||
=============================================================================== | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Set configuration of a dedicated Exti line. | |||||
* @param hexti Exti handle. | |||||
* @param pExtiConfig Pointer on EXTI configuration to be set. | |||||
* @retval HAL Status. | |||||
*/ | |||||
HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) | |||||
{ | |||||
uint32_t regval; | |||||
uint32_t linepos; | |||||
uint32_t maskline; | |||||
/* Check null pointer */ | |||||
if ((hexti == NULL) || (pExtiConfig == NULL)) | |||||
{ | |||||
return HAL_ERROR; | |||||
} | |||||
/* Check parameters */ | |||||
assert_param(IS_EXTI_LINE(pExtiConfig->Line)); | |||||
assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); | |||||
/* Assign line number to handle */ | |||||
hexti->Line = pExtiConfig->Line; | |||||
/* Compute line mask */ | |||||
linepos = (pExtiConfig->Line & EXTI_PIN_MASK); | |||||
maskline = (1uL << linepos); | |||||
/* Configure triggers for configurable lines */ | |||||
if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) | |||||
{ | |||||
assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); | |||||
/* Configure rising trigger */ | |||||
/* Mask or set line */ | |||||
if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) | |||||
{ | |||||
EXTI->RTSR |= maskline; | |||||
} | |||||
else | |||||
{ | |||||
EXTI->RTSR &= ~maskline; | |||||
} | |||||
/* Configure falling trigger */ | |||||
/* Mask or set line */ | |||||
if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) | |||||
{ | |||||
EXTI->FTSR |= maskline; | |||||
} | |||||
else | |||||
{ | |||||
EXTI->FTSR &= ~maskline; | |||||
} | |||||
/* Configure gpio port selection in case of gpio exti line */ | |||||
if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) | |||||
{ | |||||
assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); | |||||
assert_param(IS_EXTI_GPIO_PIN(linepos)); | |||||
regval = SYSCFG->EXTICR[linepos >> 2u]; | |||||
regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); | |||||
regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); | |||||
SYSCFG->EXTICR[linepos >> 2u] = regval; | |||||
} | |||||
} | |||||
/* Configure interrupt mode : read current mode */ | |||||
/* Mask or set line */ | |||||
if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) | |||||
{ | |||||
EXTI->IMR |= maskline; | |||||
} | |||||
else | |||||
{ | |||||
EXTI->IMR &= ~maskline; | |||||
} | |||||
/* Configure event mode : read current mode */ | |||||
/* Mask or set line */ | |||||
if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) | |||||
{ | |||||
EXTI->EMR |= maskline; | |||||
} | |||||
else | |||||
{ | |||||
EXTI->EMR &= ~maskline; | |||||
} | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Get configuration of a dedicated Exti line. | |||||
* @param hexti Exti handle. | |||||
* @param pExtiConfig Pointer on structure to store Exti configuration. | |||||
* @retval HAL Status. | |||||
*/ | |||||
HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) | |||||
{ | |||||
uint32_t regval; | |||||
uint32_t linepos; | |||||
uint32_t maskline; | |||||
/* Check null pointer */ | |||||
if ((hexti == NULL) || (pExtiConfig == NULL)) | |||||
{ | |||||
return HAL_ERROR; | |||||
} | |||||
/* Check the parameter */ | |||||
assert_param(IS_EXTI_LINE(hexti->Line)); | |||||
/* Store handle line number to configuration structure */ | |||||
pExtiConfig->Line = hexti->Line; | |||||
/* Compute line mask */ | |||||
linepos = (pExtiConfig->Line & EXTI_PIN_MASK); | |||||
maskline = (1uL << linepos); | |||||
/* 1] Get core mode : interrupt */ | |||||
/* Check if selected line is enable */ | |||||
if ((EXTI->IMR & maskline) != 0x00u) | |||||
{ | |||||
pExtiConfig->Mode = EXTI_MODE_INTERRUPT; | |||||
} | |||||
else | |||||
{ | |||||
pExtiConfig->Mode = EXTI_MODE_NONE; | |||||
} | |||||
/* Get event mode */ | |||||
/* Check if selected line is enable */ | |||||
if ((EXTI->EMR & maskline) != 0x00u) | |||||
{ | |||||
pExtiConfig->Mode |= EXTI_MODE_EVENT; | |||||
} | |||||
/* 2] Get trigger for configurable lines : rising */ | |||||
if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) | |||||
{ | |||||
/* Check if configuration of selected line is enable */ | |||||
if ((EXTI->RTSR & maskline) != 0x00u) | |||||
{ | |||||
pExtiConfig->Trigger = EXTI_TRIGGER_RISING; | |||||
} | |||||
else | |||||
{ | |||||
pExtiConfig->Trigger = EXTI_TRIGGER_NONE; | |||||
} | |||||
/* Get falling configuration */ | |||||
/* Check if configuration of selected line is enable */ | |||||
if ((EXTI->FTSR & maskline) != 0x00u) | |||||
{ | |||||
pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; | |||||
} | |||||
/* Get Gpio port selection for gpio lines */ | |||||
if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) | |||||
{ | |||||
assert_param(IS_EXTI_GPIO_PIN(linepos)); | |||||
regval = SYSCFG->EXTICR[linepos >> 2u]; | |||||
pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); | |||||
} | |||||
else | |||||
{ | |||||
pExtiConfig->GPIOSel = 0x00u; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
/* No Trigger selected */ | |||||
pExtiConfig->Trigger = EXTI_TRIGGER_NONE; | |||||
pExtiConfig->GPIOSel = 0x00u; | |||||
} | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Clear whole configuration of a dedicated Exti line. | |||||
* @param hexti Exti handle. | |||||
* @retval HAL Status. | |||||
*/ | |||||
HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) | |||||
{ | |||||
uint32_t regval; | |||||
uint32_t linepos; | |||||
uint32_t maskline; | |||||
/* Check null pointer */ | |||||
if (hexti == NULL) | |||||
{ | |||||
return HAL_ERROR; | |||||
} | |||||
/* Check the parameter */ | |||||
assert_param(IS_EXTI_LINE(hexti->Line)); | |||||
/* compute line mask */ | |||||
linepos = (hexti->Line & EXTI_PIN_MASK); | |||||
maskline = (1uL << linepos); | |||||
/* 1] Clear interrupt mode */ | |||||
EXTI->IMR = (EXTI->IMR & ~maskline); | |||||
/* 2] Clear event mode */ | |||||
EXTI->EMR = (EXTI->EMR & ~maskline); | |||||
/* 3] Clear triggers in case of configurable lines */ | |||||
if ((hexti->Line & EXTI_CONFIG) != 0x00u) | |||||
{ | |||||
EXTI->RTSR = (EXTI->RTSR & ~maskline); | |||||
EXTI->FTSR = (EXTI->FTSR & ~maskline); | |||||
/* Get Gpio port selection for gpio lines */ | |||||
if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) | |||||
{ | |||||
assert_param(IS_EXTI_GPIO_PIN(linepos)); | |||||
regval = SYSCFG->EXTICR[linepos >> 2u]; | |||||
regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); | |||||
SYSCFG->EXTICR[linepos >> 2u] = regval; | |||||
} | |||||
} | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Register callback for a dedicated Exti line. | |||||
* @param hexti Exti handle. | |||||
* @param CallbackID User callback identifier. | |||||
* This parameter can be one of @arg @ref EXTI_CallbackIDTypeDef values. | |||||
* @param pPendingCbfn function pointer to be stored as callback. | |||||
* @retval HAL Status. | |||||
*/ | |||||
HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)) | |||||
{ | |||||
HAL_StatusTypeDef status = HAL_OK; | |||||
switch (CallbackID) | |||||
{ | |||||
case HAL_EXTI_COMMON_CB_ID: | |||||
hexti->PendingCallback = pPendingCbfn; | |||||
break; | |||||
default: | |||||
status = HAL_ERROR; | |||||
break; | |||||
} | |||||
return status; | |||||
} | |||||
/** | |||||
* @brief Store line number as handle private field. | |||||
* @param hexti Exti handle. | |||||
* @param ExtiLine Exti line number. | |||||
* This parameter can be from 0 to @ref EXTI_LINE_NB. | |||||
* @retval HAL Status. | |||||
*/ | |||||
HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_EXTI_LINE(ExtiLine)); | |||||
/* Check null pointer */ | |||||
if (hexti == NULL) | |||||
{ | |||||
return HAL_ERROR; | |||||
} | |||||
else | |||||
{ | |||||
/* Store line number as handle private field */ | |||||
hexti->Line = ExtiLine; | |||||
return HAL_OK; | |||||
} | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup EXTI_Exported_Functions_Group2 | |||||
* @brief EXTI IO functions. | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### IO operation functions ##### | |||||
=============================================================================== | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Handle EXTI interrupt request. | |||||
* @param hexti Exti handle. | |||||
* @retval none. | |||||
*/ | |||||
void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) | |||||
{ | |||||
uint32_t regval; | |||||
uint32_t maskline; | |||||
/* Compute line mask */ | |||||
maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); | |||||
/* Get pending bit */ | |||||
regval = (EXTI->PR & maskline); | |||||
if (regval != 0x00u) | |||||
{ | |||||
/* Clear pending bit */ | |||||
EXTI->PR = maskline; | |||||
/* Call callback */ | |||||
if (hexti->PendingCallback != NULL) | |||||
{ | |||||
hexti->PendingCallback(); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* @brief Get interrupt pending bit of a dedicated line. | |||||
* @param hexti Exti handle. | |||||
* @param Edge Specify which pending edge as to be checked. | |||||
* This parameter can be one of the following values: | |||||
* @arg @ref EXTI_TRIGGER_RISING_FALLING | |||||
* This parameter is kept for compatibility with other series. | |||||
* @retval 1 if interrupt is pending else 0. | |||||
*/ | |||||
uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) | |||||
{ | |||||
uint32_t regval; | |||||
uint32_t linepos; | |||||
uint32_t maskline; | |||||
/* Check parameters */ | |||||
assert_param(IS_EXTI_LINE(hexti->Line)); | |||||
assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); | |||||
assert_param(IS_EXTI_PENDING_EDGE(Edge)); | |||||
/* Compute line mask */ | |||||
linepos = (hexti->Line & EXTI_PIN_MASK); | |||||
maskline = (1uL << linepos); | |||||
/* return 1 if bit is set else 0 */ | |||||
regval = ((EXTI->PR & maskline) >> linepos); | |||||
return regval; | |||||
} | |||||
/** | |||||
* @brief Clear interrupt pending bit of a dedicated line. | |||||
* @param hexti Exti handle. | |||||
* @param Edge Specify which pending edge as to be clear. | |||||
* This parameter can be one of the following values: | |||||
* @arg @ref EXTI_TRIGGER_RISING_FALLING | |||||
* This parameter is kept for compatibility with other series. | |||||
* @retval None. | |||||
*/ | |||||
void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) | |||||
{ | |||||
uint32_t maskline; | |||||
/* Check parameters */ | |||||
assert_param(IS_EXTI_LINE(hexti->Line)); | |||||
assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); | |||||
assert_param(IS_EXTI_PENDING_EDGE(Edge)); | |||||
/* Compute line mask */ | |||||
maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); | |||||
/* Clear Pending bit */ | |||||
EXTI->PR = maskline; | |||||
} | |||||
/** | |||||
* @brief Generate a software interrupt for a dedicated line. | |||||
* @param hexti Exti handle. | |||||
* @retval None. | |||||
*/ | |||||
void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) | |||||
{ | |||||
uint32_t maskline; | |||||
/* Check parameters */ | |||||
assert_param(IS_EXTI_LINE(hexti->Line)); | |||||
assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); | |||||
/* Compute line mask */ | |||||
maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); | |||||
/* Generate Software interrupt */ | |||||
EXTI->SWIER = maskline; | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* HAL_EXTI_MODULE_ENABLED */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_flash.c | |||||
* @author MCD Application Team | |||||
* @brief FLASH HAL module driver. | |||||
* This file provides firmware functions to manage the following | |||||
* functionalities of the internal FLASH memory: | |||||
* + Program operations functions | |||||
* + Memory Control functions | |||||
* + Peripheral Errors functions | |||||
* | |||||
@verbatim | |||||
============================================================================== | |||||
##### FLASH peripheral features ##### | |||||
============================================================================== | |||||
[..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses | |||||
to the Flash memory. It implements the erase and program Flash memory operations | |||||
and the read and write protection mechanisms. | |||||
[..] The Flash memory interface accelerates code execution with a system of instruction | |||||
prefetch and cache lines. | |||||
[..] The FLASH main features are: | |||||
(+) Flash memory read operations | |||||
(+) Flash memory program/erase operations | |||||
(+) Read / write protections | |||||
(+) Prefetch on I-Code | |||||
(+) 64 cache lines of 128 bits on I-Code | |||||
(+) 8 cache lines of 128 bits on D-Code | |||||
##### How to use this driver ##### | |||||
============================================================================== | |||||
[..] | |||||
This driver provides functions and macros to configure and program the FLASH | |||||
memory of all STM32F4xx devices. | |||||
(#) FLASH Memory IO Programming functions: | |||||
(++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and | |||||
HAL_FLASH_Lock() functions | |||||
(++) Program functions: byte, half word, word and double word | |||||
(++) There Two modes of programming : | |||||
(+++) Polling mode using HAL_FLASH_Program() function | |||||
(+++) Interrupt mode using HAL_FLASH_Program_IT() function | |||||
(#) Interrupts and flags management functions : | |||||
(++) Handle FLASH interrupts by calling HAL_FLASH_IRQHandler() | |||||
(++) Wait for last FLASH operation according to its status | |||||
(++) Get error flag status by calling HAL_SetErrorCode() | |||||
[..] | |||||
In addition to these functions, this driver includes a set of macros allowing | |||||
to handle the following operations: | |||||
(+) Set the latency | |||||
(+) Enable/Disable the prefetch buffer | |||||
(+) Enable/Disable the Instruction cache and the Data cache | |||||
(+) Reset the Instruction cache and the Data cache | |||||
(+) Enable/Disable the FLASH interrupts | |||||
(+) Monitor the FLASH flags status | |||||
@endverbatim | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @defgroup FLASH FLASH | |||||
* @brief FLASH HAL module driver | |||||
* @{ | |||||
*/ | |||||
#ifdef HAL_FLASH_MODULE_ENABLED | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* Private define ------------------------------------------------------------*/ | |||||
/** @addtogroup FLASH_Private_Constants | |||||
* @{ | |||||
*/ | |||||
#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/** @addtogroup FLASH_Private_Variables | |||||
* @{ | |||||
*/ | |||||
/* Variable used for Erase sectors under interruption */ | |||||
FLASH_ProcessTypeDef pFlash; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
/** @addtogroup FLASH_Private_Functions | |||||
* @{ | |||||
*/ | |||||
/* Program operations */ | |||||
static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data); | |||||
static void FLASH_Program_Word(uint32_t Address, uint32_t Data); | |||||
static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); | |||||
static void FLASH_Program_Byte(uint32_t Address, uint8_t Data); | |||||
static void FLASH_SetErrorCode(void); | |||||
HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @defgroup FLASH_Exported_Functions FLASH Exported Functions | |||||
* @{ | |||||
*/ | |||||
/** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions | |||||
* @brief Programming operation functions | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### Programming operation functions ##### | |||||
=============================================================================== | |||||
[..] | |||||
This subsection provides a set of functions allowing to manage the FLASH | |||||
program operations. | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Program byte, halfword, word or double word at a specified address | |||||
* @param TypeProgram Indicate the way to program at a specified address. | |||||
* This parameter can be a value of @ref FLASH_Type_Program | |||||
* @param Address specifies the address to be programmed. | |||||
* @param Data specifies the data to be programmed | |||||
* | |||||
* @retval HAL_StatusTypeDef HAL Status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) | |||||
{ | |||||
HAL_StatusTypeDef status = HAL_ERROR; | |||||
/* Process Locked */ | |||||
__HAL_LOCK(&pFlash); | |||||
/* Check the parameters */ | |||||
assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); | |||||
/* Wait for last operation to be completed */ | |||||
status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); | |||||
if(status == HAL_OK) | |||||
{ | |||||
if(TypeProgram == FLASH_TYPEPROGRAM_BYTE) | |||||
{ | |||||
/*Program byte (8-bit) at a specified address.*/ | |||||
FLASH_Program_Byte(Address, (uint8_t) Data); | |||||
} | |||||
else if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) | |||||
{ | |||||
/*Program halfword (16-bit) at a specified address.*/ | |||||
FLASH_Program_HalfWord(Address, (uint16_t) Data); | |||||
} | |||||
else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) | |||||
{ | |||||
/*Program word (32-bit) at a specified address.*/ | |||||
FLASH_Program_Word(Address, (uint32_t) Data); | |||||
} | |||||
else | |||||
{ | |||||
/*Program double word (64-bit) at a specified address.*/ | |||||
FLASH_Program_DoubleWord(Address, Data); | |||||
} | |||||
/* Wait for last operation to be completed */ | |||||
status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); | |||||
/* If the program operation is completed, disable the PG Bit */ | |||||
FLASH->CR &= (~FLASH_CR_PG); | |||||
} | |||||
/* Process Unlocked */ | |||||
__HAL_UNLOCK(&pFlash); | |||||
return status; | |||||
} | |||||
/** | |||||
* @brief Program byte, halfword, word or double word at a specified address with interrupt enabled. | |||||
* @param TypeProgram Indicate the way to program at a specified address. | |||||
* This parameter can be a value of @ref FLASH_Type_Program | |||||
* @param Address specifies the address to be programmed. | |||||
* @param Data specifies the data to be programmed | |||||
* | |||||
* @retval HAL Status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) | |||||
{ | |||||
HAL_StatusTypeDef status = HAL_OK; | |||||
/* Process Locked */ | |||||
__HAL_LOCK(&pFlash); | |||||
/* Check the parameters */ | |||||
assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); | |||||
/* Enable End of FLASH Operation interrupt */ | |||||
__HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); | |||||
/* Enable Error source interrupt */ | |||||
__HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); | |||||
pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM; | |||||
pFlash.Address = Address; | |||||
if(TypeProgram == FLASH_TYPEPROGRAM_BYTE) | |||||
{ | |||||
/*Program byte (8-bit) at a specified address.*/ | |||||
FLASH_Program_Byte(Address, (uint8_t) Data); | |||||
} | |||||
else if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) | |||||
{ | |||||
/*Program halfword (16-bit) at a specified address.*/ | |||||
FLASH_Program_HalfWord(Address, (uint16_t) Data); | |||||
} | |||||
else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) | |||||
{ | |||||
/*Program word (32-bit) at a specified address.*/ | |||||
FLASH_Program_Word(Address, (uint32_t) Data); | |||||
} | |||||
else | |||||
{ | |||||
/*Program double word (64-bit) at a specified address.*/ | |||||
FLASH_Program_DoubleWord(Address, Data); | |||||
} | |||||
return status; | |||||
} | |||||
/** | |||||
* @brief This function handles FLASH interrupt request. | |||||
* @retval None | |||||
*/ | |||||
void HAL_FLASH_IRQHandler(void) | |||||
{ | |||||
uint32_t addresstmp = 0U; | |||||
/* Check FLASH operation error flags */ | |||||
#if defined(FLASH_SR_RDERR) | |||||
if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ | |||||
FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) | |||||
#else | |||||
if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ | |||||
FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) | |||||
#endif /* FLASH_SR_RDERR */ | |||||
{ | |||||
if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) | |||||
{ | |||||
/*return the faulty sector*/ | |||||
addresstmp = pFlash.Sector; | |||||
pFlash.Sector = 0xFFFFFFFFU; | |||||
} | |||||
else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) | |||||
{ | |||||
/*return the faulty bank*/ | |||||
addresstmp = pFlash.Bank; | |||||
} | |||||
else | |||||
{ | |||||
/*return the faulty address*/ | |||||
addresstmp = pFlash.Address; | |||||
} | |||||
/*Save the Error code*/ | |||||
FLASH_SetErrorCode(); | |||||
/* FLASH error interrupt user callback */ | |||||
HAL_FLASH_OperationErrorCallback(addresstmp); | |||||
/*Stop the procedure ongoing*/ | |||||
pFlash.ProcedureOnGoing = FLASH_PROC_NONE; | |||||
} | |||||
/* Check FLASH End of Operation flag */ | |||||
if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) | |||||
{ | |||||
/* Clear FLASH End of Operation pending bit */ | |||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); | |||||
if(pFlash.ProcedureOnGoing == FLASH_PROC_SECTERASE) | |||||
{ | |||||
/*Nb of sector to erased can be decreased*/ | |||||
pFlash.NbSectorsToErase--; | |||||
/* Check if there are still sectors to erase*/ | |||||
if(pFlash.NbSectorsToErase != 0U) | |||||
{ | |||||
addresstmp = pFlash.Sector; | |||||
/*Indicate user which sector has been erased*/ | |||||
HAL_FLASH_EndOfOperationCallback(addresstmp); | |||||
/*Increment sector number*/ | |||||
pFlash.Sector++; | |||||
addresstmp = pFlash.Sector; | |||||
FLASH_Erase_Sector(addresstmp, pFlash.VoltageForErase); | |||||
} | |||||
else | |||||
{ | |||||
/*No more sectors to Erase, user callback can be called.*/ | |||||
/*Reset Sector and stop Erase sectors procedure*/ | |||||
pFlash.Sector = addresstmp = 0xFFFFFFFFU; | |||||
pFlash.ProcedureOnGoing = FLASH_PROC_NONE; | |||||
/* Flush the caches to be sure of the data consistency */ | |||||
FLASH_FlushCaches() ; | |||||
/* FLASH EOP interrupt user callback */ | |||||
HAL_FLASH_EndOfOperationCallback(addresstmp); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) | |||||
{ | |||||
/* MassErase ended. Return the selected bank */ | |||||
/* Flush the caches to be sure of the data consistency */ | |||||
FLASH_FlushCaches() ; | |||||
/* FLASH EOP interrupt user callback */ | |||||
HAL_FLASH_EndOfOperationCallback(pFlash.Bank); | |||||
} | |||||
else | |||||
{ | |||||
/*Program ended. Return the selected address*/ | |||||
/* FLASH EOP interrupt user callback */ | |||||
HAL_FLASH_EndOfOperationCallback(pFlash.Address); | |||||
} | |||||
pFlash.ProcedureOnGoing = FLASH_PROC_NONE; | |||||
} | |||||
} | |||||
if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE) | |||||
{ | |||||
/* Operation is completed, disable the PG, SER, SNB and MER Bits */ | |||||
CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_SER | FLASH_CR_SNB | FLASH_MER_BIT)); | |||||
/* Disable End of FLASH Operation interrupt */ | |||||
__HAL_FLASH_DISABLE_IT(FLASH_IT_EOP); | |||||
/* Disable Error source interrupt */ | |||||
__HAL_FLASH_DISABLE_IT(FLASH_IT_ERR); | |||||
/* Process Unlocked */ | |||||
__HAL_UNLOCK(&pFlash); | |||||
} | |||||
} | |||||
/** | |||||
* @brief FLASH end of operation interrupt callback | |||||
* @param ReturnValue The value saved in this parameter depends on the ongoing procedure | |||||
* Mass Erase: Bank number which has been requested to erase | |||||
* Sectors Erase: Sector which has been erased | |||||
* (if 0xFFFFFFFFU, it means that all the selected sectors have been erased) | |||||
* Program: Address which was selected for data program | |||||
* @retval None | |||||
*/ | |||||
__weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) | |||||
{ | |||||
/* Prevent unused argument(s) compilation warning */ | |||||
UNUSED(ReturnValue); | |||||
/* NOTE : This function Should not be modified, when the callback is needed, | |||||
the HAL_FLASH_EndOfOperationCallback could be implemented in the user file | |||||
*/ | |||||
} | |||||
/** | |||||
* @brief FLASH operation error interrupt callback | |||||
* @param ReturnValue The value saved in this parameter depends on the ongoing procedure | |||||
* Mass Erase: Bank number which has been requested to erase | |||||
* Sectors Erase: Sector number which returned an error | |||||
* Program: Address which was selected for data program | |||||
* @retval None | |||||
*/ | |||||
__weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) | |||||
{ | |||||
/* Prevent unused argument(s) compilation warning */ | |||||
UNUSED(ReturnValue); | |||||
/* NOTE : This function Should not be modified, when the callback is needed, | |||||
the HAL_FLASH_OperationErrorCallback could be implemented in the user file | |||||
*/ | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions | |||||
* @brief management functions | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### Peripheral Control functions ##### | |||||
=============================================================================== | |||||
[..] | |||||
This subsection provides a set of functions allowing to control the FLASH | |||||
memory operations. | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Unlock the FLASH control register access | |||||
* @retval HAL Status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_FLASH_Unlock(void) | |||||
{ | |||||
HAL_StatusTypeDef status = HAL_OK; | |||||
if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) | |||||
{ | |||||
/* Authorize the FLASH Registers access */ | |||||
WRITE_REG(FLASH->KEYR, FLASH_KEY1); | |||||
WRITE_REG(FLASH->KEYR, FLASH_KEY2); | |||||
/* Verify Flash is unlocked */ | |||||
if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) | |||||
{ | |||||
status = HAL_ERROR; | |||||
} | |||||
} | |||||
return status; | |||||
} | |||||
/** | |||||
* @brief Locks the FLASH control register access | |||||
* @retval HAL Status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_FLASH_Lock(void) | |||||
{ | |||||
/* Set the LOCK Bit to lock the FLASH Registers access */ | |||||
FLASH->CR |= FLASH_CR_LOCK; | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Unlock the FLASH Option Control Registers access. | |||||
* @retval HAL Status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) | |||||
{ | |||||
if((FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) != RESET) | |||||
{ | |||||
/* Authorizes the Option Byte register programming */ | |||||
FLASH->OPTKEYR = FLASH_OPT_KEY1; | |||||
FLASH->OPTKEYR = FLASH_OPT_KEY2; | |||||
} | |||||
else | |||||
{ | |||||
return HAL_ERROR; | |||||
} | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Lock the FLASH Option Control Registers access. | |||||
* @retval HAL Status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_FLASH_OB_Lock(void) | |||||
{ | |||||
/* Set the OPTLOCK Bit to lock the FLASH Option Byte Registers access */ | |||||
FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK; | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Launch the option byte loading. | |||||
* @retval HAL Status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_FLASH_OB_Launch(void) | |||||
{ | |||||
/* Set the OPTSTRT bit in OPTCR register */ | |||||
*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT; | |||||
/* Wait for last operation to be completed */ | |||||
return(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE)); | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup FLASH_Exported_Functions_Group3 Peripheral State and Errors functions | |||||
* @brief Peripheral Errors functions | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### Peripheral Errors functions ##### | |||||
=============================================================================== | |||||
[..] | |||||
This subsection permits to get in run-time Errors of the FLASH peripheral. | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Get the specific FLASH error flag. | |||||
* @retval FLASH_ErrorCode: The returned value can be a combination of: | |||||
* @arg HAL_FLASH_ERROR_RD: FLASH Read Protection error flag (PCROP) | |||||
* @arg HAL_FLASH_ERROR_PGS: FLASH Programming Sequence error flag | |||||
* @arg HAL_FLASH_ERROR_PGP: FLASH Programming Parallelism error flag | |||||
* @arg HAL_FLASH_ERROR_PGA: FLASH Programming Alignment error flag | |||||
* @arg HAL_FLASH_ERROR_WRP: FLASH Write protected error flag | |||||
* @arg HAL_FLASH_ERROR_OPERATION: FLASH operation Error flag | |||||
*/ | |||||
uint32_t HAL_FLASH_GetError(void) | |||||
{ | |||||
return pFlash.ErrorCode; | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @brief Wait for a FLASH operation to complete. | |||||
* @param Timeout maximum flash operationtimeout | |||||
* @retval HAL Status | |||||
*/ | |||||
HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) | |||||
{ | |||||
uint32_t tickstart = 0U; | |||||
/* Clear Error Code */ | |||||
pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; | |||||
/* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. | |||||
Even if the FLASH operation fails, the BUSY flag will be reset and an error | |||||
flag will be set */ | |||||
/* Get tick */ | |||||
tickstart = HAL_GetTick(); | |||||
while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET) | |||||
{ | |||||
if(Timeout != HAL_MAX_DELAY) | |||||
{ | |||||
if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) | |||||
{ | |||||
return HAL_TIMEOUT; | |||||
} | |||||
} | |||||
} | |||||
/* Check FLASH End of Operation flag */ | |||||
if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) | |||||
{ | |||||
/* Clear FLASH End of Operation pending bit */ | |||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); | |||||
} | |||||
#if defined(FLASH_SR_RDERR) | |||||
if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ | |||||
FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR | FLASH_FLAG_RDERR)) != RESET) | |||||
#else | |||||
if(__HAL_FLASH_GET_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | \ | |||||
FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)) != RESET) | |||||
#endif /* FLASH_SR_RDERR */ | |||||
{ | |||||
/*Save the error code*/ | |||||
FLASH_SetErrorCode(); | |||||
return HAL_ERROR; | |||||
} | |||||
/* If there is no error flag set */ | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Program a double word (64-bit) at a specified address. | |||||
* @note This function must be used when the device voltage range is from | |||||
* 2.7V to 3.6V and Vpp in the range 7V to 9V. | |||||
* | |||||
* @note If an erase and a program operations are requested simultaneously, | |||||
* the erase operation is performed before the program one. | |||||
* | |||||
* @param Address specifies the address to be programmed. | |||||
* @param Data specifies the data to be programmed. | |||||
* @retval None | |||||
*/ | |||||
static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_FLASH_ADDRESS(Address)); | |||||
/* If the previous operation is completed, proceed to program the new data */ | |||||
CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); | |||||
FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD; | |||||
FLASH->CR |= FLASH_CR_PG; | |||||
/* Program first word */ | |||||
*(__IO uint32_t*)Address = (uint32_t)Data; | |||||
/* Barrier to ensure programming is performed in 2 steps, in right order | |||||
(independently of compiler optimization behavior) */ | |||||
__ISB(); | |||||
/* Program second word */ | |||||
*(__IO uint32_t*)(Address+4) = (uint32_t)(Data >> 32); | |||||
} | |||||
/** | |||||
* @brief Program word (32-bit) at a specified address. | |||||
* @note This function must be used when the device voltage range is from | |||||
* 2.7V to 3.6V. | |||||
* | |||||
* @note If an erase and a program operations are requested simultaneously, | |||||
* the erase operation is performed before the program one. | |||||
* | |||||
* @param Address specifies the address to be programmed. | |||||
* @param Data specifies the data to be programmed. | |||||
* @retval None | |||||
*/ | |||||
static void FLASH_Program_Word(uint32_t Address, uint32_t Data) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_FLASH_ADDRESS(Address)); | |||||
/* If the previous operation is completed, proceed to program the new data */ | |||||
CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); | |||||
FLASH->CR |= FLASH_PSIZE_WORD; | |||||
FLASH->CR |= FLASH_CR_PG; | |||||
*(__IO uint32_t*)Address = Data; | |||||
} | |||||
/** | |||||
* @brief Program a half-word (16-bit) at a specified address. | |||||
* @note This function must be used when the device voltage range is from | |||||
* 2.1V to 3.6V. | |||||
* | |||||
* @note If an erase and a program operations are requested simultaneously, | |||||
* the erase operation is performed before the program one. | |||||
* | |||||
* @param Address specifies the address to be programmed. | |||||
* @param Data specifies the data to be programmed. | |||||
* @retval None | |||||
*/ | |||||
static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_FLASH_ADDRESS(Address)); | |||||
/* If the previous operation is completed, proceed to program the new data */ | |||||
CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); | |||||
FLASH->CR |= FLASH_PSIZE_HALF_WORD; | |||||
FLASH->CR |= FLASH_CR_PG; | |||||
*(__IO uint16_t*)Address = Data; | |||||
} | |||||
/** | |||||
* @brief Program byte (8-bit) at a specified address. | |||||
* @note This function must be used when the device voltage range is from | |||||
* 1.8V to 3.6V. | |||||
* | |||||
* @note If an erase and a program operations are requested simultaneously, | |||||
* the erase operation is performed before the program one. | |||||
* | |||||
* @param Address specifies the address to be programmed. | |||||
* @param Data specifies the data to be programmed. | |||||
* @retval None | |||||
*/ | |||||
static void FLASH_Program_Byte(uint32_t Address, uint8_t Data) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_FLASH_ADDRESS(Address)); | |||||
/* If the previous operation is completed, proceed to program the new data */ | |||||
CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); | |||||
FLASH->CR |= FLASH_PSIZE_BYTE; | |||||
FLASH->CR |= FLASH_CR_PG; | |||||
*(__IO uint8_t*)Address = Data; | |||||
} | |||||
/** | |||||
* @brief Set the specific FLASH error flag. | |||||
* @retval None | |||||
*/ | |||||
static void FLASH_SetErrorCode(void) | |||||
{ | |||||
if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) | |||||
{ | |||||
pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; | |||||
/* Clear FLASH write protection error pending bit */ | |||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR); | |||||
} | |||||
if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) | |||||
{ | |||||
pFlash.ErrorCode |= HAL_FLASH_ERROR_PGA; | |||||
/* Clear FLASH Programming alignment error pending bit */ | |||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR); | |||||
} | |||||
if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGPERR) != RESET) | |||||
{ | |||||
pFlash.ErrorCode |= HAL_FLASH_ERROR_PGP; | |||||
/* Clear FLASH Programming parallelism error pending bit */ | |||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR); | |||||
} | |||||
if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR) != RESET) | |||||
{ | |||||
pFlash.ErrorCode |= HAL_FLASH_ERROR_PGS; | |||||
/* Clear FLASH Programming sequence error pending bit */ | |||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR); | |||||
} | |||||
#if defined(FLASH_SR_RDERR) | |||||
if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) | |||||
{ | |||||
pFlash.ErrorCode |= HAL_FLASH_ERROR_RD; | |||||
/* Clear FLASH Proprietary readout protection error pending bit */ | |||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_RDERR); | |||||
} | |||||
#endif /* FLASH_SR_RDERR */ | |||||
if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR) != RESET) | |||||
{ | |||||
pFlash.ErrorCode |= HAL_FLASH_ERROR_OPERATION; | |||||
/* Clear FLASH Operation error pending bit */ | |||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR); | |||||
} | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* HAL_FLASH_MODULE_ENABLED */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_flash_ramfunc.c | |||||
* @author MCD Application Team | |||||
* @brief FLASH RAMFUNC module driver. | |||||
* This file provides a FLASH firmware functions which should be | |||||
* executed from internal SRAM | |||||
* + Stop/Start the flash interface while System Run | |||||
* + Enable/Disable the flash sleep while System Run | |||||
@verbatim | |||||
============================================================================== | |||||
##### APIs executed from Internal RAM ##### | |||||
============================================================================== | |||||
[..] | |||||
*** ARM Compiler *** | |||||
-------------------- | |||||
[..] RAM functions are defined using the toolchain options. | |||||
Functions that are be executed in RAM should reside in a separate | |||||
source module. Using the 'Options for File' dialog you can simply change | |||||
the 'Code / Const' area of a module to a memory space in physical RAM. | |||||
Available memory areas are declared in the 'Target' tab of the | |||||
Options for Target' dialog. | |||||
*** ICCARM Compiler *** | |||||
----------------------- | |||||
[..] RAM functions are defined using a specific toolchain keyword "__ramfunc". | |||||
*** GNU Compiler *** | |||||
-------------------- | |||||
[..] RAM functions are defined using a specific toolchain attribute | |||||
"__attribute__((section(".RamFunc")))". | |||||
@endverbatim | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @defgroup FLASH_RAMFUNC FLASH RAMFUNC | |||||
* @brief FLASH functions executed from RAM | |||||
* @{ | |||||
*/ | |||||
#ifdef HAL_FLASH_MODULE_ENABLED | |||||
#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ | |||||
defined(STM32F412Rx) || defined(STM32F412Cx) | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* Private define ------------------------------------------------------------*/ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @defgroup FLASH_RAMFUNC_Exported_Functions FLASH RAMFUNC Exported Functions | |||||
* @{ | |||||
*/ | |||||
/** @defgroup FLASH_RAMFUNC_Exported_Functions_Group1 Peripheral features functions executed from internal RAM | |||||
* @brief Peripheral Extended features functions | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### ramfunc functions ##### | |||||
=============================================================================== | |||||
[..] | |||||
This subsection provides a set of functions that should be executed from RAM | |||||
transfers. | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Stop the flash interface while System Run | |||||
* @note This mode is only available for STM32F41xxx/STM32F446xx devices. | |||||
* @note This mode couldn't be set while executing with the flash itself. | |||||
* It should be done with specific routine executed from RAM. | |||||
* @retval HAL status | |||||
*/ | |||||
__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void) | |||||
{ | |||||
/* Enable Power ctrl clock */ | |||||
__HAL_RCC_PWR_CLK_ENABLE(); | |||||
/* Stop the flash interface while System Run */ | |||||
SET_BIT(PWR->CR, PWR_CR_FISSR); | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Start the flash interface while System Run | |||||
* @note This mode is only available for STM32F411xx/STM32F446xx devices. | |||||
* @note This mode couldn't be set while executing with the flash itself. | |||||
* It should be done with specific routine executed from RAM. | |||||
* @retval HAL status | |||||
*/ | |||||
__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void) | |||||
{ | |||||
/* Enable Power ctrl clock */ | |||||
__HAL_RCC_PWR_CLK_ENABLE(); | |||||
/* Start the flash interface while System Run */ | |||||
CLEAR_BIT(PWR->CR, PWR_CR_FISSR); | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Enable the flash sleep while System Run | |||||
* @note This mode is only available for STM32F41xxx/STM32F446xx devices. | |||||
* @note This mode could n't be set while executing with the flash itself. | |||||
* It should be done with specific routine executed from RAM. | |||||
* @retval HAL status | |||||
*/ | |||||
__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void) | |||||
{ | |||||
/* Enable Power ctrl clock */ | |||||
__HAL_RCC_PWR_CLK_ENABLE(); | |||||
/* Enable the flash sleep while System Run */ | |||||
SET_BIT(PWR->CR, PWR_CR_FMSSR); | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Disable the flash sleep while System Run | |||||
* @note This mode is only available for STM32F41xxx/STM32F446xx devices. | |||||
* @note This mode couldn't be set while executing with the flash itself. | |||||
* It should be done with specific routine executed from RAM. | |||||
* @retval HAL status | |||||
*/ | |||||
__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void) | |||||
{ | |||||
/* Enable Power ctrl clock */ | |||||
__HAL_RCC_PWR_CLK_ENABLE(); | |||||
/* Disable the flash sleep while System Run */ | |||||
CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ | |||||
#endif /* HAL_FLASH_MODULE_ENABLED */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_gpio.c | |||||
* @author MCD Application Team | |||||
* @brief GPIO HAL module driver. | |||||
* This file provides firmware functions to manage the following | |||||
* functionalities of the General Purpose Input/Output (GPIO) peripheral: | |||||
* + Initialization and de-initialization functions | |||||
* + IO operation functions | |||||
* | |||||
@verbatim | |||||
============================================================================== | |||||
##### GPIO Peripheral features ##### | |||||
============================================================================== | |||||
[..] | |||||
Subject to the specific hardware characteristics of each I/O port listed in the datasheet, each | |||||
port bit of the General Purpose IO (GPIO) Ports, can be individually configured by software | |||||
in several modes: | |||||
(+) Input mode | |||||
(+) Analog mode | |||||
(+) Output mode | |||||
(+) Alternate function mode | |||||
(+) External interrupt/event lines | |||||
[..] | |||||
During and just after reset, the alternate functions and external interrupt | |||||
lines are not active and the I/O ports are configured in input floating mode. | |||||
[..] | |||||
All GPIO pins have weak internal pull-up and pull-down resistors, which can be | |||||
activated or not. | |||||
[..] | |||||
In Output or Alternate mode, each IO can be configured on open-drain or push-pull | |||||
type and the IO speed can be selected depending on the VDD value. | |||||
[..] | |||||
All ports have external interrupt/event capability. To use external interrupt | |||||
lines, the port must be configured in input mode. All available GPIO pins are | |||||
connected to the 16 external interrupt/event lines from EXTI0 to EXTI15. | |||||
[..] | |||||
The external interrupt/event controller consists of up to 23 edge detectors | |||||
(16 lines are connected to GPIO) for generating event/interrupt requests (each | |||||
input line can be independently configured to select the type (interrupt or event) | |||||
and the corresponding trigger event (rising or falling or both). Each line can | |||||
also be masked independently. | |||||
##### How to use this driver ##### | |||||
============================================================================== | |||||
[..] | |||||
(#) Enable the GPIO AHB clock using the following function: __HAL_RCC_GPIOx_CLK_ENABLE(). | |||||
(#) Configure the GPIO pin(s) using HAL_GPIO_Init(). | |||||
(++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure | |||||
(++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef | |||||
structure. | |||||
(++) In case of Output or alternate function mode selection: the speed is | |||||
configured through "Speed" member from GPIO_InitTypeDef structure. | |||||
(++) In alternate mode is selection, the alternate function connected to the IO | |||||
is configured through "Alternate" member from GPIO_InitTypeDef structure. | |||||
(++) Analog mode is required when a pin is to be used as ADC channel | |||||
or DAC output. | |||||
(++) In case of external interrupt/event selection the "Mode" member from | |||||
GPIO_InitTypeDef structure select the type (interrupt or event) and | |||||
the corresponding trigger event (rising or falling or both). | |||||
(#) In case of external interrupt/event mode selection, configure NVIC IRQ priority | |||||
mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using | |||||
HAL_NVIC_EnableIRQ(). | |||||
(#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin(). | |||||
(#) To set/reset the level of a pin configured in output mode use | |||||
HAL_GPIO_WritePin()/HAL_GPIO_TogglePin(). | |||||
(#) To lock pin configuration until next reset use HAL_GPIO_LockPin(). | |||||
(#) During and just after reset, the alternate functions are not | |||||
active and the GPIO pins are configured in input floating mode (except JTAG | |||||
pins). | |||||
(#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose | |||||
(PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has | |||||
priority over the GPIO function. | |||||
(#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as | |||||
general purpose PH0 and PH1, respectively, when the HSE oscillator is off. | |||||
The HSE has priority over the GPIO function. | |||||
@endverbatim | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @defgroup GPIO GPIO | |||||
* @brief GPIO HAL module driver | |||||
* @{ | |||||
*/ | |||||
#ifdef HAL_GPIO_MODULE_ENABLED | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* Private define ------------------------------------------------------------*/ | |||||
/** @addtogroup GPIO_Private_Constants GPIO Private Constants | |||||
* @{ | |||||
*/ | |||||
#define GPIO_MODE 0x00000003U | |||||
#define EXTI_MODE 0x10000000U | |||||
#define GPIO_MODE_IT 0x00010000U | |||||
#define GPIO_MODE_EVT 0x00020000U | |||||
#define RISING_EDGE 0x00100000U | |||||
#define FALLING_EDGE 0x00200000U | |||||
#define GPIO_OUTPUT_TYPE 0x00000010U | |||||
#define GPIO_NUMBER 16U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/* Exported functions --------------------------------------------------------*/ | |||||
/** @defgroup GPIO_Exported_Functions GPIO Exported Functions | |||||
* @{ | |||||
*/ | |||||
/** @defgroup GPIO_Exported_Functions_Group1 Initialization and de-initialization functions | |||||
* @brief Initialization and Configuration functions | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### Initialization and de-initialization functions ##### | |||||
=============================================================================== | |||||
[..] | |||||
This section provides functions allowing to initialize and de-initialize the GPIOs | |||||
to be ready for use. | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init. | |||||
* @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or | |||||
* x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. | |||||
* @param GPIO_Init pointer to a GPIO_InitTypeDef structure that contains | |||||
* the configuration information for the specified GPIO peripheral. | |||||
* @retval None | |||||
*/ | |||||
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) | |||||
{ | |||||
uint32_t position; | |||||
uint32_t ioposition = 0x00U; | |||||
uint32_t iocurrent = 0x00U; | |||||
uint32_t temp = 0x00U; | |||||
/* Check the parameters */ | |||||
assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); | |||||
assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); | |||||
assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); | |||||
assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); | |||||
/* Configure the port pins */ | |||||
for(position = 0U; position < GPIO_NUMBER; position++) | |||||
{ | |||||
/* Get the IO position */ | |||||
ioposition = 0x01U << position; | |||||
/* Get the current IO position */ | |||||
iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; | |||||
if(iocurrent == ioposition) | |||||
{ | |||||
/*--------------------- GPIO Mode Configuration ------------------------*/ | |||||
/* In case of Output or Alternate function mode selection */ | |||||
if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || | |||||
(GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) | |||||
{ | |||||
/* Check the Speed parameter */ | |||||
assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); | |||||
/* Configure the IO Speed */ | |||||
temp = GPIOx->OSPEEDR; | |||||
temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); | |||||
temp |= (GPIO_Init->Speed << (position * 2U)); | |||||
GPIOx->OSPEEDR = temp; | |||||
/* Configure the IO Output Type */ | |||||
temp = GPIOx->OTYPER; | |||||
temp &= ~(GPIO_OTYPER_OT_0 << position) ; | |||||
temp |= (((GPIO_Init->Mode & GPIO_OUTPUT_TYPE) >> 4U) << position); | |||||
GPIOx->OTYPER = temp; | |||||
} | |||||
/* Activate the Pull-up or Pull down resistor for the current IO */ | |||||
temp = GPIOx->PUPDR; | |||||
temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); | |||||
temp |= ((GPIO_Init->Pull) << (position * 2U)); | |||||
GPIOx->PUPDR = temp; | |||||
/* In case of Alternate function mode selection */ | |||||
if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) | |||||
{ | |||||
/* Check the Alternate function parameter */ | |||||
assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); | |||||
/* Configure Alternate function mapped with the current IO */ | |||||
temp = GPIOx->AFR[position >> 3U]; | |||||
temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; | |||||
temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U)); | |||||
GPIOx->AFR[position >> 3U] = temp; | |||||
} | |||||
/* Configure IO Direction mode (Input, Output, Alternate or Analog) */ | |||||
temp = GPIOx->MODER; | |||||
temp &= ~(GPIO_MODER_MODER0 << (position * 2U)); | |||||
temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U)); | |||||
GPIOx->MODER = temp; | |||||
/*--------------------- EXTI Mode Configuration ------------------------*/ | |||||
/* Configure the External Interrupt or event for the current IO */ | |||||
if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) | |||||
{ | |||||
/* Enable SYSCFG Clock */ | |||||
__HAL_RCC_SYSCFG_CLK_ENABLE(); | |||||
temp = SYSCFG->EXTICR[position >> 2U]; | |||||
temp &= ~(0x0FU << (4U * (position & 0x03U))); | |||||
temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))); | |||||
SYSCFG->EXTICR[position >> 2U] = temp; | |||||
/* Clear EXTI line configuration */ | |||||
temp = EXTI->IMR; | |||||
temp &= ~((uint32_t)iocurrent); | |||||
if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT) | |||||
{ | |||||
temp |= iocurrent; | |||||
} | |||||
EXTI->IMR = temp; | |||||
temp = EXTI->EMR; | |||||
temp &= ~((uint32_t)iocurrent); | |||||
if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT) | |||||
{ | |||||
temp |= iocurrent; | |||||
} | |||||
EXTI->EMR = temp; | |||||
/* Clear Rising Falling edge configuration */ | |||||
temp = EXTI->RTSR; | |||||
temp &= ~((uint32_t)iocurrent); | |||||
if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE) | |||||
{ | |||||
temp |= iocurrent; | |||||
} | |||||
EXTI->RTSR = temp; | |||||
temp = EXTI->FTSR; | |||||
temp &= ~((uint32_t)iocurrent); | |||||
if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE) | |||||
{ | |||||
temp |= iocurrent; | |||||
} | |||||
EXTI->FTSR = temp; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* @brief De-initializes the GPIOx peripheral registers to their default reset values. | |||||
* @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or | |||||
* x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. | |||||
* @param GPIO_Pin specifies the port bit to be written. | |||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). | |||||
* @retval None | |||||
*/ | |||||
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) | |||||
{ | |||||
uint32_t position; | |||||
uint32_t ioposition = 0x00U; | |||||
uint32_t iocurrent = 0x00U; | |||||
uint32_t tmp = 0x00U; | |||||
/* Check the parameters */ | |||||
assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); | |||||
/* Configure the port pins */ | |||||
for(position = 0U; position < GPIO_NUMBER; position++) | |||||
{ | |||||
/* Get the IO position */ | |||||
ioposition = 0x01U << position; | |||||
/* Get the current IO position */ | |||||
iocurrent = (GPIO_Pin) & ioposition; | |||||
if(iocurrent == ioposition) | |||||
{ | |||||
/*------------------------- EXTI Mode Configuration --------------------*/ | |||||
tmp = SYSCFG->EXTICR[position >> 2U]; | |||||
tmp &= (0x0FU << (4U * (position & 0x03U))); | |||||
if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U)))) | |||||
{ | |||||
/* Clear EXTI line configuration */ | |||||
EXTI->IMR &= ~((uint32_t)iocurrent); | |||||
EXTI->EMR &= ~((uint32_t)iocurrent); | |||||
/* Clear Rising Falling edge configuration */ | |||||
EXTI->RTSR &= ~((uint32_t)iocurrent); | |||||
EXTI->FTSR &= ~((uint32_t)iocurrent); | |||||
/* Configure the External Interrupt or event for the current IO */ | |||||
tmp = 0x0FU << (4U * (position & 0x03U)); | |||||
SYSCFG->EXTICR[position >> 2U] &= ~tmp; | |||||
} | |||||
/*------------------------- GPIO Mode Configuration --------------------*/ | |||||
/* Configure IO Direction in Input Floating Mode */ | |||||
GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2U)); | |||||
/* Configure the default Alternate Function in current IO */ | |||||
GPIOx->AFR[position >> 3U] &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; | |||||
/* Deactivate the Pull-up and Pull-down resistor for the current IO */ | |||||
GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); | |||||
/* Configure the default value IO Output Type */ | |||||
GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; | |||||
/* Configure the default value for IO Speed */ | |||||
GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions | |||||
* @brief GPIO Read and Write | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### IO operation functions ##### | |||||
=============================================================================== | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Reads the specified input port pin. | |||||
* @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or | |||||
* x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. | |||||
* @param GPIO_Pin specifies the port bit to read. | |||||
* This parameter can be GPIO_PIN_x where x can be (0..15). | |||||
* @retval The input port pin value. | |||||
*/ | |||||
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) | |||||
{ | |||||
GPIO_PinState bitstatus; | |||||
/* Check the parameters */ | |||||
assert_param(IS_GPIO_PIN(GPIO_Pin)); | |||||
if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET) | |||||
{ | |||||
bitstatus = GPIO_PIN_SET; | |||||
} | |||||
else | |||||
{ | |||||
bitstatus = GPIO_PIN_RESET; | |||||
} | |||||
return bitstatus; | |||||
} | |||||
/** | |||||
* @brief Sets or clears the selected data port bit. | |||||
* | |||||
* @note This function uses GPIOx_BSRR register to allow atomic read/modify | |||||
* accesses. In this way, there is no risk of an IRQ occurring between | |||||
* the read and the modify access. | |||||
* | |||||
* @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or | |||||
* x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. | |||||
* @param GPIO_Pin specifies the port bit to be written. | |||||
* This parameter can be one of GPIO_PIN_x where x can be (0..15). | |||||
* @param PinState specifies the value to be written to the selected bit. | |||||
* This parameter can be one of the GPIO_PinState enum values: | |||||
* @arg GPIO_PIN_RESET: to clear the port pin | |||||
* @arg GPIO_PIN_SET: to set the port pin | |||||
* @retval None | |||||
*/ | |||||
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_GPIO_PIN(GPIO_Pin)); | |||||
assert_param(IS_GPIO_PIN_ACTION(PinState)); | |||||
if(PinState != GPIO_PIN_RESET) | |||||
{ | |||||
GPIOx->BSRR = GPIO_Pin; | |||||
} | |||||
else | |||||
{ | |||||
GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; | |||||
} | |||||
} | |||||
/** | |||||
* @brief Toggles the specified GPIO pins. | |||||
* @param GPIOx Where x can be (A..K) to select the GPIO peripheral for STM32F429X device or | |||||
* x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. | |||||
* @param GPIO_Pin Specifies the pins to be toggled. | |||||
* @retval None | |||||
*/ | |||||
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_GPIO_PIN(GPIO_Pin)); | |||||
if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) | |||||
{ | |||||
GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; | |||||
} | |||||
else | |||||
{ | |||||
GPIOx->BSRR = GPIO_Pin; | |||||
} | |||||
} | |||||
/** | |||||
* @brief Locks GPIO Pins configuration registers. | |||||
* @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, | |||||
* GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. | |||||
* @note The configuration of the locked GPIO pins can no longer be modified | |||||
* until the next reset. | |||||
* @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F4 family | |||||
* @param GPIO_Pin specifies the port bit to be locked. | |||||
* This parameter can be any combination of GPIO_PIN_x where x can be (0..15). | |||||
* @retval None | |||||
*/ | |||||
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) | |||||
{ | |||||
__IO uint32_t tmp = GPIO_LCKR_LCKK; | |||||
/* Check the parameters */ | |||||
assert_param(IS_GPIO_PIN(GPIO_Pin)); | |||||
/* Apply lock key write sequence */ | |||||
tmp |= GPIO_Pin; | |||||
/* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ | |||||
GPIOx->LCKR = tmp; | |||||
/* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */ | |||||
GPIOx->LCKR = GPIO_Pin; | |||||
/* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ | |||||
GPIOx->LCKR = tmp; | |||||
/* Read LCKR register. This read is mandatory to complete key lock sequence */ | |||||
tmp = GPIOx->LCKR; | |||||
/* Read again in order to confirm lock is active */ | |||||
if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) | |||||
{ | |||||
return HAL_OK; | |||||
} | |||||
else | |||||
{ | |||||
return HAL_ERROR; | |||||
} | |||||
} | |||||
/** | |||||
* @brief This function handles EXTI interrupt request. | |||||
* @param GPIO_Pin Specifies the pins connected EXTI line | |||||
* @retval None | |||||
*/ | |||||
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) | |||||
{ | |||||
/* EXTI line interrupt detected */ | |||||
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) | |||||
{ | |||||
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); | |||||
HAL_GPIO_EXTI_Callback(GPIO_Pin); | |||||
} | |||||
} | |||||
/** | |||||
* @brief EXTI line detection callbacks. | |||||
* @param GPIO_Pin Specifies the pins connected EXTI line | |||||
* @retval None | |||||
*/ | |||||
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) | |||||
{ | |||||
/* Prevent unused argument(s) compilation warning */ | |||||
UNUSED(GPIO_Pin); | |||||
/* NOTE: This function Should not be modified, when the callback is needed, | |||||
the HAL_GPIO_EXTI_Callback could be implemented in the user file | |||||
*/ | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* HAL_GPIO_MODULE_ENABLED */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_pwr.c | |||||
* @author MCD Application Team | |||||
* @brief PWR HAL module driver. | |||||
* This file provides firmware functions to manage the following | |||||
* functionalities of the Power Controller (PWR) peripheral: | |||||
* + Initialization and de-initialization functions | |||||
* + Peripheral Control functions | |||||
* | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @defgroup PWR PWR | |||||
* @brief PWR HAL module driver | |||||
* @{ | |||||
*/ | |||||
#ifdef HAL_PWR_MODULE_ENABLED | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* Private define ------------------------------------------------------------*/ | |||||
/** @addtogroup PWR_Private_Constants | |||||
* @{ | |||||
*/ | |||||
/** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask | |||||
* @{ | |||||
*/ | |||||
#define PVD_MODE_IT 0x00010000U | |||||
#define PVD_MODE_EVT 0x00020000U | |||||
#define PVD_RISING_EDGE 0x00000001U | |||||
#define PVD_FALLING_EDGE 0x00000002U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/** @defgroup PWR_Exported_Functions PWR Exported Functions | |||||
* @{ | |||||
*/ | |||||
/** @defgroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions | |||||
* @brief Initialization and de-initialization functions | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### Initialization and de-initialization functions ##### | |||||
=============================================================================== | |||||
[..] | |||||
After reset, the backup domain (RTC registers, RTC backup data | |||||
registers and backup SRAM) is protected against possible unwanted | |||||
write accesses. | |||||
To enable access to the RTC Domain and RTC registers, proceed as follows: | |||||
(+) Enable the Power Controller (PWR) APB1 interface clock using the | |||||
__HAL_RCC_PWR_CLK_ENABLE() macro. | |||||
(+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Deinitializes the HAL PWR peripheral registers to their default reset values. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_DeInit(void) | |||||
{ | |||||
__HAL_RCC_PWR_FORCE_RESET(); | |||||
__HAL_RCC_PWR_RELEASE_RESET(); | |||||
} | |||||
/** | |||||
* @brief Enables access to the backup domain (RTC registers, RTC | |||||
* backup data registers and backup SRAM). | |||||
* @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the | |||||
* Backup Domain Access should be kept enabled. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_EnableBkUpAccess(void) | |||||
{ | |||||
*(__IO uint32_t *) CR_DBP_BB = (uint32_t)ENABLE; | |||||
} | |||||
/** | |||||
* @brief Disables access to the backup domain (RTC registers, RTC | |||||
* backup data registers and backup SRAM). | |||||
* @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the | |||||
* Backup Domain Access should be kept enabled. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_DisableBkUpAccess(void) | |||||
{ | |||||
*(__IO uint32_t *) CR_DBP_BB = (uint32_t)DISABLE; | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @defgroup PWR_Exported_Functions_Group2 Peripheral Control functions | |||||
* @brief Low Power modes configuration functions | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### Peripheral Control functions ##### | |||||
=============================================================================== | |||||
*** PVD configuration *** | |||||
========================= | |||||
[..] | |||||
(+) The PVD is used to monitor the VDD power supply by comparing it to a | |||||
threshold selected by the PVD Level (PLS[2:0] bits in the PWR_CR). | |||||
(+) A PVDO flag is available to indicate if VDD/VDDA is higher or lower | |||||
than the PVD threshold. This event is internally connected to the EXTI | |||||
line16 and can generate an interrupt if enabled. This is done through | |||||
__HAL_PWR_PVD_EXTI_ENABLE_IT() macro. | |||||
(+) The PVD is stopped in Standby mode. | |||||
*** Wake-up pin configuration *** | |||||
================================ | |||||
[..] | |||||
(+) Wake-up pin is used to wake up the system from Standby mode. This pin is | |||||
forced in input pull-down configuration and is active on rising edges. | |||||
(+) There is one Wake-up pin: Wake-up Pin 1 on PA.00. | |||||
(++) For STM32F446xx there are two Wake-Up pins: Pin1 on PA.00 and Pin2 on PC.13 | |||||
(++) For STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx there are three Wake-Up pins: Pin1 on PA.00, Pin2 on PC.00 and Pin3 on PC.01 | |||||
*** Low Power modes configuration *** | |||||
===================================== | |||||
[..] | |||||
The devices feature 3 low-power modes: | |||||
(+) Sleep mode: Cortex-M4 core stopped, peripherals kept running. | |||||
(+) Stop mode: all clocks are stopped, regulator running, regulator | |||||
in low power mode | |||||
(+) Standby mode: 1.2V domain powered off. | |||||
*** Sleep mode *** | |||||
================== | |||||
[..] | |||||
(+) Entry: | |||||
The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI) | |||||
functions with | |||||
(++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction | |||||
(++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction | |||||
-@@- The Regulator parameter is not used for the STM32F4 family | |||||
and is kept as parameter just to maintain compatibility with the | |||||
lower power families (STM32L). | |||||
(+) Exit: | |||||
Any peripheral interrupt acknowledged by the nested vectored interrupt | |||||
controller (NVIC) can wake up the device from Sleep mode. | |||||
*** Stop mode *** | |||||
================= | |||||
[..] | |||||
In Stop mode, all clocks in the 1.2V domain are stopped, the PLL, the HSI, | |||||
and the HSE RC oscillators are disabled. Internal SRAM and register contents | |||||
are preserved. | |||||
The voltage regulator can be configured either in normal or low-power mode. | |||||
To minimize the consumption In Stop mode, FLASH can be powered off before | |||||
entering the Stop mode using the HAL_PWREx_EnableFlashPowerDown() function. | |||||
It can be switched on again by software after exiting the Stop mode using | |||||
the HAL_PWREx_DisableFlashPowerDown() function. | |||||
(+) Entry: | |||||
The Stop mode is entered using the HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON) | |||||
function with: | |||||
(++) Main regulator ON. | |||||
(++) Low Power regulator ON. | |||||
(+) Exit: | |||||
Any EXTI Line (Internal or External) configured in Interrupt/Event mode. | |||||
*** Standby mode *** | |||||
==================== | |||||
[..] | |||||
(+) | |||||
The Standby mode allows to achieve the lowest power consumption. It is based | |||||
on the Cortex-M4 deep sleep mode, with the voltage regulator disabled. | |||||
The 1.2V domain is consequently powered off. The PLL, the HSI oscillator and | |||||
the HSE oscillator are also switched off. SRAM and register contents are lost | |||||
except for the RTC registers, RTC backup registers, backup SRAM and Standby | |||||
circuitry. | |||||
The voltage regulator is OFF. | |||||
(++) Entry: | |||||
(+++) The Standby mode is entered using the HAL_PWR_EnterSTANDBYMode() function. | |||||
(++) Exit: | |||||
(+++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wake-up, | |||||
tamper event, time-stamp event, external reset in NRST pin, IWDG reset. | |||||
*** Auto-wake-up (AWU) from low-power mode *** | |||||
============================================= | |||||
[..] | |||||
(+) The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC | |||||
Wake-up event, a tamper event or a time-stamp event, without depending on | |||||
an external interrupt (Auto-wake-up mode). | |||||
(+) RTC auto-wake-up (AWU) from the Stop and Standby modes | |||||
(++) To wake up from the Stop mode with an RTC alarm event, it is necessary to | |||||
configure the RTC to generate the RTC alarm using the HAL_RTC_SetAlarm_IT() function. | |||||
(++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it | |||||
is necessary to configure the RTC to detect the tamper or time stamp event using the | |||||
HAL_RTCEx_SetTimeStamp_IT() or HAL_RTCEx_SetTamper_IT() functions. | |||||
(++) To wake up from the Stop mode with an RTC Wake-up event, it is necessary to | |||||
configure the RTC to generate the RTC Wake-up event using the HAL_RTCEx_SetWakeUpTimer_IT() function. | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). | |||||
* @param sConfigPVD pointer to an PWR_PVDTypeDef structure that contains the configuration | |||||
* information for the PVD. | |||||
* @note Refer to the electrical characteristics of your device datasheet for | |||||
* more details about the voltage threshold corresponding to each | |||||
* detection level. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_PWR_PVD_LEVEL(sConfigPVD->PVDLevel)); | |||||
assert_param(IS_PWR_PVD_MODE(sConfigPVD->Mode)); | |||||
/* Set PLS[7:5] bits according to PVDLevel value */ | |||||
MODIFY_REG(PWR->CR, PWR_CR_PLS, sConfigPVD->PVDLevel); | |||||
/* Clear any previous config. Keep it clear if no event or IT mode is selected */ | |||||
__HAL_PWR_PVD_EXTI_DISABLE_EVENT(); | |||||
__HAL_PWR_PVD_EXTI_DISABLE_IT(); | |||||
__HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); | |||||
__HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); | |||||
/* Configure interrupt mode */ | |||||
if((sConfigPVD->Mode & PVD_MODE_IT) == PVD_MODE_IT) | |||||
{ | |||||
__HAL_PWR_PVD_EXTI_ENABLE_IT(); | |||||
} | |||||
/* Configure event mode */ | |||||
if((sConfigPVD->Mode & PVD_MODE_EVT) == PVD_MODE_EVT) | |||||
{ | |||||
__HAL_PWR_PVD_EXTI_ENABLE_EVENT(); | |||||
} | |||||
/* Configure the edge */ | |||||
if((sConfigPVD->Mode & PVD_RISING_EDGE) == PVD_RISING_EDGE) | |||||
{ | |||||
__HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE(); | |||||
} | |||||
if((sConfigPVD->Mode & PVD_FALLING_EDGE) == PVD_FALLING_EDGE) | |||||
{ | |||||
__HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); | |||||
} | |||||
} | |||||
/** | |||||
* @brief Enables the Power Voltage Detector(PVD). | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_EnablePVD(void) | |||||
{ | |||||
*(__IO uint32_t *) CR_PVDE_BB = (uint32_t)ENABLE; | |||||
} | |||||
/** | |||||
* @brief Disables the Power Voltage Detector(PVD). | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_DisablePVD(void) | |||||
{ | |||||
*(__IO uint32_t *) CR_PVDE_BB = (uint32_t)DISABLE; | |||||
} | |||||
/** | |||||
* @brief Enables the Wake-up PINx functionality. | |||||
* @param WakeUpPinx Specifies the Power Wake-Up pin to enable. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_WAKEUP_PIN1 | |||||
* @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices | |||||
* @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx) | |||||
{ | |||||
/* Check the parameter */ | |||||
assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); | |||||
/* Enable the wake up pin */ | |||||
SET_BIT(PWR->CSR, WakeUpPinx); | |||||
} | |||||
/** | |||||
* @brief Disables the Wake-up PINx functionality. | |||||
* @param WakeUpPinx Specifies the Power Wake-Up pin to disable. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_WAKEUP_PIN1 | |||||
* @arg PWR_WAKEUP_PIN2 available only on STM32F410xx/STM32F446xx/STM32F412xx/STM32F413xx/STM32F423xx devices | |||||
* @arg PWR_WAKEUP_PIN3 available only on STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx devices | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) | |||||
{ | |||||
/* Check the parameter */ | |||||
assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); | |||||
/* Disable the wake up pin */ | |||||
CLEAR_BIT(PWR->CSR, WakeUpPinx); | |||||
} | |||||
/** | |||||
* @brief Enters Sleep mode. | |||||
* | |||||
* @note In Sleep mode, all I/O pins keep the same state as in Run mode. | |||||
* | |||||
* @note In Sleep mode, the systick is stopped to avoid exit from this mode with | |||||
* systick interrupt when used as time base for Timeout | |||||
* | |||||
* @param Regulator Specifies the regulator state in SLEEP mode. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON | |||||
* @arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON | |||||
* @note This parameter is not used for the STM32F4 family and is kept as parameter | |||||
* just to maintain compatibility with the lower power families. | |||||
* @param SLEEPEntry Specifies if SLEEP mode in entered with WFI or WFE instruction. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction | |||||
* @arg PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_PWR_REGULATOR(Regulator)); | |||||
assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); | |||||
/* Clear SLEEPDEEP bit of Cortex System Control Register */ | |||||
CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); | |||||
/* Select SLEEP mode entry -------------------------------------------------*/ | |||||
if(SLEEPEntry == PWR_SLEEPENTRY_WFI) | |||||
{ | |||||
/* Request Wait For Interrupt */ | |||||
__WFI(); | |||||
} | |||||
else | |||||
{ | |||||
/* Request Wait For Event */ | |||||
__SEV(); | |||||
__WFE(); | |||||
__WFE(); | |||||
} | |||||
} | |||||
/** | |||||
* @brief Enters Stop mode. | |||||
* @note In Stop mode, all I/O pins keep the same state as in Run mode. | |||||
* @note When exiting Stop mode by issuing an interrupt or a wake-up event, | |||||
* the HSI RC oscillator is selected as system clock. | |||||
* @note When the voltage regulator operates in low power mode, an additional | |||||
* startup delay is incurred when waking up from Stop mode. | |||||
* By keeping the internal regulator ON during Stop mode, the consumption | |||||
* is higher although the startup time is reduced. | |||||
* @param Regulator Specifies the regulator state in Stop mode. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_MAINREGULATOR_ON: Stop mode with regulator ON | |||||
* @arg PWR_LOWPOWERREGULATOR_ON: Stop mode with low power regulator ON | |||||
* @param STOPEntry Specifies if Stop mode in entered with WFI or WFE instruction. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_STOPENTRY_WFI: Enter Stop mode with WFI instruction | |||||
* @arg PWR_STOPENTRY_WFE: Enter Stop mode with WFE instruction | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) | |||||
{ | |||||
/* Check the parameters */ | |||||
assert_param(IS_PWR_REGULATOR(Regulator)); | |||||
assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); | |||||
/* Select the regulator state in Stop mode: Set PDDS and LPDS bits according to PWR_Regulator value */ | |||||
MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS), Regulator); | |||||
/* Set SLEEPDEEP bit of Cortex System Control Register */ | |||||
SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); | |||||
/* Select Stop mode entry --------------------------------------------------*/ | |||||
if(STOPEntry == PWR_STOPENTRY_WFI) | |||||
{ | |||||
/* Request Wait For Interrupt */ | |||||
__WFI(); | |||||
} | |||||
else | |||||
{ | |||||
/* Request Wait For Event */ | |||||
__SEV(); | |||||
__WFE(); | |||||
__WFE(); | |||||
} | |||||
/* Reset SLEEPDEEP bit of Cortex System Control Register */ | |||||
CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); | |||||
} | |||||
/** | |||||
* @brief Enters Standby mode. | |||||
* @note In Standby mode, all I/O pins are high impedance except for: | |||||
* - Reset pad (still available) | |||||
* - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC | |||||
* Alarm out, or RTC clock calibration out. | |||||
* - RTC_AF2 pin (PI8) if configured for tamper or time-stamp. | |||||
* - WKUP pin 1 (PA0) if enabled. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_EnterSTANDBYMode(void) | |||||
{ | |||||
/* Select Standby mode */ | |||||
SET_BIT(PWR->CR, PWR_CR_PDDS); | |||||
/* Set SLEEPDEEP bit of Cortex System Control Register */ | |||||
SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); | |||||
/* This option is used to ensure that store operations are completed */ | |||||
#if defined ( __CC_ARM) | |||||
__force_stores(); | |||||
#endif | |||||
/* Request Wait For Interrupt */ | |||||
__WFI(); | |||||
} | |||||
/** | |||||
* @brief This function handles the PWR PVD interrupt request. | |||||
* @note This API should be called under the PVD_IRQHandler(). | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_PVD_IRQHandler(void) | |||||
{ | |||||
/* Check PWR Exti flag */ | |||||
if(__HAL_PWR_PVD_EXTI_GET_FLAG() != RESET) | |||||
{ | |||||
/* PWR PVD interrupt user callback */ | |||||
HAL_PWR_PVDCallback(); | |||||
/* Clear PWR Exti pending bit */ | |||||
__HAL_PWR_PVD_EXTI_CLEAR_FLAG(); | |||||
} | |||||
} | |||||
/** | |||||
* @brief PWR PVD interrupt callback | |||||
* @retval None | |||||
*/ | |||||
__weak void HAL_PWR_PVDCallback(void) | |||||
{ | |||||
/* NOTE : This function Should not be modified, when the callback is needed, | |||||
the HAL_PWR_PVDCallback could be implemented in the user file | |||||
*/ | |||||
} | |||||
/** | |||||
* @brief Indicates Sleep-On-Exit when returning from Handler mode to Thread mode. | |||||
* @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the processor | |||||
* re-enters SLEEP mode when an interruption handling is over. | |||||
* Setting this bit is useful when the processor is expected to run only on | |||||
* interruptions handling. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_EnableSleepOnExit(void) | |||||
{ | |||||
/* Set SLEEPONEXIT bit of Cortex System Control Register */ | |||||
SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); | |||||
} | |||||
/** | |||||
* @brief Disables Sleep-On-Exit feature when returning from Handler mode to Thread mode. | |||||
* @note Clears SLEEPONEXIT bit of SCR register. When this bit is set, the processor | |||||
* re-enters SLEEP mode when an interruption handling is over. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_DisableSleepOnExit(void) | |||||
{ | |||||
/* Clear SLEEPONEXIT bit of Cortex System Control Register */ | |||||
CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); | |||||
} | |||||
/** | |||||
* @brief Enables CORTEX M4 SEVONPEND bit. | |||||
* @note Sets SEVONPEND bit of SCR register. When this bit is set, this causes | |||||
* WFE to wake up when an interrupt moves from inactive to pended. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_EnableSEVOnPend(void) | |||||
{ | |||||
/* Set SEVONPEND bit of Cortex System Control Register */ | |||||
SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); | |||||
} | |||||
/** | |||||
* @brief Disables CORTEX M4 SEVONPEND bit. | |||||
* @note Clears SEVONPEND bit of SCR register. When this bit is set, this causes | |||||
* WFE to wake up when an interrupt moves from inactive to pended. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWR_DisableSEVOnPend(void) | |||||
{ | |||||
/* Clear SEVONPEND bit of Cortex System Control Register */ | |||||
CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); | |||||
} | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* HAL_PWR_MODULE_ENABLED */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32f4xx_hal_pwr_ex.c | |||||
* @author MCD Application Team | |||||
* @brief Extended PWR HAL module driver. | |||||
* This file provides firmware functions to manage the following | |||||
* functionalities of PWR extension peripheral: | |||||
* + Peripheral Extended features functions | |||||
* | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32f4xx_hal.h" | |||||
/** @addtogroup STM32F4xx_HAL_Driver | |||||
* @{ | |||||
*/ | |||||
/** @defgroup PWREx PWREx | |||||
* @brief PWR HAL module driver | |||||
* @{ | |||||
*/ | |||||
#ifdef HAL_PWR_MODULE_ENABLED | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* Private define ------------------------------------------------------------*/ | |||||
/** @addtogroup PWREx_Private_Constants | |||||
* @{ | |||||
*/ | |||||
#define PWR_OVERDRIVE_TIMEOUT_VALUE 1000U | |||||
#define PWR_UDERDRIVE_TIMEOUT_VALUE 1000U | |||||
#define PWR_BKPREG_TIMEOUT_VALUE 1000U | |||||
#define PWR_VOSRDY_TIMEOUT_VALUE 1000U | |||||
/** | |||||
* @} | |||||
*/ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
/* Private functions ---------------------------------------------------------*/ | |||||
/** @defgroup PWREx_Exported_Functions PWREx Exported Functions | |||||
* @{ | |||||
*/ | |||||
/** @defgroup PWREx_Exported_Functions_Group1 Peripheral Extended features functions | |||||
* @brief Peripheral Extended features functions | |||||
* | |||||
@verbatim | |||||
=============================================================================== | |||||
##### Peripheral extended features functions ##### | |||||
=============================================================================== | |||||
*** Main and Backup Regulators configuration *** | |||||
================================================ | |||||
[..] | |||||
(+) The backup domain includes 4 Kbytes of backup SRAM accessible only from | |||||
the CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is | |||||
retained even in Standby or VBAT mode when the low power backup regulator | |||||
is enabled. It can be considered as an internal EEPROM when VBAT is | |||||
always present. You can use the HAL_PWREx_EnableBkUpReg() function to | |||||
enable the low power backup regulator. | |||||
(+) When the backup domain is supplied by VDD (analog switch connected to VDD) | |||||
the backup SRAM is powered from VDD which replaces the VBAT power supply to | |||||
save battery life. | |||||
(+) The backup SRAM is not mass erased by a tamper event. It is read | |||||
protected to prevent confidential data, such as cryptographic private | |||||
key, from being accessed. The backup SRAM can be erased only through | |||||
the Flash interface when a protection level change from level 1 to | |||||
level 0 is requested. | |||||
-@- Refer to the description of Read protection (RDP) in the Flash | |||||
programming manual. | |||||
(+) The main internal regulator can be configured to have a tradeoff between | |||||
performance and power consumption when the device does not operate at | |||||
the maximum frequency. This is done through __HAL_PWR_MAINREGULATORMODE_CONFIG() | |||||
macro which configure VOS bit in PWR_CR register | |||||
Refer to the product datasheets for more details. | |||||
*** FLASH Power Down configuration **** | |||||
======================================= | |||||
[..] | |||||
(+) By setting the FPDS bit in the PWR_CR register by using the | |||||
HAL_PWREx_EnableFlashPowerDown() function, the Flash memory also enters power | |||||
down mode when the device enters Stop mode. When the Flash memory | |||||
is in power down mode, an additional startup delay is incurred when | |||||
waking up from Stop mode. | |||||
(+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, the scale can be modified only when the PLL | |||||
is OFF and the HSI or HSE clock source is selected as system clock. | |||||
The new value programmed is active only when the PLL is ON. | |||||
When the PLL is OFF, the voltage scale 3 is automatically selected. | |||||
Refer to the datasheets for more details. | |||||
*** Over-Drive and Under-Drive configuration **** | |||||
================================================= | |||||
[..] | |||||
(+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Run mode: the main regulator has | |||||
2 operating modes available: | |||||
(++) Normal mode: The CPU and core logic operate at maximum frequency at a given | |||||
voltage scaling (scale 1, scale 2 or scale 3) | |||||
(++) Over-drive mode: This mode allows the CPU and the core logic to operate at a | |||||
higher frequency than the normal mode for a given voltage scaling (scale 1, | |||||
scale 2 or scale 3). This mode is enabled through HAL_PWREx_EnableOverDrive() function and | |||||
disabled by HAL_PWREx_DisableOverDrive() function, to enter or exit from Over-drive mode please follow | |||||
the sequence described in Reference manual. | |||||
(+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Stop mode: the main regulator or low power regulator | |||||
supplies a low power voltage to the 1.2V domain, thus preserving the content of registers | |||||
and internal SRAM. 2 operating modes are available: | |||||
(++) Normal mode: the 1.2V domain is preserved in nominal leakage mode. This mode is only | |||||
available when the main regulator or the low power regulator is used in Scale 3 or | |||||
low voltage mode. | |||||
(++) Under-drive mode: the 1.2V domain is preserved in reduced leakage mode. This mode is only | |||||
available when the main regulator or the low power regulator is in low voltage mode. | |||||
@endverbatim | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Enables the Backup Regulator. | |||||
* @retval HAL status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void) | |||||
{ | |||||
uint32_t tickstart = 0U; | |||||
*(__IO uint32_t *) CSR_BRE_BB = (uint32_t)ENABLE; | |||||
/* Get tick */ | |||||
tickstart = HAL_GetTick(); | |||||
/* Wait till Backup regulator ready flag is set */ | |||||
while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) == RESET) | |||||
{ | |||||
if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) | |||||
{ | |||||
return HAL_TIMEOUT; | |||||
} | |||||
} | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Disables the Backup Regulator. | |||||
* @retval HAL status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void) | |||||
{ | |||||
uint32_t tickstart = 0U; | |||||
*(__IO uint32_t *) CSR_BRE_BB = (uint32_t)DISABLE; | |||||
/* Get tick */ | |||||
tickstart = HAL_GetTick(); | |||||
/* Wait till Backup regulator ready flag is set */ | |||||
while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) != RESET) | |||||
{ | |||||
if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) | |||||
{ | |||||
return HAL_TIMEOUT; | |||||
} | |||||
} | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Enables the Flash Power Down in Stop mode. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWREx_EnableFlashPowerDown(void) | |||||
{ | |||||
*(__IO uint32_t *) CR_FPDS_BB = (uint32_t)ENABLE; | |||||
} | |||||
/** | |||||
* @brief Disables the Flash Power Down in Stop mode. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWREx_DisableFlashPowerDown(void) | |||||
{ | |||||
*(__IO uint32_t *) CR_FPDS_BB = (uint32_t)DISABLE; | |||||
} | |||||
/** | |||||
* @brief Return Voltage Scaling Range. | |||||
* @retval The configured scale for the regulator voltage(VOS bit field). | |||||
* The returned value can be one of the following: | |||||
* - @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode | |||||
* - @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode | |||||
* - @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode | |||||
*/ | |||||
uint32_t HAL_PWREx_GetVoltageRange(void) | |||||
{ | |||||
return (PWR->CR & PWR_CR_VOS); | |||||
} | |||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) | |||||
/** | |||||
* @brief Configures the main internal regulator output voltage. | |||||
* @param VoltageScaling specifies the regulator output voltage to achieve | |||||
* a tradeoff between performance and power consumption. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, | |||||
* the maximum value of fHCLK = 168 MHz. | |||||
* @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, | |||||
* the maximum value of fHCLK = 144 MHz. | |||||
* @note When moving from Range 1 to Range 2, the system frequency must be decreased to | |||||
* a value below 144 MHz before calling HAL_PWREx_ConfigVoltageScaling() API. | |||||
* When moving from Range 2 to Range 1, the system frequency can be increased to | |||||
* a value up to 168 MHz after calling HAL_PWREx_ConfigVoltageScaling() API. | |||||
* @retval HAL Status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) | |||||
{ | |||||
uint32_t tickstart = 0U; | |||||
assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); | |||||
/* Enable PWR RCC Clock Peripheral */ | |||||
__HAL_RCC_PWR_CLK_ENABLE(); | |||||
/* Set Range */ | |||||
__HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); | |||||
/* Get Start Tick*/ | |||||
tickstart = HAL_GetTick(); | |||||
while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) | |||||
{ | |||||
if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) | |||||
{ | |||||
return HAL_TIMEOUT; | |||||
} | |||||
} | |||||
return HAL_OK; | |||||
} | |||||
#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ | |||||
defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || \ | |||||
defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || \ | |||||
defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || \ | |||||
defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) | |||||
/** | |||||
* @brief Configures the main internal regulator output voltage. | |||||
* @param VoltageScaling specifies the regulator output voltage to achieve | |||||
* a tradeoff between performance and power consumption. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, | |||||
* the maximum value of fHCLK is 168 MHz. It can be extended to | |||||
* 180 MHz by activating the over-drive mode. | |||||
* @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, | |||||
* the maximum value of fHCLK is 144 MHz. It can be extended to, | |||||
* 168 MHz by activating the over-drive mode. | |||||
* @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output range 3 mode, | |||||
* the maximum value of fHCLK is 120 MHz. | |||||
* @note To update the system clock frequency(SYSCLK): | |||||
* - Set the HSI or HSE as system clock frequency using the HAL_RCC_ClockConfig(). | |||||
* - Call the HAL_RCC_OscConfig() to configure the PLL. | |||||
* - Call HAL_PWREx_ConfigVoltageScaling() API to adjust the voltage scale. | |||||
* - Set the new system clock frequency using the HAL_RCC_ClockConfig(). | |||||
* @note The scale can be modified only when the HSI or HSE clock source is selected | |||||
* as system clock source, otherwise the API returns HAL_ERROR. | |||||
* @note When the PLL is OFF, the voltage scale 3 is automatically selected and the VOS bits | |||||
* value in the PWR_CR1 register are not taken in account. | |||||
* @note This API forces the PLL state ON to allow the possibility to configure the voltage scale 1 or 2. | |||||
* @note The new voltage scale is active only when the PLL is ON. | |||||
* @retval HAL Status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) | |||||
{ | |||||
uint32_t tickstart = 0U; | |||||
assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); | |||||
/* Enable PWR RCC Clock Peripheral */ | |||||
__HAL_RCC_PWR_CLK_ENABLE(); | |||||
/* Check if the PLL is used as system clock or not */ | |||||
if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) | |||||
{ | |||||
/* Disable the main PLL */ | |||||
__HAL_RCC_PLL_DISABLE(); | |||||
/* Get Start Tick */ | |||||
tickstart = HAL_GetTick(); | |||||
/* Wait till PLL is disabled */ | |||||
while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) | |||||
{ | |||||
if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) | |||||
{ | |||||
return HAL_TIMEOUT; | |||||
} | |||||
} | |||||
/* Set Range */ | |||||
__HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); | |||||
/* Enable the main PLL */ | |||||
__HAL_RCC_PLL_ENABLE(); | |||||
/* Get Start Tick */ | |||||
tickstart = HAL_GetTick(); | |||||
/* Wait till PLL is ready */ | |||||
while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) | |||||
{ | |||||
if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) | |||||
{ | |||||
return HAL_TIMEOUT; | |||||
} | |||||
} | |||||
/* Get Start Tick */ | |||||
tickstart = HAL_GetTick(); | |||||
while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) | |||||
{ | |||||
if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) | |||||
{ | |||||
return HAL_TIMEOUT; | |||||
} | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
return HAL_ERROR; | |||||
} | |||||
return HAL_OK; | |||||
} | |||||
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ | |||||
#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ | |||||
defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ | |||||
defined(STM32F413xx) || defined(STM32F423xx) | |||||
/** | |||||
* @brief Enables Main Regulator low voltage mode. | |||||
* @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ | |||||
* STM32F413xx/STM32F423xx devices. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWREx_EnableMainRegulatorLowVoltage(void) | |||||
{ | |||||
*(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)ENABLE; | |||||
} | |||||
/** | |||||
* @brief Disables Main Regulator low voltage mode. | |||||
* @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ | |||||
* STM32F413xx/STM32F423xxdevices. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWREx_DisableMainRegulatorLowVoltage(void) | |||||
{ | |||||
*(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)DISABLE; | |||||
} | |||||
/** | |||||
* @brief Enables Low Power Regulator low voltage mode. | |||||
* @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ | |||||
* STM32F413xx/STM32F423xx devices. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWREx_EnableLowRegulatorLowVoltage(void) | |||||
{ | |||||
*(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)ENABLE; | |||||
} | |||||
/** | |||||
* @brief Disables Low Power Regulator low voltage mode. | |||||
* @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ | |||||
* STM32F413xx/STM32F423xx devices. | |||||
* @retval None | |||||
*/ | |||||
void HAL_PWREx_DisableLowRegulatorLowVoltage(void) | |||||
{ | |||||
*(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)DISABLE; | |||||
} | |||||
#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F412Zx || STM32F412Rx || STM32F412Vx || STM32F412Cx || | |||||
STM32F413xx || STM32F423xx */ | |||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ | |||||
defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) | |||||
/** | |||||
* @brief Activates the Over-Drive mode. | |||||
* @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. | |||||
* This mode allows the CPU and the core logic to operate at a higher frequency | |||||
* than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). | |||||
* @note It is recommended to enter or exit Over-drive mode when the application is not running | |||||
* critical tasks and when the system clock source is either HSI or HSE. | |||||
* During the Over-drive switch activation, no peripheral clocks should be enabled. | |||||
* The peripheral clocks must be enabled once the Over-drive mode is activated. | |||||
* @retval HAL status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void) | |||||
{ | |||||
uint32_t tickstart = 0U; | |||||
__HAL_RCC_PWR_CLK_ENABLE(); | |||||
/* Enable the Over-drive to extend the clock frequency to 180 Mhz */ | |||||
__HAL_PWR_OVERDRIVE_ENABLE(); | |||||
/* Get tick */ | |||||
tickstart = HAL_GetTick(); | |||||
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) | |||||
{ | |||||
if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) | |||||
{ | |||||
return HAL_TIMEOUT; | |||||
} | |||||
} | |||||
/* Enable the Over-drive switch */ | |||||
__HAL_PWR_OVERDRIVESWITCHING_ENABLE(); | |||||
/* Get tick */ | |||||
tickstart = HAL_GetTick(); | |||||
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) | |||||
{ | |||||
if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) | |||||
{ | |||||
return HAL_TIMEOUT; | |||||
} | |||||
} | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Deactivates the Over-Drive mode. | |||||
* @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. | |||||
* This mode allows the CPU and the core logic to operate at a higher frequency | |||||
* than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). | |||||
* @note It is recommended to enter or exit Over-drive mode when the application is not running | |||||
* critical tasks and when the system clock source is either HSI or HSE. | |||||
* During the Over-drive switch activation, no peripheral clocks should be enabled. | |||||
* The peripheral clocks must be enabled once the Over-drive mode is activated. | |||||
* @retval HAL status | |||||
*/ | |||||
HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void) | |||||
{ | |||||
uint32_t tickstart = 0U; | |||||
__HAL_RCC_PWR_CLK_ENABLE(); | |||||
/* Disable the Over-drive switch */ | |||||
__HAL_PWR_OVERDRIVESWITCHING_DISABLE(); | |||||
/* Get tick */ | |||||
tickstart = HAL_GetTick(); | |||||
while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) | |||||
{ | |||||
if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) | |||||
{ | |||||
return HAL_TIMEOUT; | |||||
} | |||||
} | |||||
/* Disable the Over-drive */ | |||||
__HAL_PWR_OVERDRIVE_DISABLE(); | |||||
/* Get tick */ | |||||
tickstart = HAL_GetTick(); | |||||
while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) | |||||
{ | |||||
if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) | |||||
{ | |||||
return HAL_TIMEOUT; | |||||
} | |||||
} | |||||
return HAL_OK; | |||||
} | |||||
/** | |||||
* @brief Enters in Under-Drive STOP mode. | |||||
* | |||||
* @note This mode is only available for STM32F42xxx/STM32F43xxx/STM32F446xx/STM32F469xx/STM32F479xx devices. | |||||
* | |||||
* @note This mode can be selected only when the Under-Drive is already active | |||||
* | |||||
* @note This mode is enabled only with STOP low power mode. | |||||
* In this mode, the 1.2V domain is preserved in reduced leakage mode. This | |||||
* mode is only available when the main regulator or the low power regulator | |||||
* is in low voltage mode | |||||
* | |||||
* @note If the Under-drive mode was enabled, it is automatically disabled after | |||||
* exiting Stop mode. | |||||
* When the voltage regulator operates in Under-drive mode, an additional | |||||
* startup delay is induced when waking up from Stop mode. | |||||
* | |||||
* @note In Stop mode, all I/O pins keep the same state as in Run mode. | |||||
* | |||||
* @note When exiting Stop mode by issuing an interrupt or a wake-up event, | |||||
* the HSI RC oscillator is selected as system clock. | |||||
* | |||||
* @note When the voltage regulator operates in low power mode, an additional | |||||
* startup delay is incurred when waking up from Stop mode. | |||||
* By keeping the internal regulator ON during Stop mode, the consumption | |||||
* is higher although the startup time is reduced. | |||||
* | |||||
* @param Regulator specifies the regulator state in STOP mode. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_MAINREGULATOR_UNDERDRIVE_ON: Main Regulator in under-drive mode | |||||
* and Flash memory in power-down when the device is in Stop under-drive mode | |||||
* @arg PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON: Low Power Regulator in under-drive mode | |||||
* and Flash memory in power-down when the device is in Stop under-drive mode | |||||
* @param STOPEntry specifies if STOP mode in entered with WFI or WFE instruction. | |||||
* This parameter can be one of the following values: | |||||
* @arg PWR_SLEEPENTRY_WFI: enter STOP mode with WFI instruction | |||||
* @arg PWR_SLEEPENTRY_WFE: enter STOP mode with WFE instruction | |||||
* @retval None | |||||
*/ | |||||
HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry) | |||||
{ | |||||
uint32_t tmpreg1 = 0U; | |||||
/* Check the parameters */ | |||||
assert_param(IS_PWR_REGULATOR_UNDERDRIVE(Regulator)); | |||||
assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); | |||||
/* Enable Power ctrl clock */ | |||||
__HAL_RCC_PWR_CLK_ENABLE(); | |||||
/* Enable the Under-drive Mode ---------------------------------------------*/ | |||||
/* Clear Under-drive flag */ | |||||
__HAL_PWR_CLEAR_ODRUDR_FLAG(); | |||||
/* Enable the Under-drive */ | |||||
__HAL_PWR_UNDERDRIVE_ENABLE(); | |||||
/* Select the regulator state in STOP mode ---------------------------------*/ | |||||
tmpreg1 = PWR->CR; | |||||
/* Clear PDDS, LPDS, MRLUDS and LPLUDS bits */ | |||||
tmpreg1 &= (uint32_t)~(PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_MRUDS); | |||||
/* Set LPDS, MRLUDS and LPLUDS bits according to PWR_Regulator value */ | |||||
tmpreg1 |= Regulator; | |||||
/* Store the new value */ | |||||
PWR->CR = tmpreg1; | |||||
/* Set SLEEPDEEP bit of Cortex System Control Register */ | |||||
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; | |||||
/* Select STOP mode entry --------------------------------------------------*/ | |||||
if(STOPEntry == PWR_SLEEPENTRY_WFI) | |||||
{ | |||||
/* Request Wait For Interrupt */ | |||||
__WFI(); | |||||
} | |||||
else | |||||
{ | |||||
/* Request Wait For Event */ | |||||
__WFE(); | |||||
} | |||||
/* Reset SLEEPDEEP bit of Cortex System Control Register */ | |||||
SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); | |||||
return HAL_OK; | |||||
} | |||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
#endif /* HAL_PWR_MODULE_ENABLED */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<launchConfiguration type="com.st.stm32cube.ide.mcu.debug.launch.launchConfigurationType"> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.access_port_id" value="0"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.enable_live_expr" value="true"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.enable_swv" value="false"/> | |||||
<intAttribute key="com.st.stm32cube.ide.mcu.debug.launch.formatVersion" value="2"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.ip_address_local" value="localhost"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.loadList" value="{"fItems":[{"fIsFromMainTab":true,"fPath":"Debug\\RTC.elf","fProjectName":"RTC","fPerformBuild":true,"fDownload":true,"fLoadSymbols":true}]}"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.override_start_address_mode" value="default"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.remoteCommand" value="target remote"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.startServer" value="true"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.startuptab.exception.divby0" value="true"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.startuptab.exception.unaligned" value="false"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.startuptab.haltonexception" value="true"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.swd_mode" value="true"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.swv_port" value="61235"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.swv_trace_div" value="8"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.swv_trace_hclk" value="16000000"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.useRemoteTarget" value="true"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.vector_table" value=""/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.verify_flash_download" value="true"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.cti_allow_halt" value="false"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.cti_signal_halt" value="false"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_external_loader" value="false"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_logging" value="false"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_max_halt_delay" value="false"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_shared_stlink" value="false"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.external_loader" value=""/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.external_loader_init" value="false"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.frequency" value="0"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.halt_all_on_reset" value="false"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.log_file" value="C:\Users\Gregor\Desktop\Projektarbeit\Workspace\RTC\Debug\st-link_gdbserver_log.txt"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.low_power_debug" value="enable"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.max_halt_delay" value="2"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.reset_strategy" value="connect_under_reset"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.stlink_check_serial_number" value="false"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.stlink_txt_serial_number" value=""/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.watchdog_config" value="none"/> | |||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkrestart_configurations" value="{"fItems":[{"fDisplayName":"Reset","fIsSuppressible":false,"fResetAttribute":"Reset","fResetStrategies":[{"fDisplayName":"Reset","fLaunchAttribute":"monitor reset","fGdbCommands":["monitor reset"],"fCmdOptions":[]},{"fDisplayName":"None","fLaunchAttribute":"no_reset","fGdbCommands":[],"fCmdOptions":[]}],"fGdbCommandGroup":{"name":"Additional commands","commands":[]}}]}"/> | |||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.swv.swv_wait_for_sync" value="true"/> | |||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doHalt" value="false"/> | |||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doReset" value="false"/> | |||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.initCommands" value=""/> | |||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/> | |||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="ST-LINK (ST-LINK GDB server)"/> | |||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/> | |||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="61234"/> | |||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.runCommands" value=""/> | |||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/> | |||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="true"/> | |||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/> | |||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/> | |||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/> | |||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="true"/> | |||||
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/> | |||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/> | |||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/> | |||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="remote"/> | |||||
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/> | |||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/> | |||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug\RTC.elf"/> | |||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="RTC"/> | |||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/> | |||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.384503242"/> | |||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> | |||||
<listEntry value="/RTC"/> | |||||
</listAttribute> | |||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> | |||||
<listEntry value="4"/> | |||||
</listAttribute> | |||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="reserved-for-future-use"/> "/> | |||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/> | |||||
</launchConfiguration> |
#MicroXplorer Configuration settings - do not modify | |||||
File.Version=6 | |||||
KeepUserPlacement=false | |||||
Mcu.Family=STM32F4 | |||||
Mcu.IP0=NVIC | |||||
Mcu.IP1=RCC | |||||
Mcu.IP2=RTC | |||||
Mcu.IP3=SYS | |||||
Mcu.IP4=USART2 | |||||
Mcu.IPNb=5 | |||||
Mcu.Name=STM32F401R(D-E)Tx | |||||
Mcu.Package=LQFP64 | |||||
Mcu.Pin0=PC13-ANTI_TAMP | |||||
Mcu.Pin1=PC14-OSC32_IN | |||||
Mcu.Pin10=PB3 | |||||
Mcu.Pin11=VP_RTC_VS_RTC_Activate | |||||
Mcu.Pin12=VP_RTC_VS_RTC_Calendar | |||||
Mcu.Pin13=VP_RTC_VS_RTC_Alarm_B_Intern | |||||
Mcu.Pin14=VP_RTC_VS_RTC_Alarm_A_Intern | |||||
Mcu.Pin15=VP_SYS_VS_Systick | |||||
Mcu.Pin2=PC15-OSC32_OUT | |||||
Mcu.Pin3=PH0 - OSC_IN | |||||
Mcu.Pin4=PH1 - OSC_OUT | |||||
Mcu.Pin5=PA2 | |||||
Mcu.Pin6=PA3 | |||||
Mcu.Pin7=PA5 | |||||
Mcu.Pin8=PA13 | |||||
Mcu.Pin9=PA14 | |||||
Mcu.PinsNb=16 | |||||
Mcu.ThirdPartyNb=0 | |||||
Mcu.UserConstants= | |||||
Mcu.UserName=STM32F401RETx | |||||
MxCube.Version=6.1.1 | |||||
MxDb.Version=DB.6.0.10 | |||||
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false | |||||
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:true\:false | |||||
NVIC.ForceEnableDMAVector=true | |||||
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false | |||||
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:true\:false | |||||
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:true\:false | |||||
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false | |||||
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_0 | |||||
NVIC.RTC_Alarm_IRQn=true\:0\:0\:false\:false\:true\:true\:true | |||||
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false | |||||
NVIC.SysTick_IRQn=true\:0\:0\:true\:false\:true\:true\:true | |||||
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false | |||||
PA13.GPIOParameters=GPIO_Label | |||||
PA13.GPIO_Label=TMS | |||||
PA13.Locked=true | |||||
PA13.Mode=Serial_Wire | |||||
PA13.Signal=SYS_JTMS-SWDIO | |||||
PA14.GPIOParameters=GPIO_Label | |||||
PA14.GPIO_Label=TCK | |||||
PA14.Locked=true | |||||
PA14.Mode=Serial_Wire | |||||
PA14.Signal=SYS_JTCK-SWCLK | |||||
PA2.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode | |||||
PA2.GPIO_Label=USART_TX | |||||
PA2.GPIO_Mode=GPIO_MODE_AF_PP | |||||
PA2.GPIO_PuPd=GPIO_NOPULL | |||||
PA2.GPIO_Speed=GPIO_SPEED_FREQ_LOW | |||||
PA2.Locked=true | |||||
PA2.Mode=Asynchronous | |||||
PA2.Signal=USART2_TX | |||||
PA3.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode | |||||
PA3.GPIO_Label=USART_RX | |||||
PA3.GPIO_Mode=GPIO_MODE_AF_PP | |||||
PA3.GPIO_PuPd=GPIO_NOPULL | |||||
PA3.GPIO_Speed=GPIO_SPEED_FREQ_LOW | |||||
PA3.Locked=true | |||||
PA3.Mode=Asynchronous | |||||
PA3.Signal=USART2_RX | |||||
PA5.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode | |||||
PA5.GPIO_Label=LD2 [Green Led] | |||||
PA5.GPIO_Mode=GPIO_MODE_OUTPUT_PP | |||||
PA5.GPIO_PuPd=GPIO_NOPULL | |||||
PA5.GPIO_Speed=GPIO_SPEED_FREQ_LOW | |||||
PA5.Locked=true | |||||
PA5.Signal=GPIO_Output | |||||
PB3.GPIOParameters=GPIO_Label | |||||
PB3.GPIO_Label=SWO | |||||
PB3.Locked=true | |||||
PB3.Signal=SYS_JTDO-SWO | |||||
PC13-ANTI_TAMP.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI | |||||
PC13-ANTI_TAMP.GPIO_Label=B1 [Blue PushButton] | |||||
PC13-ANTI_TAMP.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING | |||||
PC13-ANTI_TAMP.GPIO_PuPd=GPIO_NOPULL | |||||
PC13-ANTI_TAMP.Locked=true | |||||
PC13-ANTI_TAMP.Signal=GPXTI13 | |||||
PC14-OSC32_IN.Locked=true | |||||
PC14-OSC32_IN.Mode=LSE-External-Oscillator | |||||
PC14-OSC32_IN.Signal=RCC_OSC32_IN | |||||
PC15-OSC32_OUT.Locked=true | |||||
PC15-OSC32_OUT.Mode=LSE-External-Oscillator | |||||
PC15-OSC32_OUT.Signal=RCC_OSC32_OUT | |||||
PH0\ -\ OSC_IN.Locked=true | |||||
PH0\ -\ OSC_IN.Mode=HSE-External-Clock-Source | |||||
PH0\ -\ OSC_IN.Signal=RCC_OSC_IN | |||||
PH1\ -\ OSC_OUT.Locked=true | |||||
PH1\ -\ OSC_OUT.Mode=HSE-External-Clock-Source | |||||
PH1\ -\ OSC_OUT.Signal=RCC_OSC_OUT | |||||
PinOutPanel.RotationAngle=0 | |||||
ProjectManager.AskForMigrate=true | |||||
ProjectManager.BackupPrevious=false | |||||
ProjectManager.CompilerOptimize=6 | |||||
ProjectManager.ComputerToolchain=false | |||||
ProjectManager.CoupleFile=false | |||||
ProjectManager.CustomerFirmwarePackage= | |||||
ProjectManager.DefaultFWLocation=true | |||||
ProjectManager.DeletePrevious=true | |||||
ProjectManager.DeviceId=STM32F401RETx | |||||
ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.25.2 | |||||
ProjectManager.FreePins=false | |||||
ProjectManager.HalAssertFull=false | |||||
ProjectManager.HeapSize=0x200 | |||||
ProjectManager.KeepUserCode=true | |||||
ProjectManager.LastFirmware=true | |||||
ProjectManager.LibraryCopy=1 | |||||
ProjectManager.MainLocation=Core/Src | |||||
ProjectManager.NoMain=false | |||||
ProjectManager.PreviousToolchain= | |||||
ProjectManager.ProjectBuild=false | |||||
ProjectManager.ProjectFileName=RTC.ioc | |||||
ProjectManager.ProjectName=RTC | |||||
ProjectManager.RegisterCallBack= | |||||
ProjectManager.StackSize=0x400 | |||||
ProjectManager.TargetToolchain=STM32CubeIDE | |||||
ProjectManager.ToolChainLocation= | |||||
ProjectManager.UnderRoot=true | |||||
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_RTC_Init-RTC-false-HAL-true | |||||
RCC.48MHZClocksFreq_Value=48000000 | |||||
RCC.AHBFreq_Value=84000000 | |||||
RCC.APB1CLKDivider=RCC_HCLK_DIV2 | |||||
RCC.APB1Freq_Value=42000000 | |||||
RCC.APB1TimFreq_Value=84000000 | |||||
RCC.APB2Freq_Value=84000000 | |||||
RCC.APB2TimFreq_Value=84000000 | |||||
RCC.CortexFreq_Value=84000000 | |||||
RCC.FCLKCortexFreq_Value=84000000 | |||||
RCC.HCLKFreq_Value=84000000 | |||||
RCC.HSE_VALUE=8000000 | |||||
RCC.HSI_VALUE=16000000 | |||||
RCC.I2SClocksFreq_Value=96000000 | |||||
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLN,PLLP,PLLQ,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S | |||||
RCC.LSI_VALUE=32000 | |||||
RCC.MCO2PinFreq_Value=84000000 | |||||
RCC.PLLCLKFreq_Value=84000000 | |||||
RCC.PLLN=336 | |||||
RCC.PLLP=RCC_PLLP_DIV4 | |||||
RCC.PLLQ=7 | |||||
RCC.PLLQCLKFreq_Value=48000000 | |||||
RCC.RTCFreq_Value=32000 | |||||
RCC.RTCHSEDivFreq_Value=4000000 | |||||
RCC.SYSCLKFreq_VALUE=84000000 | |||||
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK | |||||
RCC.VCOI2SOutputFreq_Value=192000000 | |||||
RCC.VCOInputFreq_Value=1000000 | |||||
RCC.VCOOutputFreq_Value=336000000 | |||||
RCC.VcooutputI2S=96000000 | |||||
RTC.Alarm=RTC_ALARM_A | |||||
RTC.Alarm_B=RTC_ALARM_B | |||||
RTC.Date=8 | |||||
RTC.Format=RTC_FORMAT_BIN | |||||
RTC.IPParameters=Format,Date,Year,Alarm,Alarm_B | |||||
RTC.Year=21 | |||||
SH.GPXTI13.0=GPIO_EXTI13 | |||||
SH.GPXTI13.ConfNb=1 | |||||
USART2.IPParameters=VirtualMode | |||||
USART2.VirtualMode=VM_ASYNC | |||||
VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled | |||||
VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate | |||||
VP_RTC_VS_RTC_Alarm_A_Intern.Mode=Alarm A | |||||
VP_RTC_VS_RTC_Alarm_A_Intern.Signal=RTC_VS_RTC_Alarm_A_Intern | |||||
VP_RTC_VS_RTC_Alarm_B_Intern.Mode=Alarm B | |||||
VP_RTC_VS_RTC_Alarm_B_Intern.Signal=RTC_VS_RTC_Alarm_B_Intern | |||||
VP_RTC_VS_RTC_Calendar.Mode=RTC_Calendar | |||||
VP_RTC_VS_RTC_Calendar.Signal=RTC_VS_RTC_Calendar | |||||
VP_SYS_VS_Systick.Mode=SysTick | |||||
VP_SYS_VS_Systick.Signal=SYS_VS_Systick | |||||
board=NUCLEO-F401RE | |||||
boardIOC=true | |||||
isbadioc=false |
/** | |||||
****************************************************************************** | |||||
* @file LinkerScript.ld | |||||
* @author Auto-generated by STM32CubeIDE | |||||
* Abstract : Linker script for NUCLEO-F401RE Board embedding STM32F401RETx Device from stm32f4 series | |||||
* 512Kbytes FLASH | |||||
* 96Kbytes RAM | |||||
* | |||||
* Set heap size, stack size and stack location according | |||||
* to application requirements. | |||||
* | |||||
* Set memory bank area and size if external memory is used | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Entry Point */ | |||||
ENTRY(Reset_Handler) | |||||
/* Highest address of the user mode stack */ | |||||
_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */ | |||||
_Min_Heap_Size = 0x200 ; /* required amount of heap */ | |||||
_Min_Stack_Size = 0x400 ; /* required amount of stack */ | |||||
/* Memories definition */ | |||||
MEMORY | |||||
{ | |||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K | |||||
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K | |||||
} | |||||
/* Sections */ | |||||
SECTIONS | |||||
{ | |||||
/* The startup code into "FLASH" Rom type memory */ | |||||
.isr_vector : | |||||
{ | |||||
. = ALIGN(4); | |||||
KEEP(*(.isr_vector)) /* Startup code */ | |||||
. = ALIGN(4); | |||||
} >FLASH | |||||
/* The program code and other data into "FLASH" Rom type memory */ | |||||
.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 into "FLASH" Rom type memory */ | |||||
.rodata : | |||||
{ | |||||
. = ALIGN(4); | |||||
*(.rodata) /* .rodata sections (constants, strings, etc.) */ | |||||
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */ | |||||
. = ALIGN(4); | |||||
} >FLASH | |||||
.ARM.extab : { | |||||
. = ALIGN(4); | |||||
*(.ARM.extab* .gnu.linkonce.armextab.*) | |||||
. = ALIGN(4); | |||||
} >FLASH | |||||
.ARM : { | |||||
. = ALIGN(4); | |||||
__exidx_start = .; | |||||
*(.ARM.exidx*) | |||||
__exidx_end = .; | |||||
. = ALIGN(4); | |||||
} >FLASH | |||||
.preinit_array : | |||||
{ | |||||
. = ALIGN(4); | |||||
PROVIDE_HIDDEN (__preinit_array_start = .); | |||||
KEEP (*(.preinit_array*)) | |||||
PROVIDE_HIDDEN (__preinit_array_end = .); | |||||
. = ALIGN(4); | |||||
} >FLASH | |||||
.init_array : | |||||
{ | |||||
. = ALIGN(4); | |||||
PROVIDE_HIDDEN (__init_array_start = .); | |||||
KEEP (*(SORT(.init_array.*))) | |||||
KEEP (*(.init_array*)) | |||||
PROVIDE_HIDDEN (__init_array_end = .); | |||||
. = ALIGN(4); | |||||
} >FLASH | |||||
.fini_array : | |||||
{ | |||||
. = ALIGN(4); | |||||
PROVIDE_HIDDEN (__fini_array_start = .); | |||||
KEEP (*(SORT(.fini_array.*))) | |||||
KEEP (*(.fini_array*)) | |||||
PROVIDE_HIDDEN (__fini_array_end = .); | |||||
. = ALIGN(4); | |||||
} >FLASH | |||||
/* Used by the startup to initialize data */ | |||||
_sidata = LOADADDR(.data); | |||||
/* Initialized data sections into "RAM" Ram type memory */ | |||||
.data : | |||||
{ | |||||
. = ALIGN(4); | |||||
_sdata = .; /* create a global symbol at data start */ | |||||
*(.data) /* .data sections */ | |||||
*(.data*) /* .data* sections */ | |||||
*(.RamFunc) /* .RamFunc sections */ | |||||
*(.RamFunc*) /* .RamFunc* sections */ | |||||
. = ALIGN(4); | |||||
_edata = .; /* define a global symbol at data end */ | |||||
} >RAM AT> FLASH | |||||
/* Uninitialized data section into "RAM" Ram type memory */ | |||||
. = ALIGN(4); | |||||
.bss : | |||||
{ | |||||
/* This is used by the startup in order to initialize the .bss section */ | |||||
_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" Ram type memory left */ | |||||
._user_heap_stack : | |||||
{ | |||||
. = ALIGN(8); | |||||
PROVIDE ( end = . ); | |||||
PROVIDE ( _end = . ); | |||||
. = . + _Min_Heap_Size; | |||||
. = . + _Min_Stack_Size; | |||||
. = ALIGN(8); | |||||
} >RAM | |||||
/* Remove information from the compiler libraries */ | |||||
/DISCARD/ : | |||||
{ | |||||
libc.a ( * ) | |||||
libm.a ( * ) | |||||
libgcc.a ( * ) | |||||
} | |||||
.ARM.attributes 0 : { *(.ARM.attributes) } | |||||
} |
/** | |||||
****************************************************************************** | |||||
* @file LinkerScript.ld | |||||
* @author Auto-generated by STM32CubeIDE | |||||
* Abstract : Linker script for NUCLEO-F401RE Board embedding STM32F401RETx Device from stm32f4 series | |||||
* 512Kbytes FLASH | |||||
* 96Kbytes RAM | |||||
* | |||||
* Set heap size, stack size and stack location according | |||||
* to application requirements. | |||||
* | |||||
* Set memory bank area and size if external memory is used | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Entry Point */ | |||||
ENTRY(Reset_Handler) | |||||
/* Highest address of the user mode stack */ | |||||
_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */ | |||||
_Min_Heap_Size = 0x200; /* required amount of heap */ | |||||
_Min_Stack_Size = 0x400; /* required amount of stack */ | |||||
/* Memories definition */ | |||||
MEMORY | |||||
{ | |||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K | |||||
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K | |||||
} | |||||
/* Sections */ | |||||
SECTIONS | |||||
{ | |||||
/* The startup code into "RAM" Ram type memory */ | |||||
.isr_vector : | |||||
{ | |||||
. = ALIGN(4); | |||||
KEEP(*(.isr_vector)) /* Startup code */ | |||||
. = ALIGN(4); | |||||
} >RAM | |||||
/* The program code and other data into "RAM" Ram type memory */ | |||||
.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) | |||||
*(.RamFunc) /* .RamFunc sections */ | |||||
*(.RamFunc*) /* .RamFunc* sections */ | |||||
KEEP (*(.init)) | |||||
KEEP (*(.fini)) | |||||
. = ALIGN(4); | |||||
_etext = .; /* define a global symbols at end of code */ | |||||
} >RAM | |||||
/* Constant data into "RAM" Ram type memory */ | |||||
.rodata : | |||||
{ | |||||
. = ALIGN(4); | |||||
*(.rodata) /* .rodata sections (constants, strings, etc.) */ | |||||
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */ | |||||
. = ALIGN(4); | |||||
} >RAM | |||||
.ARM.extab : { | |||||
. = ALIGN(4); | |||||
*(.ARM.extab* .gnu.linkonce.armextab.*) | |||||
. = ALIGN(4); | |||||
} >RAM | |||||
.ARM : { | |||||
. = ALIGN(4); | |||||
__exidx_start = .; | |||||
*(.ARM.exidx*) | |||||
__exidx_end = .; | |||||
. = ALIGN(4); | |||||
} >RAM | |||||
.preinit_array : | |||||
{ | |||||
. = ALIGN(4); | |||||
PROVIDE_HIDDEN (__preinit_array_start = .); | |||||
KEEP (*(.preinit_array*)) | |||||
PROVIDE_HIDDEN (__preinit_array_end = .); | |||||
. = ALIGN(4); | |||||
} >RAM | |||||
.init_array : | |||||
{ | |||||
. = ALIGN(4); | |||||
PROVIDE_HIDDEN (__init_array_start = .); | |||||
KEEP (*(SORT(.init_array.*))) | |||||
KEEP (*(.init_array*)) | |||||
PROVIDE_HIDDEN (__init_array_end = .); | |||||
. = ALIGN(4); | |||||
} >RAM | |||||
.fini_array : | |||||
{ | |||||
. = ALIGN(4); | |||||
PROVIDE_HIDDEN (__fini_array_start = .); | |||||
KEEP (*(SORT(.fini_array.*))) | |||||
KEEP (*(.fini_array*)) | |||||
PROVIDE_HIDDEN (__fini_array_end = .); | |||||
. = ALIGN(4); | |||||
} >RAM | |||||
/* Used by the startup to initialize data */ | |||||
_sidata = LOADADDR(.data); | |||||
/* Initialized data sections into "RAM" Ram type memory */ | |||||
.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 | |||||
/* Uninitialized data section into "RAM" Ram type memory */ | |||||
. = ALIGN(4); | |||||
.bss : | |||||
{ | |||||
/* This is used by the startup in order to initialize the .bss section */ | |||||
_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" Ram type memory left */ | |||||
._user_heap_stack : | |||||
{ | |||||
. = ALIGN(8); | |||||
PROVIDE ( end = . ); | |||||
PROVIDE ( _end = . ); | |||||
. = . + _Min_Heap_Size; | |||||
. = . + _Min_Stack_Size; | |||||
. = ALIGN(8); | |||||
} >RAM | |||||
/* Remove information from the compiler libraries */ | |||||
/DISCARD/ : | |||||
{ | |||||
libc.a ( * ) | |||||
libm.a ( * ) | |||||
libgcc.a ( * ) | |||||
} | |||||
.ARM.attributes 0 : { *(.ARM.attributes) } | |||||
} |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> | |||||
<storageModule moduleId="org.eclipse.cdt.core.settings"> | |||||
<cconfiguration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1525788676"> | |||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1525788676" moduleId="org.eclipse.cdt.core.settings" name="Debug"> | |||||
<externalSettings/> | |||||
<extensions> | |||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> | |||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
</extensions> | |||||
</storageModule> | |||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | |||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1525788676" name="Debug" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug"> | |||||
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1525788676." name="/" resourcePath=""> | |||||
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.1551769294" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug"> | |||||
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.1493732574" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.375866785" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.754912280" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32L152RETx" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.960611407" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.2027540432" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.513669273" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="NUCLEO-L152RE" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.927363816" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || NUCLEO-L152RE || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../FATFS/App | ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/STM32L1xx_HAL_Driver/Inc | ../Drivers/CMSIS/Device/ST/STM32L1xx/Include | ../FATFS/Target | ../Drivers/STM32L1xx_HAL_Driver/Inc/Legacy | ../Middlewares/Third_Party/FatFs/src || || || USE_HAL_DRIVER | STM32L152xE || || Drivers | Core/Startup | Middlewares | Core | FATFS || || || ${workspace_loc:/${ProjName}/STM32L152RETX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || " valueType="string"/> | |||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.2096327037" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/> | |||||
<builder buildPath="${workspace_loc:/SD_CARD_SPI}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.537825062" managedBuildOn="true" name="Gnu Make Builder.Debug" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1244820924" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.939371130" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g3" valueType="enumerated"/> | |||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.229094717" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.130874149" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.1548777908" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g3" valueType="enumerated"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.1444599455" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false"/> | |||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1170342795" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols"> | |||||
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/> | |||||
<listOptionValue builtIn="false" value="STM32L152xE"/> | |||||
<listOptionValue builtIn="false" value="DEBUG"/> | |||||
</option> | |||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.30112203" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath"> | |||||
<listOptionValue builtIn="false" value="../Core/Inc"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/STM32L1xx_HAL_Driver/Inc"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/STM32L1xx_HAL_Driver/Inc/Legacy"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32L1xx/Include"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/> | |||||
<listOptionValue builtIn="false" value="../FATFS/Target"/> | |||||
<listOptionValue builtIn="false" value="../FATFS/App"/> | |||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FatFs/src"/> | |||||
</option> | |||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.755814635" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.115989204" name="MCU G++ Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.158101643" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g3" valueType="enumerated"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.458766092" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.2063691822" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1520511198" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32L152RETX_FLASH.ld}" valueType="string"/> | |||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.955779534" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input"> | |||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> | |||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/> | |||||
</inputType> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.988489156" name="MCU G++ Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.option.script.233444589" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.option.script" value="${workspace_loc:/${ProjName}/STM32L152RETX_FLASH.ld}" valueType="string"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver.486840211" name="MCU GCC Archiver" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size.1760253496" name="MCU Size" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile.1077655248" name="MCU Output Converter list file" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex.2065827002" name="MCU Output Converter Hex" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary.252255165" name="MCU Output Converter Binary" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog.35452818" name="MCU Output Converter Verilog" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec.1098640443" name="MCU Output Converter Motorola S-rec" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.1996400550" name="MCU Output Converter Motorola S-rec with symbols" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec"/> | |||||
</toolChain> | |||||
</folderInfo> | |||||
<sourceEntries> | |||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/> | |||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FATFS"/> | |||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Middlewares"/> | |||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/> | |||||
</sourceEntries> | |||||
</configuration> | |||||
</storageModule> | |||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | |||||
</cconfiguration> | |||||
<cconfiguration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.282706448"> | |||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.282706448" moduleId="org.eclipse.cdt.core.settings" name="Release"> | |||||
<externalSettings/> | |||||
<extensions> | |||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> | |||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> | |||||
</extensions> | |||||
</storageModule> | |||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | |||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.282706448" name="Release" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release"> | |||||
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.282706448." name="/" resourcePath=""> | |||||
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.824124864" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release"> | |||||
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.349938742" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.39397055" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.88208180" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32L152RETx" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.1755005553" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.1827314363" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.722161120" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="NUCLEO-L152RE" valueType="string"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.2138819059" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.3 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32 || NUCLEO-L152RE || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../FATFS/App | ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/STM32L1xx_HAL_Driver/Inc | ../Drivers/CMSIS/Device/ST/STM32L1xx/Include | ../FATFS/Target | ../Drivers/STM32L1xx_HAL_Driver/Inc/Legacy | ../Middlewares/Third_Party/FatFs/src || || || USE_HAL_DRIVER | STM32L152xE || || Drivers | Core/Startup | Middlewares | Core | FATFS || || || ${workspace_loc:/${ProjName}/STM32L152RETX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || " valueType="string"/> | |||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1734695326" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/> | |||||
<builder buildPath="${workspace_loc:/SD_CARD_SPI}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1338385203" managedBuildOn="true" name="Gnu Make Builder.Release" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.307579861" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.1437214073" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g0" valueType="enumerated"/> | |||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.1935986825" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1954831714" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.1061213914" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g0" valueType="enumerated"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.1309133803" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.os" valueType="enumerated"/> | |||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1501537723" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols"> | |||||
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/> | |||||
<listOptionValue builtIn="false" value="STM32L152xE"/> | |||||
</option> | |||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.951607296" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath"> | |||||
<listOptionValue builtIn="false" value="../Core/Inc"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/STM32L1xx_HAL_Driver/Inc"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/STM32L1xx_HAL_Driver/Inc/Legacy"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32L1xx/Include"/> | |||||
<listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/> | |||||
<listOptionValue builtIn="false" value="../FATFS/Target"/> | |||||
<listOptionValue builtIn="false" value="../FATFS/App"/> | |||||
<listOptionValue builtIn="false" value="../Middlewares/Third_Party/FatFs/src"/> | |||||
</option> | |||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1350440196" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.2082821038" name="MCU G++ Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.255135411" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g0" valueType="enumerated"/> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.1706670929" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.value.os" valueType="enumerated"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.1651020074" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1915501645" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32L152RETX_FLASH.ld}" valueType="string"/> | |||||
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.2507138" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input"> | |||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> | |||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/> | |||||
</inputType> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.1112382829" name="MCU G++ Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker"> | |||||
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.option.script.190034998" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.option.script" value="${workspace_loc:/${ProjName}/STM32L152RETX_FLASH.ld}" valueType="string"/> | |||||
</tool> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver.740131251" name="MCU GCC Archiver" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size.1702201952" name="MCU Size" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile.1417447697" name="MCU Output Converter list file" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex.1395186969" name="MCU Output Converter Hex" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary.16509113" name="MCU Output Converter Binary" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog.1865989470" name="MCU Output Converter Verilog" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec.300107190" name="MCU Output Converter Motorola S-rec" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec"/> | |||||
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.1710994937" name="MCU Output Converter Motorola S-rec with symbols" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec"/> | |||||
</toolChain> | |||||
</folderInfo> | |||||
<sourceEntries> | |||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/> | |||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FATFS"/> | |||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Middlewares"/> | |||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/> | |||||
</sourceEntries> | |||||
</configuration> | |||||
</storageModule> | |||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> | |||||
</cconfiguration> | |||||
</storageModule> | |||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> | |||||
<project id="SD_CARD_SPI.null.1606681496" name="SD_CARD_SPI"/> | |||||
</storageModule> | |||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> | |||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> | |||||
<storageModule moduleId="scannerConfiguration"> | |||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> | |||||
<scannerConfigBuildInfo instanceId="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1525788676;com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1525788676.;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.130874149;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.755814635"> | |||||
<autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/> | |||||
</scannerConfigBuildInfo> | |||||
<scannerConfigBuildInfo instanceId="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.282706448;com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.282706448.;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1954831714;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1350440196"> | |||||
<autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/> | |||||
</scannerConfigBuildInfo> | |||||
</storageModule> | |||||
<storageModule moduleId="refreshScope"/> | |||||
</cproject> |
[PreviousLibFiles] | |||||
LibFiles=Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_adc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_adc_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal.h;Drivers/STM32L1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_def.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ramfunc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_dma_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_dma.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_cortex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_exti.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_spi.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_tim.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_tim_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_uart.h;Middlewares/Third_Party/FatFs/src/diskio.h;Middlewares/Third_Party/FatFs/src/ff.h;Middlewares/Third_Party/FatFs/src/ff_gen_drv.h;Middlewares/Third_Party/FatFs/src/integer.h;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_adc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_adc_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_rcc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_rcc_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash_ramfunc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_gpio.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_dma.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pwr.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pwr_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_cortex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_exti.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_spi.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_tim.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_tim_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_uart.c;Middlewares/Third_Party/FatFs/src/diskio.c;Middlewares/Third_Party/FatFs/src/ff.c;Middlewares/Third_Party/FatFs/src/ff_gen_drv.c;Middlewares/Third_Party/FatFs/src/option/syscall.c;Middlewares/Third_Party/FatFs/src/option/ccsbcs.c;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_adc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_adc_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal.h;Drivers/STM32L1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_def.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ramfunc.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_dma_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_dma.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_cortex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_exti.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_spi.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_tim.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_tim_ex.h;Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_uart.h;Middlewares/Third_Party/FatFs/src/diskio.h;Middlewares/Third_Party/FatFs/src/ff.h;Middlewares/Third_Party/FatFs/src/ff_gen_drv.h;Middlewares/Third_Party/FatFs/src/integer.h;Drivers/CMSIS/Device/ST/STM32L1xx/Include/stm32l152xe.h;Drivers/CMSIS/Device/ST/STM32L1xx/Include/stm32l1xx.h;Drivers/CMSIS/Device/ST/STM32L1xx/Include/system_stm32l1xx.h;Drivers/CMSIS/Device/ST/STM32L1xx/Source/Templates/system_stm32l1xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/tz_context.h; | |||||
[PreviousUsedCubeIDEFiles] | |||||
SourceFiles=Core\Src\main.c;FATFS\Target\user_diskio.c;FATFS\App\fatfs.c;Core\Src\stm32l1xx_it.c;Core\Src\stm32l1xx_hal_msp.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_adc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_adc_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_rcc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_rcc_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash_ramfunc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_gpio.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_dma.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pwr.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pwr_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_cortex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_exti.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_spi.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_tim.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_tim_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_uart.c;Middlewares/Third_Party/FatFs/src/diskio.c;Middlewares/Third_Party/FatFs/src/ff.c;Middlewares/Third_Party/FatFs/src/ff_gen_drv.c;Middlewares/Third_Party/FatFs/src/option/syscall.c;Middlewares/Third_Party/FatFs/src/option/ccsbcs.c;Core\Src/system_stm32l1xx.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_adc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_adc_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_rcc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_rcc_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_flash_ramfunc.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_gpio.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_dma.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pwr.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_pwr_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_cortex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_exti.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_spi.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_tim.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_tim_ex.c;Drivers/STM32L1xx_HAL_Driver/Src/stm32l1xx_hal_uart.c;Middlewares/Third_Party/FatFs/src/diskio.c;Middlewares/Third_Party/FatFs/src/ff.c;Middlewares/Third_Party/FatFs/src/ff_gen_drv.c;Middlewares/Third_Party/FatFs/src/option/syscall.c;Middlewares/Third_Party/FatFs/src/option/ccsbcs.c;Core\Src/system_stm32l1xx.c;Drivers/CMSIS/Device/ST/STM32L1xx/Source/Templates/system_stm32l1xx.c;;Middlewares/Third_Party/FatFs/src/diskio.c;Middlewares/Third_Party/FatFs/src/ff.c;Middlewares/Third_Party/FatFs/src/ff_gen_drv.c;Middlewares/Third_Party/FatFs/src/option/syscall.c;Middlewares/Third_Party/FatFs/src/option/ccsbcs.c; | |||||
HeaderPath=Drivers\STM32L1xx_HAL_Driver\Inc;Drivers\STM32L1xx_HAL_Driver\Inc\Legacy;Middlewares\Third_Party\FatFs\src;Drivers\CMSIS\Device\ST\STM32L1xx\Include;Drivers\CMSIS\Include;FATFS\Target;FATFS\App;Core\Inc; | |||||
CDefines=USE_HAL_DRIVER;STM32L152xE;USE_HAL_DRIVER;USE_HAL_DRIVER; | |||||
[PreviousGenFiles] | |||||
AdvancedFolderStructure=true | |||||
HeaderFileListSize=6 | |||||
HeaderFiles#0=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/FATFS/Target/ffconf.h | |||||
HeaderFiles#1=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/FATFS/Target/user_diskio.h | |||||
HeaderFiles#2=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/FATFS/App/fatfs.h | |||||
HeaderFiles#3=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/Core/Inc/stm32l1xx_it.h | |||||
HeaderFiles#4=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/Core/Inc/stm32l1xx_hal_conf.h | |||||
HeaderFiles#5=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/Core/Inc/main.h | |||||
HeaderFolderListSize=3 | |||||
HeaderPath#0=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/FATFS/Target | |||||
HeaderPath#1=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/FATFS/App | |||||
HeaderPath#2=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/Core/Inc | |||||
HeaderFiles=; | |||||
SourceFileListSize=5 | |||||
SourceFiles#0=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/FATFS/Target/user_diskio.c | |||||
SourceFiles#1=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/FATFS/App/fatfs.c | |||||
SourceFiles#2=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/Core/Src/stm32l1xx_it.c | |||||
SourceFiles#3=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/Core/Src/stm32l1xx_hal_msp.c | |||||
SourceFiles#4=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/Core/Src/main.c | |||||
SourceFolderListSize=3 | |||||
SourcePath#0=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/FATFS/Target | |||||
SourcePath#1=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/FATFS/App | |||||
SourcePath#2=C:/Users/Gregor/Desktop/Projektarbeit/Workspace/SD_CARD_SPI/Core/Src | |||||
SourceFiles=; | |||||
<?xml version="1.0" encoding="UTF-8"?> | |||||
<projectDescription> | |||||
<name>SD_CARD_SPI</name> | |||||
<comment></comment> | |||||
<projects> | |||||
</projects> | |||||
<buildSpec> | |||||
<buildCommand> | |||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> | |||||
<triggers>clean,full,incremental,</triggers> | |||||
<arguments> | |||||
</arguments> | |||||
</buildCommand> | |||||
<buildCommand> | |||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> | |||||
<triggers>full,incremental,</triggers> | |||||
<arguments> | |||||
</arguments> | |||||
</buildCommand> | |||||
</buildSpec> | |||||
<natures> | |||||
<nature>com.st.stm32cube.ide.mcu.MCUProjectNature</nature> | |||||
<nature>com.st.stm32cube.ide.mcu.MCUCubeProjectNature</nature> | |||||
<nature>org.eclipse.cdt.core.cnature</nature> | |||||
<nature>com.st.stm32cube.ide.mcu.MCUCubeIdeServicesRevAev2ProjectNature</nature> | |||||
<nature>com.st.stm32cube.ide.mcu.MCUAdvancedStructureProjectNature</nature> | |||||
<nature>com.st.stm32cube.ide.mcu.MCUEndUserDisabledTrustZoneProjectNature</nature> | |||||
<nature>com.st.stm32cube.ide.mcu.MCUSingleCpuProjectNature</nature> | |||||
<nature>com.st.stm32cube.ide.mcu.MCURootProjectNature</nature> | |||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> | |||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> | |||||
</natures> | |||||
</projectDescription> |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||||
<project> | |||||
<configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1525788676" name="Debug"> | |||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> | |||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> | |||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> | |||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> | |||||
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/> | |||||
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1269982718955581026" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> | |||||
<language-scope id="org.eclipse.cdt.core.gcc"/> | |||||
<language-scope id="org.eclipse.cdt.core.g++"/> | |||||
</provider> | |||||
</extension> | |||||
</configuration> | |||||
<configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.282706448" name="Release"> | |||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> | |||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> | |||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> | |||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> | |||||
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/> | |||||
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1269982718955581026" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true"> | |||||
<language-scope id="org.eclipse.cdt.core.gcc"/> | |||||
<language-scope id="org.eclipse.cdt.core.g++"/> | |||||
</provider> | |||||
</extension> | |||||
</configuration> | |||||
</project> |
#ifndef __FATFS_SD_H | |||||
#define __FATFS_SD_H | |||||
/* Definitions for MMC/SDC command */ | |||||
#define CMD0 (0x40+0) /* GO_IDLE_STATE */ | |||||
#define CMD1 (0x40+1) /* SEND_OP_COND */ | |||||
#define CMD8 (0x40+8) /* SEND_IF_COND */ | |||||
#define CMD9 (0x40+9) /* SEND_CSD */ | |||||
#define CMD10 (0x40+10) /* SEND_CID */ | |||||
#define CMD12 (0x40+12) /* STOP_TRANSMISSION */ | |||||
#define CMD16 (0x40+16) /* SET_BLOCKLEN */ | |||||
#define CMD17 (0x40+17) /* READ_SINGLE_BLOCK */ | |||||
#define CMD18 (0x40+18) /* READ_MULTIPLE_BLOCK */ | |||||
#define CMD23 (0x40+23) /* SET_BLOCK_COUNT */ | |||||
#define CMD24 (0x40+24) /* WRITE_BLOCK */ | |||||
#define CMD25 (0x40+25) /* WRITE_MULTIPLE_BLOCK */ | |||||
#define CMD41 (0x40+41) /* SEND_OP_COND (ACMD) */ | |||||
#define CMD55 (0x40+55) /* APP_CMD */ | |||||
#define CMD58 (0x40+58) /* READ_OCR */ | |||||
/* MMC card type flags (MMC_GET_TYPE) */ | |||||
#define CT_MMC 0x01 /* MMC ver 3 */ | |||||
#define CT_SD1 0x02 /* SD ver 1 */ | |||||
#define CT_SD2 0x04 /* SD ver 2 */ | |||||
#define CT_SDC 0x06 /* SD */ | |||||
#define CT_BLOCK 0x08 /* Block addressing */ | |||||
/* Functions */ | |||||
DSTATUS SD_disk_initialize (BYTE pdrv); | |||||
DSTATUS SD_disk_status (BYTE pdrv); | |||||
DRESULT SD_disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); | |||||
DRESULT SD_disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); | |||||
DRESULT SD_disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); | |||||
#define SPI_TIMEOUT 100 | |||||
extern SPI_HandleTypeDef hspi1; | |||||
#define HSPI_SDCARD &hspi1 | |||||
#define SD_CS_PORT GPIOB | |||||
#define SD_CS_PIN GPIO_PIN_6 | |||||
#endif |
/* USER CODE BEGIN Header */ | |||||
/** | |||||
****************************************************************************** | |||||
* @file : main.h | |||||
* @brief : Header for main.c file. | |||||
* This file contains the common defines of the application. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 */ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __MAIN_H | |||||
#define __MAIN_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
#include "stm32l1xx_hal.h" | |||||
/* 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 -----------------------------------------------------------*/ | |||||
#define B1_Pin GPIO_PIN_13 | |||||
#define B1_GPIO_Port GPIOC | |||||
#define USART_TX_Pin GPIO_PIN_2 | |||||
#define USART_TX_GPIO_Port GPIOA | |||||
#define USART_RX_Pin GPIO_PIN_3 | |||||
#define USART_RX_GPIO_Port GPIOA | |||||
#define TMS_Pin GPIO_PIN_13 | |||||
#define TMS_GPIO_Port GPIOA | |||||
#define TCK_Pin GPIO_PIN_14 | |||||
#define TCK_GPIO_Port GPIOA | |||||
#define SWO_Pin GPIO_PIN_3 | |||||
#define SWO_GPIO_Port GPIOB | |||||
/* USER CODE BEGIN Private defines */ | |||||
/* USER CODE END Private defines */ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __MAIN_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file stm32l1xx_hal_conf.h | |||||
* @brief HAL configuration file. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© COPYRIGHT(c) 2021 STMicroelectronics</center></h2> | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without modification, | |||||
* are permitted provided that the following conditions are met: | |||||
* 1. Redistributions of source code must retain the above copyright notice, | |||||
* this list of conditions and the following disclaimer. | |||||
* 2. 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. | |||||
* 3. Neither the name of STMicroelectronics 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 THE COPYRIGHT HOLDER OR 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. | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32L1xx_HAL_CONF_H | |||||
#define __STM32L1xx_HAL_CONF_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* Exported types ------------------------------------------------------------*/ | |||||
/* Exported constants --------------------------------------------------------*/ | |||||
/* ########################## Module Selection ############################## */ | |||||
/** | |||||
* @brief This is the list of modules to be used in the HAL driver | |||||
*/ | |||||
#define HAL_MODULE_ENABLED | |||||
#define HAL_ADC_MODULE_ENABLED | |||||
/*#define HAL_CRYP_MODULE_ENABLED */ | |||||
/*#define HAL_COMP_MODULE_ENABLED */ | |||||
/*#define HAL_CRC_MODULE_ENABLED */ | |||||
/*#define HAL_CRYP_MODULE_ENABLED */ | |||||
/*#define HAL_DAC_MODULE_ENABLED */ | |||||
/*#define HAL_I2C_MODULE_ENABLED */ | |||||
/*#define HAL_I2S_MODULE_ENABLED */ | |||||
/*#define HAL_IRDA_MODULE_ENABLED */ | |||||
/*#define HAL_IWDG_MODULE_ENABLED */ | |||||
/*#define HAL_LCD_MODULE_ENABLED */ | |||||
/*#define HAL_NOR_MODULE_ENABLED */ | |||||
/*#define HAL_OPAMP_MODULE_ENABLED */ | |||||
/*#define HAL_PCD_MODULE_ENABLED */ | |||||
/*#define HAL_RTC_MODULE_ENABLED */ | |||||
/*#define HAL_SD_MODULE_ENABLED */ | |||||
/*#define HAL_SMARTCARD_MODULE_ENABLED */ | |||||
#define HAL_SPI_MODULE_ENABLED | |||||
/*#define HAL_SRAM_MODULE_ENABLED */ | |||||
/*#define HAL_TIM_MODULE_ENABLED */ | |||||
#define HAL_UART_MODULE_ENABLED | |||||
/*#define HAL_USART_MODULE_ENABLED */ | |||||
/*#define HAL_WWDG_MODULE_ENABLED */ | |||||
#define HAL_GPIO_MODULE_ENABLED | |||||
#define HAL_EXTI_MODULE_ENABLED | |||||
#define HAL_DMA_MODULE_ENABLED | |||||
#define HAL_RCC_MODULE_ENABLED | |||||
#define HAL_FLASH_MODULE_ENABLED | |||||
#define HAL_PWR_MODULE_ENABLED | |||||
#define HAL_CORTEX_MODULE_ENABLED | |||||
/* ########################## Oscillator Values adaptation ####################*/ | |||||
/** | |||||
* @brief Adjust the value of External High Speed oscillator (HSE) used in your application. | |||||
* This value is used by the RCC HAL module to compute the system frequency | |||||
* (when HSE is used as system clock source, directly or through the PLL). | |||||
*/ | |||||
#if !defined (HSE_VALUE) | |||||
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ | |||||
#endif /* HSE_VALUE */ | |||||
#if !defined (HSE_STARTUP_TIMEOUT) | |||||
#define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */ | |||||
#endif /* HSE_STARTUP_TIMEOUT */ | |||||
/** | |||||
* @brief Internal Multiple Speed oscillator (MSI) default value. | |||||
* This value is the default MSI range value after Reset. | |||||
*/ | |||||
#if !defined (MSI_VALUE) | |||||
#define MSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ | |||||
#endif /* MSI_VALUE */ | |||||
/** | |||||
* @brief Internal High Speed oscillator (HSI) value. | |||||
* This value is used by the RCC HAL module to compute the system frequency | |||||
* (when HSI is used as system clock source, directly or through the PLL). | |||||
*/ | |||||
#if !defined (HSI_VALUE) | |||||
#define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ | |||||
#endif /* HSI_VALUE */ | |||||
/** | |||||
* @brief Internal Low Speed oscillator (LSI) value. | |||||
*/ | |||||
#if !defined (LSI_VALUE) | |||||
#define LSI_VALUE (37000U) /*!< LSI Typical Value in Hz*/ | |||||
#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz | |||||
The real value may vary depending on the variations | |||||
in voltage and temperature.*/ | |||||
/** | |||||
* @brief External Low Speed oscillator (LSE) value. | |||||
* This value is used by the UART, RTC HAL module to compute the system frequency | |||||
*/ | |||||
#if !defined (LSE_VALUE) | |||||
#define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/ | |||||
#endif /* LSE_VALUE */ | |||||
#if !defined (LSE_STARTUP_TIMEOUT) | |||||
#define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ | |||||
#endif /* HSE_STARTUP_TIMEOUT */ | |||||
/* Tip: To avoid modifying this file each time you need to use different HSE, | |||||
=== you can define the HSE value in your toolchain compiler preprocessor. */ | |||||
/* ########################### System Configuration ######################### */ | |||||
/** | |||||
* @brief This is the HAL system configuration section | |||||
*/ | |||||
#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ | |||||
#define TICK_INT_PRIORITY ((uint32_t)0) /*!< tick interrupt priority */ | |||||
#define USE_RTOS 0 | |||||
#define PREFETCH_ENABLE 0 | |||||
#define INSTRUCTION_CACHE_ENABLE 1 | |||||
#define DATA_CACHE_ENABLE 1 | |||||
/* ########################## Assert Selection ############################## */ | |||||
/** | |||||
* @brief Uncomment the line below to expanse the "assert_param" macro in the | |||||
* HAL drivers code | |||||
*/ | |||||
/* #define USE_FULL_ASSERT 1U */ | |||||
/* ################## Register callback feature configuration ############### */ | |||||
/** | |||||
* @brief Set below the peripheral configuration to "1U" to add the support | |||||
* of HAL callback registration/deregistration feature for the HAL | |||||
* driver(s). This allows user application to provide specific callback | |||||
* functions thanks to HAL_PPP_RegisterCallback() rather than overwriting | |||||
* the default weak callback functions (see each stm32l0xx_hal_ppp.h file | |||||
* for possible callback identifiers defined in HAL_PPP_CallbackIDTypeDef | |||||
* for each PPP peripheral). | |||||
*/ | |||||
#define USE_HAL_ADC_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_COMP_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_DAC_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_I2C_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_I2S_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_PCD_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_RTC_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_SDMMC_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_SPI_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_TIM_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_UART_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_USART_REGISTER_CALLBACKS 0U | |||||
#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U | |||||
/* ################## SPI peripheral configuration ########################## */ | |||||
/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver | |||||
* Activated: CRC code is present inside driver | |||||
* Deactivated: CRC code cleaned from driver | |||||
*/ | |||||
#define USE_SPI_CRC 0U | |||||
/* Includes ------------------------------------------------------------------*/ | |||||
/** | |||||
* @brief Include module's header file | |||||
*/ | |||||
#ifdef HAL_RCC_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_rcc.h" | |||||
#endif /* HAL_RCC_MODULE_ENABLED */ | |||||
#ifdef HAL_GPIO_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_gpio.h" | |||||
#endif /* HAL_GPIO_MODULE_ENABLED */ | |||||
#ifdef HAL_DMA_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_dma.h" | |||||
#endif /* HAL_DMA_MODULE_ENABLED */ | |||||
#ifdef HAL_CORTEX_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_cortex.h" | |||||
#endif /* HAL_CORTEX_MODULE_ENABLED */ | |||||
#ifdef HAL_ADC_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_adc.h" | |||||
#endif /* HAL_ADC_MODULE_ENABLED */ | |||||
#ifdef HAL_COMP_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_comp.h" | |||||
#endif /* HAL_COMP_MODULE_ENABLED */ | |||||
#ifdef HAL_CRC_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_crc.h" | |||||
#endif /* HAL_CRC_MODULE_ENABLED */ | |||||
#ifdef HAL_CRYP_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_cryp.h" | |||||
#endif /* HAL_CRYP_MODULE_ENABLED */ | |||||
#ifdef HAL_DAC_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_dac.h" | |||||
#endif /* HAL_DAC_MODULE_ENABLED */ | |||||
#ifdef HAL_FLASH_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_flash.h" | |||||
#endif /* HAL_FLASH_MODULE_ENABLED */ | |||||
#ifdef HAL_SRAM_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_sram.h" | |||||
#endif /* HAL_SRAM_MODULE_ENABLED */ | |||||
#ifdef HAL_NOR_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_nor.h" | |||||
#endif /* HAL_NOR_MODULE_ENABLED */ | |||||
#ifdef HAL_I2C_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_i2c.h" | |||||
#endif /* HAL_I2C_MODULE_ENABLED */ | |||||
#ifdef HAL_I2S_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_i2s.h" | |||||
#endif /* HAL_I2S_MODULE_ENABLED */ | |||||
#ifdef HAL_IWDG_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_iwdg.h" | |||||
#endif /* HAL_IWDG_MODULE_ENABLED */ | |||||
#ifdef HAL_LCD_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_lcd.h" | |||||
#endif /* HAL_LCD_MODULE_ENABLED */ | |||||
#ifdef HAL_OPAMP_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_opamp.h" | |||||
#endif /* HAL_OPAMP_MODULE_ENABLED */ | |||||
#ifdef HAL_PWR_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_pwr.h" | |||||
#endif /* HAL_PWR_MODULE_ENABLED */ | |||||
#ifdef HAL_RTC_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_rtc.h" | |||||
#endif /* HAL_RTC_MODULE_ENABLED */ | |||||
#ifdef HAL_SD_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_sd.h" | |||||
#endif /* HAL_SD_MODULE_ENABLED */ | |||||
#ifdef HAL_SPI_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_spi.h" | |||||
#endif /* HAL_SPI_MODULE_ENABLED */ | |||||
#ifdef HAL_TIM_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_tim.h" | |||||
#endif /* HAL_TIM_MODULE_ENABLED */ | |||||
#ifdef HAL_UART_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_uart.h" | |||||
#endif /* HAL_UART_MODULE_ENABLED */ | |||||
#ifdef HAL_USART_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_usart.h" | |||||
#endif /* HAL_USART_MODULE_ENABLED */ | |||||
#ifdef HAL_IRDA_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_irda.h" | |||||
#endif /* HAL_IRDA_MODULE_ENABLED */ | |||||
#ifdef HAL_SMARTCARD_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_smartcard.h" | |||||
#endif /* HAL_SMARTCARD_MODULE_ENABLED */ | |||||
#ifdef HAL_WWDG_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_wwdg.h" | |||||
#endif /* HAL_WWDG_MODULE_ENABLED */ | |||||
#ifdef HAL_PCD_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_pcd.h" | |||||
#endif /* HAL_PCD_MODULE_ENABLED */ | |||||
#ifdef HAL_EXTI_MODULE_ENABLED | |||||
#include "stm32l1xx_hal_exti.h" | |||||
#endif /* HAL_EXTI_MODULE_ENABLED */ | |||||
/* Exported macro ------------------------------------------------------------*/ | |||||
#ifdef USE_FULL_ASSERT | |||||
/** | |||||
* @brief The assert_param macro is used for function's parameters check. | |||||
* @param expr: If expr is false, it calls assert_failed function | |||||
* which reports the name of the source file and the source | |||||
* line number of the call that failed. | |||||
* If expr is true, it returns no value. | |||||
* @retval None | |||||
*/ | |||||
#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) | |||||
/* Exported functions ------------------------------------------------------- */ | |||||
void assert_failed(uint8_t* file, uint32_t line); | |||||
#else | |||||
#define assert_param(expr) ((void)0U) | |||||
#endif /* USE_FULL_ASSERT */ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32L1xx_HAL_CONF_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/* USER CODE BEGIN Header */ | |||||
/** | |||||
****************************************************************************** | |||||
* @file stm32l1xx_it.h | |||||
* @brief This file contains the headers of the interrupt handlers. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 */ | |||||
/* Define to prevent recursive inclusion -------------------------------------*/ | |||||
#ifndef __STM32L1xx_IT_H | |||||
#define __STM32L1xx_IT_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/* 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 NMI_Handler(void); | |||||
void HardFault_Handler(void); | |||||
void MemManage_Handler(void); | |||||
void BusFault_Handler(void); | |||||
void UsageFault_Handler(void); | |||||
void SVC_Handler(void); | |||||
void DebugMon_Handler(void); | |||||
void PendSV_Handler(void); | |||||
void SysTick_Handler(void); | |||||
/* USER CODE BEGIN EFP */ | |||||
/* USER CODE END EFP */ | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __STM32L1xx_IT_H */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
#define TRUE 1 | |||||
#define FALSE 0 | |||||
#define bool BYTE | |||||
#include "stm32l1xx_hal.h" | |||||
#include "diskio.h" | |||||
#include "fatfs_sd.h" | |||||
uint16_t Timer1, Timer2; /* 1ms Timer Counter */ | |||||
static volatile DSTATUS Stat = STA_NOINIT; /* Disk Status */ | |||||
static uint8_t CardType; /* Type 0:MMC, 1:SDC, 2:Block addressing */ | |||||
static uint8_t PowerFlag = 0; /* Power flag */ | |||||
/*************************************** | |||||
* SPI functions | |||||
**************************************/ | |||||
/* slave select */ | |||||
static void SELECT(void) | |||||
{ | |||||
HAL_GPIO_WritePin(SD_CS_PORT, SD_CS_PIN, GPIO_PIN_RESET); | |||||
HAL_Delay(1); | |||||
} | |||||
/* slave deselect */ | |||||
static void DESELECT(void) | |||||
{ | |||||
HAL_GPIO_WritePin(SD_CS_PORT, SD_CS_PIN, GPIO_PIN_SET); | |||||
HAL_Delay(1); | |||||
} | |||||
/* SPI transmit a byte */ | |||||
static void SPI_TxByte(uint8_t data) | |||||
{ | |||||
while(!__HAL_SPI_GET_FLAG(HSPI_SDCARD, SPI_FLAG_TXE)); | |||||
HAL_SPI_Transmit(HSPI_SDCARD, &data, 1, SPI_TIMEOUT); | |||||
} | |||||
/* SPI transmit buffer */ | |||||
static void SPI_TxBuffer(uint8_t *buffer, uint16_t len) | |||||
{ | |||||
while(!__HAL_SPI_GET_FLAG(HSPI_SDCARD, SPI_FLAG_TXE)); | |||||
HAL_SPI_Transmit(HSPI_SDCARD, buffer, len, SPI_TIMEOUT); | |||||
} | |||||
/* SPI receive a byte */ | |||||
static uint8_t SPI_RxByte(void) | |||||
{ | |||||
uint8_t dummy, data; | |||||
dummy = 0xFF; | |||||
while(!__HAL_SPI_GET_FLAG(HSPI_SDCARD, SPI_FLAG_TXE)); | |||||
HAL_SPI_TransmitReceive(HSPI_SDCARD, &dummy, &data, 1, SPI_TIMEOUT); | |||||
return data; | |||||
} | |||||
/* SPI receive a byte via pointer */ | |||||
static void SPI_RxBytePtr(uint8_t *buff) | |||||
{ | |||||
*buff = SPI_RxByte(); | |||||
} | |||||
/*************************************** | |||||
* SD functions | |||||
**************************************/ | |||||
/* wait SD ready */ | |||||
static uint8_t SD_ReadyWait(void) | |||||
{ | |||||
uint8_t res; | |||||
/* timeout 500ms */ | |||||
Timer2 = 500; | |||||
/* if SD goes ready, receives 0xFF */ | |||||
do { | |||||
res = SPI_RxByte(); | |||||
} while ((res != 0xFF) && Timer2); | |||||
return res; | |||||
} | |||||
/* power on */ | |||||
static void SD_PowerOn(void) | |||||
{ | |||||
uint8_t args[6]; | |||||
uint32_t cnt = 0x1FFF; | |||||
/* transmit bytes to wake up */ | |||||
DESELECT(); | |||||
for(int i = 0; i < 10; i++) | |||||
{ | |||||
SPI_TxByte(0xFF); | |||||
} | |||||
/* slave select */ | |||||
SELECT(); | |||||
/* make idle state */ | |||||
args[0] = CMD0; /* CMD0:GO_IDLE_STATE */ | |||||
args[1] = 0; | |||||
args[2] = 0; | |||||
args[3] = 0; | |||||
args[4] = 0; | |||||
args[5] = 0x95; /* CRC */ | |||||
SPI_TxBuffer(args, sizeof(args)); | |||||
/* wait response */ | |||||
while ((SPI_RxByte() != 0x01) && cnt) | |||||
{ | |||||
cnt--; | |||||
} | |||||
DESELECT(); | |||||
SPI_TxByte(0XFF); | |||||
PowerFlag = 1; | |||||
} | |||||
/* power off */ | |||||
static void SD_PowerOff(void) | |||||
{ | |||||
PowerFlag = 0; | |||||
} | |||||
/* check power flag */ | |||||
static uint8_t SD_CheckPower(void) | |||||
{ | |||||
return PowerFlag; | |||||
} | |||||
/* receive data block */ | |||||
static bool SD_RxDataBlock(BYTE *buff, UINT len) | |||||
{ | |||||
uint8_t token; | |||||
/* timeout 200ms */ | |||||
Timer1 = 200; | |||||
/* loop until receive a response or timeout */ | |||||
do { | |||||
token = SPI_RxByte(); | |||||
} while((token == 0xFF) && Timer1); | |||||
/* invalid response */ | |||||
if(token != 0xFE) return FALSE; | |||||
/* receive data */ | |||||
do { | |||||
SPI_RxBytePtr(buff++); | |||||
} while(len--); | |||||
/* discard CRC */ | |||||
SPI_RxByte(); | |||||
SPI_RxByte(); | |||||
return TRUE; | |||||
} | |||||
/* transmit data block */ | |||||
#if _USE_WRITE == 1 | |||||
static bool SD_TxDataBlock(const uint8_t *buff, BYTE token) | |||||
{ | |||||
uint8_t resp; | |||||
uint8_t i = 0; | |||||
/* wait SD ready */ | |||||
if (SD_ReadyWait() != 0xFF) return FALSE; | |||||
/* transmit token */ | |||||
SPI_TxByte(token); | |||||
/* if it's not STOP token, transmit data */ | |||||
if (token != 0xFD) | |||||
{ | |||||
SPI_TxBuffer((uint8_t*)buff, 512); | |||||
/* discard CRC */ | |||||
SPI_RxByte(); | |||||
SPI_RxByte(); | |||||
/* receive response */ | |||||
while (i <= 64) | |||||
{ | |||||
resp = SPI_RxByte(); | |||||
/* transmit 0x05 accepted */ | |||||
if ((resp & 0x1F) == 0x05) break; | |||||
i++; | |||||
} | |||||
/* recv buffer clear */ | |||||
while (SPI_RxByte() == 0); | |||||
} | |||||
/* transmit 0x05 accepted */ | |||||
if ((resp & 0x1F) == 0x05) return TRUE; | |||||
return FALSE; | |||||
} | |||||
#endif /* _USE_WRITE */ | |||||
/* transmit command */ | |||||
static BYTE SD_SendCmd(BYTE cmd, uint32_t arg) | |||||
{ | |||||
uint8_t crc, res; | |||||
/* wait SD ready */ | |||||
if (SD_ReadyWait() != 0xFF) return 0xFF; | |||||
/* transmit command */ | |||||
SPI_TxByte(cmd); /* Command */ | |||||
SPI_TxByte((uint8_t)(arg >> 24)); /* Argument[31..24] */ | |||||
SPI_TxByte((uint8_t)(arg >> 16)); /* Argument[23..16] */ | |||||
SPI_TxByte((uint8_t)(arg >> 8)); /* Argument[15..8] */ | |||||
SPI_TxByte((uint8_t)arg); /* Argument[7..0] */ | |||||
/* prepare CRC */ | |||||
if(cmd == CMD0) crc = 0x95; /* CRC for CMD0(0) */ | |||||
else if(cmd == CMD8) crc = 0x87; /* CRC for CMD8(0x1AA) */ | |||||
else crc = 1; | |||||
/* transmit CRC */ | |||||
SPI_TxByte(crc); | |||||
/* Skip a stuff byte when STOP_TRANSMISSION */ | |||||
if (cmd == CMD12) SPI_RxByte(); | |||||
/* receive response */ | |||||
uint8_t n = 10; | |||||
do { | |||||
res = SPI_RxByte(); | |||||
} while ((res & 0x80) && --n); | |||||
return res; | |||||
} | |||||
/*************************************** | |||||
* user_diskio.c functions | |||||
**************************************/ | |||||
/* initialize SD */ | |||||
DSTATUS SD_disk_initialize(BYTE drv) | |||||
{ | |||||
uint8_t n, type, ocr[4]; | |||||
/* single drive, drv should be 0 */ | |||||
if(drv) return STA_NOINIT; | |||||
/* no disk */ | |||||
if(Stat & STA_NODISK) return Stat; | |||||
/* power on */ | |||||
SD_PowerOn(); | |||||
/* slave select */ | |||||
SELECT(); | |||||
/* check disk type */ | |||||
type = 0; | |||||
/* send GO_IDLE_STATE command */ | |||||
if (SD_SendCmd(CMD0, 0) == 1) | |||||
{ | |||||
/* timeout 1 sec */ | |||||
Timer1 = 1000; | |||||
/* SDC V2+ accept CMD8 command, http://elm-chan.org/docs/mmc/mmc_e.html */ | |||||
if (SD_SendCmd(CMD8, 0x1AA) == 1) | |||||
{ | |||||
/* operation condition register */ | |||||
for (n = 0; n < 4; n++) | |||||
{ | |||||
ocr[n] = SPI_RxByte(); | |||||
} | |||||
/* voltage range 2.7-3.6V */ | |||||
if (ocr[2] == 0x01 && ocr[3] == 0xAA) | |||||
{ | |||||
/* ACMD41 with HCS bit */ | |||||
do { | |||||
if (SD_SendCmd(CMD55, 0) <= 1 && SD_SendCmd(CMD41, 1UL << 30) == 0) break; | |||||
} while (Timer1); | |||||
/* READ_OCR */ | |||||
if (Timer1 && SD_SendCmd(CMD58, 0) == 0) | |||||
{ | |||||
/* Check CCS bit */ | |||||
for (n = 0; n < 4; n++) | |||||
{ | |||||
ocr[n] = SPI_RxByte(); | |||||
} | |||||
/* SDv2 (HC or SC) */ | |||||
type = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2; | |||||
} | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
/* SDC V1 or MMC */ | |||||
type = (SD_SendCmd(CMD55, 0) <= 1 && SD_SendCmd(CMD41, 0) <= 1) ? CT_SD1 : CT_MMC; | |||||
do | |||||
{ | |||||
if (type == CT_SD1) | |||||
{ | |||||
if (SD_SendCmd(CMD55, 0) <= 1 && SD_SendCmd(CMD41, 0) == 0) break; /* ACMD41 */ | |||||
} | |||||
else | |||||
{ | |||||
if (SD_SendCmd(CMD1, 0) == 0) break; /* CMD1 */ | |||||
} | |||||
} while (Timer1); | |||||
/* SET_BLOCKLEN */ | |||||
if (!Timer1 || SD_SendCmd(CMD16, 512) != 0) type = 0; | |||||
} | |||||
} | |||||
CardType = type; | |||||
/* Idle */ | |||||
DESELECT(); | |||||
SPI_RxByte(); | |||||
/* Clear STA_NOINIT */ | |||||
if (type) | |||||
{ | |||||
Stat &= ~STA_NOINIT; | |||||
} | |||||
else | |||||
{ | |||||
/* Initialization failed */ | |||||
SD_PowerOff(); | |||||
} | |||||
return Stat; | |||||
} | |||||
/* return disk status */ | |||||
DSTATUS SD_disk_status(BYTE drv) | |||||
{ | |||||
if (drv) return STA_NOINIT; | |||||
return Stat; | |||||
} | |||||
/* read sector */ | |||||
DRESULT SD_disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count) | |||||
{ | |||||
/* pdrv should be 0 */ | |||||
if (pdrv || !count) return RES_PARERR; | |||||
/* no disk */ | |||||
if (Stat & STA_NOINIT) return RES_NOTRDY; | |||||
/* convert to byte address */ | |||||
if (!(CardType & CT_SD2)) sector *= 512; | |||||
SELECT(); | |||||
if (count == 1) | |||||
{ | |||||
/* READ_SINGLE_BLOCK */ | |||||
if ((SD_SendCmd(CMD17, sector) == 0) && SD_RxDataBlock(buff, 512)) count = 0; | |||||
} | |||||
else | |||||
{ | |||||
/* READ_MULTIPLE_BLOCK */ | |||||
if (SD_SendCmd(CMD18, sector) == 0) | |||||
{ | |||||
do { | |||||
if (!SD_RxDataBlock(buff, 512)) break; | |||||
buff += 512; | |||||
} while (--count); | |||||
/* STOP_TRANSMISSION */ | |||||
SD_SendCmd(CMD12, 0); | |||||
} | |||||
} | |||||
/* Idle */ | |||||
DESELECT(); | |||||
SPI_RxByte(); | |||||
return count ? RES_ERROR : RES_OK; | |||||
} | |||||
/* write sector */ | |||||
#if _USE_WRITE == 1 | |||||
DRESULT SD_disk_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count) | |||||
{ | |||||
/* pdrv should be 0 */ | |||||
if (pdrv || !count) return RES_PARERR; | |||||
/* no disk */ | |||||
if (Stat & STA_NOINIT) return RES_NOTRDY; | |||||
/* write protection */ | |||||
if (Stat & STA_PROTECT) return RES_WRPRT; | |||||
/* convert to byte address */ | |||||
if (!(CardType & CT_SD2)) sector *= 512; | |||||
SELECT(); | |||||
if (count == 1) | |||||
{ | |||||
/* WRITE_BLOCK */ | |||||
if ((SD_SendCmd(CMD24, sector) == 0) && SD_TxDataBlock(buff, 0xFE)) | |||||
count = 0; | |||||
} | |||||
else | |||||
{ | |||||
/* WRITE_MULTIPLE_BLOCK */ | |||||
if (CardType & CT_SD1) | |||||
{ | |||||
SD_SendCmd(CMD55, 0); | |||||
SD_SendCmd(CMD23, count); /* ACMD23 */ | |||||
} | |||||
if (SD_SendCmd(CMD25, sector) == 0) | |||||
{ | |||||
do { | |||||
if(!SD_TxDataBlock(buff, 0xFC)) break; | |||||
buff += 512; | |||||
} while (--count); | |||||
/* STOP_TRAN token */ | |||||
if(!SD_TxDataBlock(0, 0xFD)) | |||||
{ | |||||
count = 1; | |||||
} | |||||
} | |||||
} | |||||
/* Idle */ | |||||
DESELECT(); | |||||
SPI_RxByte(); | |||||
return count ? RES_ERROR : RES_OK; | |||||
} | |||||
#endif /* _USE_WRITE */ | |||||
/* ioctl */ | |||||
DRESULT SD_disk_ioctl(BYTE drv, BYTE ctrl, void *buff) | |||||
{ | |||||
DRESULT res; | |||||
uint8_t n, csd[16], *ptr = buff; | |||||
WORD csize; | |||||
/* pdrv should be 0 */ | |||||
if (drv) return RES_PARERR; | |||||
res = RES_ERROR; | |||||
if (ctrl == CTRL_POWER) | |||||
{ | |||||
switch (*ptr) | |||||
{ | |||||
case 0: | |||||
SD_PowerOff(); /* Power Off */ | |||||
res = RES_OK; | |||||
break; | |||||
case 1: | |||||
SD_PowerOn(); /* Power On */ | |||||
res = RES_OK; | |||||
break; | |||||
case 2: | |||||
*(ptr + 1) = SD_CheckPower(); | |||||
res = RES_OK; /* Power Check */ | |||||
break; | |||||
default: | |||||
res = RES_PARERR; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
/* no disk */ | |||||
if (Stat & STA_NOINIT) return RES_NOTRDY; | |||||
SELECT(); | |||||
switch (ctrl) | |||||
{ | |||||
case GET_SECTOR_COUNT: | |||||
/* SEND_CSD */ | |||||
if ((SD_SendCmd(CMD9, 0) == 0) && SD_RxDataBlock(csd, 16)) | |||||
{ | |||||
if ((csd[0] >> 6) == 1) | |||||
{ | |||||
/* SDC V2 */ | |||||
csize = csd[9] + ((WORD) csd[8] << 8) + 1; | |||||
*(DWORD*) buff = (DWORD) csize << 10; | |||||
} | |||||
else | |||||
{ | |||||
/* MMC or SDC V1 */ | |||||
n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2; | |||||
csize = (csd[8] >> 6) + ((WORD) csd[7] << 2) + ((WORD) (csd[6] & 3) << 10) + 1; | |||||
*(DWORD*) buff = (DWORD) csize << (n - 9); | |||||
} | |||||
res = RES_OK; | |||||
} | |||||
break; | |||||
case GET_SECTOR_SIZE: | |||||
*(WORD*) buff = 512; | |||||
res = RES_OK; | |||||
break; | |||||
case CTRL_SYNC: | |||||
if (SD_ReadyWait() == 0xFF) res = RES_OK; | |||||
break; | |||||
case MMC_GET_CSD: | |||||
/* SEND_CSD */ | |||||
if (SD_SendCmd(CMD9, 0) == 0 && SD_RxDataBlock(ptr, 16)) res = RES_OK; | |||||
break; | |||||
case MMC_GET_CID: | |||||
/* SEND_CID */ | |||||
if (SD_SendCmd(CMD10, 0) == 0 && SD_RxDataBlock(ptr, 16)) res = RES_OK; | |||||
break; | |||||
case MMC_GET_OCR: | |||||
/* READ_OCR */ | |||||
if (SD_SendCmd(CMD58, 0) == 0) | |||||
{ | |||||
for (n = 0; n < 4; n++) | |||||
{ | |||||
*ptr++ = SPI_RxByte(); | |||||
} | |||||
res = RES_OK; | |||||
} | |||||
default: | |||||
res = RES_PARERR; | |||||
} | |||||
DESELECT(); | |||||
SPI_RxByte(); | |||||
} | |||||
return res; | |||||
} |
/* USER CODE BEGIN Header */ | |||||
/** | |||||
****************************************************************************** | |||||
* @file : main.c | |||||
* @brief : Main program body | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 "main.h" | |||||
#include "fatfs.h" | |||||
/* Private includes ----------------------------------------------------------*/ | |||||
/* USER CODE BEGIN Includes */ | |||||
#include "fatfs_sd.h" | |||||
#include "string.h" | |||||
#include "stdio.h" | |||||
/* USER CODE END Includes */ | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PTD */ | |||||
/* USER CODE END PTD */ | |||||
/* Private define ------------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PD */ | |||||
FATFS fs; | |||||
FATFS *pfs; | |||||
FIL fil; | |||||
FRESULT fres; | |||||
DWORD fre_clust; | |||||
uint32_t totalSpace, freeSpace; | |||||
char buffer[100]; | |||||
uint16_t AD_RES; | |||||
int num; | |||||
//Variable name for txt.file | |||||
char txtVar[19]; | |||||
/* USER CODE END PD */ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PM */ | |||||
/* USER CODE END PM */ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
ADC_HandleTypeDef hadc; | |||||
SPI_HandleTypeDef hspi1; | |||||
UART_HandleTypeDef huart2; | |||||
/* USER CODE BEGIN PV */ | |||||
/* USER CODE END PV */ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
void SystemClock_Config(void); | |||||
static void MX_GPIO_Init(void); | |||||
static void MX_USART2_UART_Init(void); | |||||
static void MX_SPI1_Init(void); | |||||
static void MX_ADC_Init(void); | |||||
/* USER CODE BEGIN PFP */ | |||||
/* USER CODE END PFP */ | |||||
/* Private user code ---------------------------------------------------------*/ | |||||
/* USER CODE BEGIN 0 */ | |||||
// sending to UART | |||||
void transmit_uart(char *string){ | |||||
uint8_t len = strlen(string); | |||||
HAL_UART_Transmit(&huart2, (uint8_t*) string, len, 200); | |||||
} | |||||
/*void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) | |||||
{ | |||||
// Read & Update The ADC Result | |||||
AD_RES = HAL_ADC_GetValue(hadc); | |||||
}*/ | |||||
/* USER CODE END 0 */ | |||||
/** | |||||
* @brief The application entry point. | |||||
* @retval int | |||||
*/ | |||||
int main(void) | |||||
{ | |||||
/* USER CODE BEGIN 1 */ | |||||
/* USER CODE END 1 */ | |||||
/* MCU Configuration--------------------------------------------------------*/ | |||||
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ | |||||
HAL_Init(); | |||||
/* USER CODE BEGIN Init */ | |||||
/* USER CODE END Init */ | |||||
/* Configure the system clock */ | |||||
SystemClock_Config(); | |||||
/* USER CODE BEGIN SysInit */ | |||||
/* USER CODE END SysInit */ | |||||
/* Initialize all configured peripherals */ | |||||
MX_GPIO_Init(); | |||||
MX_USART2_UART_Init(); | |||||
MX_SPI1_Init(); | |||||
MX_FATFS_Init(); | |||||
MX_ADC_Init(); | |||||
/* USER CODE BEGIN 2 */ | |||||
fres = f_mount(&fs, "", 0); | |||||
if (fres == FR_OK) { | |||||
transmit_uart("SD card is mounted successfully!\r\n"); | |||||
} else if (fres != FR_OK) { | |||||
transmit_uart("SD card is not mounted!\r\n"); | |||||
} | |||||
/*// FA_OPEN_APPEND opens file if it exists and if not then creates it, | |||||
// the pointer is set at the end of the file for appending | |||||
fres = f_open(&fil, "log-file_test.txt", FA_OPEN_APPEND | FA_WRITE | FA_READ); | |||||
if (fres == FR_OK) { | |||||
transmit_uart("File opened.\r\n"); | |||||
} else if (fres != FR_OK) { | |||||
transmit_uart("File was not opened!\r\n"); | |||||
}*/ | |||||
/*fres = f_getfree("", &fre_clust, &pfs); | |||||
totalSpace = (uint32_t) ((pfs->n_fatent - 2) * pfs->csize * 0.5); | |||||
freeSpace = (uint32_t) (fre_clust * pfs->csize * 0.5); | |||||
char mSz[12]; | |||||
sprintf(mSz, "%lu", freeSpace); | |||||
if (fres == FR_OK) { | |||||
transmit_uart("Free space: \r"); | |||||
transmit_uart(mSz); | |||||
transmit_uart("\r\n"); | |||||
} else if (fres != FR_OK) { | |||||
transmit_uart("Free space could not be determined!\r\n"); | |||||
} | |||||
*/ | |||||
/* Open file to read */ | |||||
/*fres = f_open(&fil, "log-file.txt", FA_READ); | |||||
if (fres == FR_OK) { | |||||
transmit_uart("File opened.\r\n"); | |||||
} else if (fres != FR_OK) { | |||||
transmit_uart("File was not opened!\r\n"); | |||||
} | |||||
while (f_gets(buffer, sizeof(buffer), &fil)) { | |||||
char mRd[100]; | |||||
sprintf(mRd, "%s", buffer); | |||||
transmit_uart(mRd); | |||||
}*/ | |||||
/* Close file */ | |||||
/*fres = f_close(&fil); | |||||
if (fres == FR_OK) { | |||||
transmit_uart("File is closed.\r\n"); | |||||
} else if (fres != FR_OK) { | |||||
transmit_uart("File was not closed.\r\n"); | |||||
} | |||||
f_mount(NULL, "", 1); | |||||
if (fres == FR_OK) { | |||||
transmit_uart("SD card is unmounted!\r\n"); | |||||
} else if (fres != FR_OK) { | |||||
transmit_uart("SD card was not unmounted!\r\n"); | |||||
}*/ | |||||
//create textfile Name (day.month.year_Values.txt) and saves to txtVar | |||||
int day = 12; | |||||
int month = 2; | |||||
int year = 21; | |||||
char str_month[3]; | |||||
char str_year[3]; | |||||
//int to char array | |||||
sprintf(txtVar, "%ld", day); | |||||
sprintf(str_month, "%ld", month); | |||||
sprintf(str_year, "%ld", year); | |||||
//Concatenate strings | |||||
strcat(txtVar, "."); | |||||
strcat(str_month, "."); | |||||
strcat(str_year, "_"); | |||||
strcat(txtVar, str_month); | |||||
strcat(txtVar, str_year); | |||||
strcat(txtVar, "Values.txt"); | |||||
/* USER CODE END 2 */ | |||||
/* Infinite loop */ | |||||
/* USER CODE BEGIN WHILE */ | |||||
while (1) | |||||
{ | |||||
/* USER CODE END WHILE */ | |||||
HAL_Delay(5000); | |||||
// Start ADC Conversion | |||||
HAL_ADC_Start(&hadc); | |||||
// Poll ADC1 Perihperal & TimeOut = 1mSec | |||||
HAL_ADC_PollForConversion(&hadc, 1); | |||||
// Read The ADC Conversion Result | |||||
AD_RES = HAL_ADC_GetValue(&hadc); | |||||
num++; | |||||
// FA_OPEN_APPEND opens file (txtVar) if it exists and if not then creates it, | |||||
// the pointer is set at the end of the file for appending | |||||
fres = f_open(&fil, txtVar, FA_OPEN_APPEND | FA_WRITE | FA_READ); | |||||
if (fres == FR_OK) { | |||||
transmit_uart("File opened.\r\n"); | |||||
} else if (fres != FR_OK) { | |||||
transmit_uart("File was not opened!\r\n"); | |||||
} | |||||
f_puts("ADC_value_", &fil); | |||||
f_printf(&fil, "%d", num); | |||||
f_puts(" = ", &fil); | |||||
f_printf(&fil, "%d\n", AD_RES); | |||||
/* Close file */ | |||||
fres = f_close(&fil); | |||||
if (fres == FR_OK) { | |||||
transmit_uart("File is closed.\r\n"); | |||||
} else if (fres != FR_OK) { | |||||
transmit_uart("File was not closed.\r\n"); | |||||
} | |||||
/* USER CODE BEGIN 3 */ | |||||
} | |||||
/* USER CODE END 3 */ | |||||
} | |||||
/** | |||||
* @brief System Clock Configuration | |||||
* @retval None | |||||
*/ | |||||
void SystemClock_Config(void) | |||||
{ | |||||
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; | |||||
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; | |||||
/** Configure the main internal regulator output voltage | |||||
*/ | |||||
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); | |||||
/** Initializes the RCC Oscillators according to the specified parameters | |||||
* in the RCC_OscInitTypeDef structure. | |||||
*/ | |||||
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; | |||||
RCC_OscInitStruct.HSIState = RCC_HSI_ON; | |||||
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; | |||||
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; | |||||
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; | |||||
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6; | |||||
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV3; | |||||
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
/** Initializes the CPU, AHB and APB buses clocks | |||||
*/ | |||||
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK | |||||
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; | |||||
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; | |||||
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; | |||||
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; | |||||
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; | |||||
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
} | |||||
/** | |||||
* @brief ADC Initialization Function | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
static void MX_ADC_Init(void) | |||||
{ | |||||
/* USER CODE BEGIN ADC_Init 0 */ | |||||
/* USER CODE END ADC_Init 0 */ | |||||
ADC_ChannelConfTypeDef sConfig = {0}; | |||||
/* USER CODE BEGIN ADC_Init 1 */ | |||||
/* USER CODE END ADC_Init 1 */ | |||||
/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) | |||||
*/ | |||||
hadc.Instance = ADC1; | |||||
hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; | |||||
hadc.Init.Resolution = ADC_RESOLUTION_12B; | |||||
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; | |||||
hadc.Init.ScanConvMode = ADC_SCAN_DISABLE; | |||||
hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; | |||||
hadc.Init.LowPowerAutoWait = ADC_AUTOWAIT_DISABLE; | |||||
hadc.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_DISABLE; | |||||
hadc.Init.ChannelsBank = ADC_CHANNELS_BANK_A; | |||||
hadc.Init.ContinuousConvMode = DISABLE; | |||||
hadc.Init.NbrOfConversion = 1; | |||||
hadc.Init.DiscontinuousConvMode = DISABLE; | |||||
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; | |||||
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; | |||||
hadc.Init.DMAContinuousRequests = DISABLE; | |||||
if (HAL_ADC_Init(&hadc) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
/** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. | |||||
*/ | |||||
sConfig.Channel = ADC_CHANNEL_0; | |||||
sConfig.Rank = ADC_REGULAR_RANK_1; | |||||
sConfig.SamplingTime = ADC_SAMPLETIME_384CYCLES; | |||||
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
/* USER CODE BEGIN ADC_Init 2 */ | |||||
/* USER CODE END ADC_Init 2 */ | |||||
} | |||||
/** | |||||
* @brief SPI1 Initialization Function | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
static void MX_SPI1_Init(void) | |||||
{ | |||||
/* USER CODE BEGIN SPI1_Init 0 */ | |||||
/* USER CODE END SPI1_Init 0 */ | |||||
/* USER CODE BEGIN SPI1_Init 1 */ | |||||
/* USER CODE END SPI1_Init 1 */ | |||||
/* SPI1 parameter configuration*/ | |||||
hspi1.Instance = SPI1; | |||||
hspi1.Init.Mode = SPI_MODE_MASTER; | |||||
hspi1.Init.Direction = SPI_DIRECTION_2LINES; | |||||
hspi1.Init.DataSize = SPI_DATASIZE_8BIT; | |||||
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; | |||||
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; | |||||
hspi1.Init.NSS = SPI_NSS_SOFT; | |||||
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; | |||||
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; | |||||
hspi1.Init.TIMode = SPI_TIMODE_DISABLE; | |||||
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; | |||||
hspi1.Init.CRCPolynomial = 10; | |||||
if (HAL_SPI_Init(&hspi1) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
/* USER CODE BEGIN SPI1_Init 2 */ | |||||
/* USER CODE END SPI1_Init 2 */ | |||||
} | |||||
/** | |||||
* @brief USART2 Initialization Function | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
static void MX_USART2_UART_Init(void) | |||||
{ | |||||
/* USER CODE BEGIN USART2_Init 0 */ | |||||
/* USER CODE END USART2_Init 0 */ | |||||
/* USER CODE BEGIN USART2_Init 1 */ | |||||
/* USER CODE END USART2_Init 1 */ | |||||
huart2.Instance = USART2; | |||||
huart2.Init.BaudRate = 115200; | |||||
huart2.Init.WordLength = UART_WORDLENGTH_8B; | |||||
huart2.Init.StopBits = UART_STOPBITS_1; | |||||
huart2.Init.Parity = UART_PARITY_NONE; | |||||
huart2.Init.Mode = UART_MODE_TX_RX; | |||||
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; | |||||
huart2.Init.OverSampling = UART_OVERSAMPLING_16; | |||||
if (HAL_UART_Init(&huart2) != HAL_OK) | |||||
{ | |||||
Error_Handler(); | |||||
} | |||||
/* USER CODE BEGIN USART2_Init 2 */ | |||||
/* USER CODE END USART2_Init 2 */ | |||||
} | |||||
/** | |||||
* @brief GPIO Initialization Function | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
static void MX_GPIO_Init(void) | |||||
{ | |||||
GPIO_InitTypeDef GPIO_InitStruct = {0}; | |||||
/* GPIO Ports Clock Enable */ | |||||
__HAL_RCC_GPIOC_CLK_ENABLE(); | |||||
__HAL_RCC_GPIOH_CLK_ENABLE(); | |||||
__HAL_RCC_GPIOA_CLK_ENABLE(); | |||||
__HAL_RCC_GPIOB_CLK_ENABLE(); | |||||
/*Configure GPIO pin Output Level */ | |||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET); | |||||
/*Configure GPIO pin : B1_Pin */ | |||||
GPIO_InitStruct.Pin = B1_Pin; | |||||
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; | |||||
GPIO_InitStruct.Pull = GPIO_NOPULL; | |||||
HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); | |||||
/*Configure GPIO pin : PB6 */ | |||||
GPIO_InitStruct.Pin = GPIO_PIN_6; | |||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | |||||
GPIO_InitStruct.Pull = GPIO_NOPULL; | |||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; | |||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); | |||||
} | |||||
/* USER CODE BEGIN 4 */ | |||||
/* USER CODE END 4 */ | |||||
/** | |||||
* @brief This function is executed in case of error occurrence. | |||||
* @retval None | |||||
*/ | |||||
void Error_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN Error_Handler_Debug */ | |||||
/* User can add his own implementation to report the HAL error return state */ | |||||
/* USER CODE END Error_Handler_Debug */ | |||||
} | |||||
#ifdef USE_FULL_ASSERT | |||||
/** | |||||
* @brief Reports the name of the source file and the source line number | |||||
* where the assert_param error has occurred. | |||||
* @param file: pointer to the source file name | |||||
* @param line: assert_param error line source number | |||||
* @retval None | |||||
*/ | |||||
void assert_failed(uint8_t *file, uint32_t line) | |||||
{ | |||||
/* USER CODE BEGIN 6 */ | |||||
/* User can add his own implementation to report the file name and line number, | |||||
tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ | |||||
/* USER CODE END 6 */ | |||||
} | |||||
#endif /* USE_FULL_ASSERT */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/* USER CODE BEGIN Header */ | |||||
/** | |||||
****************************************************************************** | |||||
* File Name : stm32l1xx_hal_msp.c | |||||
* Description : This file provides code for the MSP Initialization | |||||
* and de-Initialization codes. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 "main.h" | |||||
/* USER CODE BEGIN Includes */ | |||||
/* USER CODE END Includes */ | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* USER CODE BEGIN TD */ | |||||
/* USER CODE END TD */ | |||||
/* Private define ------------------------------------------------------------*/ | |||||
/* USER CODE BEGIN Define */ | |||||
/* USER CODE END Define */ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/* USER CODE BEGIN Macro */ | |||||
/* USER CODE END Macro */ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PV */ | |||||
/* USER CODE END PV */ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
/* USER CODE BEGIN PFP */ | |||||
/* USER CODE END PFP */ | |||||
/* External functions --------------------------------------------------------*/ | |||||
/* USER CODE BEGIN ExternalFunctions */ | |||||
/* USER CODE END ExternalFunctions */ | |||||
/* USER CODE BEGIN 0 */ | |||||
/* USER CODE END 0 */ | |||||
/** | |||||
* Initializes the Global MSP. | |||||
*/ | |||||
void HAL_MspInit(void) | |||||
{ | |||||
/* USER CODE BEGIN MspInit 0 */ | |||||
/* USER CODE END MspInit 0 */ | |||||
__HAL_RCC_COMP_CLK_ENABLE(); | |||||
__HAL_RCC_SYSCFG_CLK_ENABLE(); | |||||
__HAL_RCC_PWR_CLK_ENABLE(); | |||||
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); | |||||
/* System interrupt init*/ | |||||
/* USER CODE BEGIN MspInit 1 */ | |||||
/* USER CODE END MspInit 1 */ | |||||
} | |||||
/** | |||||
* @brief ADC MSP Initialization | |||||
* This function configures the hardware resources used in this example | |||||
* @param hadc: ADC handle pointer | |||||
* @retval None | |||||
*/ | |||||
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) | |||||
{ | |||||
GPIO_InitTypeDef GPIO_InitStruct = {0}; | |||||
if(hadc->Instance==ADC1) | |||||
{ | |||||
/* USER CODE BEGIN ADC1_MspInit 0 */ | |||||
/* USER CODE END ADC1_MspInit 0 */ | |||||
/* Peripheral clock enable */ | |||||
__HAL_RCC_ADC1_CLK_ENABLE(); | |||||
__HAL_RCC_GPIOA_CLK_ENABLE(); | |||||
/**ADC GPIO Configuration | |||||
PA0-WKUP1 ------> ADC_IN0 | |||||
*/ | |||||
GPIO_InitStruct.Pin = GPIO_PIN_0; | |||||
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | |||||
GPIO_InitStruct.Pull = GPIO_NOPULL; | |||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |||||
/* USER CODE BEGIN ADC1_MspInit 1 */ | |||||
/* USER CODE END ADC1_MspInit 1 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief ADC MSP De-Initialization | |||||
* This function freeze the hardware resources used in this example | |||||
* @param hadc: ADC handle pointer | |||||
* @retval None | |||||
*/ | |||||
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) | |||||
{ | |||||
if(hadc->Instance==ADC1) | |||||
{ | |||||
/* USER CODE BEGIN ADC1_MspDeInit 0 */ | |||||
/* USER CODE END ADC1_MspDeInit 0 */ | |||||
/* Peripheral clock disable */ | |||||
__HAL_RCC_ADC1_CLK_DISABLE(); | |||||
/**ADC GPIO Configuration | |||||
PA0-WKUP1 ------> ADC_IN0 | |||||
*/ | |||||
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0); | |||||
/* USER CODE BEGIN ADC1_MspDeInit 1 */ | |||||
/* USER CODE END ADC1_MspDeInit 1 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief SPI MSP Initialization | |||||
* This function configures the hardware resources used in this example | |||||
* @param hspi: SPI handle pointer | |||||
* @retval None | |||||
*/ | |||||
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) | |||||
{ | |||||
GPIO_InitTypeDef GPIO_InitStruct = {0}; | |||||
if(hspi->Instance==SPI1) | |||||
{ | |||||
/* USER CODE BEGIN SPI1_MspInit 0 */ | |||||
/* USER CODE END SPI1_MspInit 0 */ | |||||
/* Peripheral clock enable */ | |||||
__HAL_RCC_SPI1_CLK_ENABLE(); | |||||
__HAL_RCC_GPIOA_CLK_ENABLE(); | |||||
/**SPI1 GPIO Configuration | |||||
PA5 ------> SPI1_SCK | |||||
PA6 ------> SPI1_MISO | |||||
PA7 ------> SPI1_MOSI | |||||
*/ | |||||
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; | |||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | |||||
GPIO_InitStruct.Pull = GPIO_NOPULL; | |||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | |||||
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; | |||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |||||
/* USER CODE BEGIN SPI1_MspInit 1 */ | |||||
/* USER CODE END SPI1_MspInit 1 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief SPI MSP De-Initialization | |||||
* This function freeze the hardware resources used in this example | |||||
* @param hspi: SPI handle pointer | |||||
* @retval None | |||||
*/ | |||||
void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) | |||||
{ | |||||
if(hspi->Instance==SPI1) | |||||
{ | |||||
/* USER CODE BEGIN SPI1_MspDeInit 0 */ | |||||
/* USER CODE END SPI1_MspDeInit 0 */ | |||||
/* Peripheral clock disable */ | |||||
__HAL_RCC_SPI1_CLK_DISABLE(); | |||||
/**SPI1 GPIO Configuration | |||||
PA5 ------> SPI1_SCK | |||||
PA6 ------> SPI1_MISO | |||||
PA7 ------> SPI1_MOSI | |||||
*/ | |||||
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); | |||||
/* USER CODE BEGIN SPI1_MspDeInit 1 */ | |||||
/* USER CODE END SPI1_MspDeInit 1 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief UART MSP Initialization | |||||
* This function configures the hardware resources used in this example | |||||
* @param huart: UART handle pointer | |||||
* @retval None | |||||
*/ | |||||
void HAL_UART_MspInit(UART_HandleTypeDef* huart) | |||||
{ | |||||
GPIO_InitTypeDef GPIO_InitStruct = {0}; | |||||
if(huart->Instance==USART2) | |||||
{ | |||||
/* USER CODE BEGIN USART2_MspInit 0 */ | |||||
/* USER CODE END USART2_MspInit 0 */ | |||||
/* Peripheral clock enable */ | |||||
__HAL_RCC_USART2_CLK_ENABLE(); | |||||
__HAL_RCC_GPIOA_CLK_ENABLE(); | |||||
/**USART2 GPIO Configuration | |||||
PA2 ------> USART2_TX | |||||
PA3 ------> USART2_RX | |||||
*/ | |||||
GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin; | |||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | |||||
GPIO_InitStruct.Pull = GPIO_NOPULL; | |||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | |||||
GPIO_InitStruct.Alternate = GPIO_AF7_USART2; | |||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | |||||
/* USER CODE BEGIN USART2_MspInit 1 */ | |||||
/* USER CODE END USART2_MspInit 1 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief UART MSP De-Initialization | |||||
* This function freeze the hardware resources used in this example | |||||
* @param huart: UART handle pointer | |||||
* @retval None | |||||
*/ | |||||
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) | |||||
{ | |||||
if(huart->Instance==USART2) | |||||
{ | |||||
/* USER CODE BEGIN USART2_MspDeInit 0 */ | |||||
/* USER CODE END USART2_MspDeInit 0 */ | |||||
/* Peripheral clock disable */ | |||||
__HAL_RCC_USART2_CLK_DISABLE(); | |||||
/**USART2 GPIO Configuration | |||||
PA2 ------> USART2_TX | |||||
PA3 ------> USART2_RX | |||||
*/ | |||||
HAL_GPIO_DeInit(GPIOA, USART_TX_Pin|USART_RX_Pin); | |||||
/* USER CODE BEGIN USART2_MspDeInit 1 */ | |||||
/* USER CODE END USART2_MspDeInit 1 */ | |||||
} | |||||
} | |||||
/* USER CODE BEGIN 1 */ | |||||
/* USER CODE END 1 */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/* USER CODE BEGIN Header */ | |||||
/** | |||||
****************************************************************************** | |||||
* @file stm32l1xx_it.c | |||||
* @brief Interrupt Service Routines. | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 "main.h" | |||||
#include "stm32l1xx_it.h" | |||||
/* Private includes ----------------------------------------------------------*/ | |||||
/* USER CODE BEGIN Includes */ | |||||
extern uint16_t Timer1, Timer2; | |||||
extern DMA_HandleTypeDef hdma_spi1_tx; | |||||
extern SPI_HandleTypeDef hspi1; | |||||
/* USER CODE END Includes */ | |||||
/* Private typedef -----------------------------------------------------------*/ | |||||
/* USER CODE BEGIN TD */ | |||||
/* USER CODE END TD */ | |||||
/* Private define ------------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PD */ | |||||
/* USER CODE END PD */ | |||||
/* Private macro -------------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PM */ | |||||
/* USER CODE END PM */ | |||||
/* Private variables ---------------------------------------------------------*/ | |||||
/* USER CODE BEGIN PV */ | |||||
/* USER CODE END PV */ | |||||
/* Private function prototypes -----------------------------------------------*/ | |||||
/* USER CODE BEGIN PFP */ | |||||
/* USER CODE END PFP */ | |||||
/* Private user code ---------------------------------------------------------*/ | |||||
/* USER CODE BEGIN 0 */ | |||||
/* USER CODE END 0 */ | |||||
/* External variables --------------------------------------------------------*/ | |||||
/* USER CODE BEGIN EV */ | |||||
/* USER CODE END EV */ | |||||
/******************************************************************************/ | |||||
/* Cortex-M3 Processor Interruption and Exception Handlers */ | |||||
/******************************************************************************/ | |||||
/** | |||||
* @brief This function handles Non maskable interrupt. | |||||
*/ | |||||
void NMI_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN NonMaskableInt_IRQn 0 */ | |||||
/* USER CODE END NonMaskableInt_IRQn 0 */ | |||||
/* USER CODE BEGIN NonMaskableInt_IRQn 1 */ | |||||
/* USER CODE END NonMaskableInt_IRQn 1 */ | |||||
} | |||||
/** | |||||
* @brief This function handles Hard fault interrupt. | |||||
*/ | |||||
void HardFault_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN HardFault_IRQn 0 */ | |||||
/* USER CODE END HardFault_IRQn 0 */ | |||||
while (1) | |||||
{ | |||||
/* USER CODE BEGIN W1_HardFault_IRQn 0 */ | |||||
/* USER CODE END W1_HardFault_IRQn 0 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief This function handles Memory management fault. | |||||
*/ | |||||
void MemManage_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN MemoryManagement_IRQn 0 */ | |||||
/* USER CODE END MemoryManagement_IRQn 0 */ | |||||
while (1) | |||||
{ | |||||
/* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ | |||||
/* USER CODE END W1_MemoryManagement_IRQn 0 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief This function handles Pre-fetch fault, memory access fault. | |||||
*/ | |||||
void BusFault_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN BusFault_IRQn 0 */ | |||||
/* USER CODE END BusFault_IRQn 0 */ | |||||
while (1) | |||||
{ | |||||
/* USER CODE BEGIN W1_BusFault_IRQn 0 */ | |||||
/* USER CODE END W1_BusFault_IRQn 0 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief This function handles Undefined instruction or illegal state. | |||||
*/ | |||||
void UsageFault_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN UsageFault_IRQn 0 */ | |||||
/* USER CODE END UsageFault_IRQn 0 */ | |||||
while (1) | |||||
{ | |||||
/* USER CODE BEGIN W1_UsageFault_IRQn 0 */ | |||||
/* USER CODE END W1_UsageFault_IRQn 0 */ | |||||
} | |||||
} | |||||
/** | |||||
* @brief This function handles System service call via SWI instruction. | |||||
*/ | |||||
void SVC_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN SVC_IRQn 0 */ | |||||
/* USER CODE END SVC_IRQn 0 */ | |||||
/* USER CODE BEGIN SVC_IRQn 1 */ | |||||
/* USER CODE END SVC_IRQn 1 */ | |||||
} | |||||
/** | |||||
* @brief This function handles Debug monitor. | |||||
*/ | |||||
void DebugMon_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN DebugMonitor_IRQn 0 */ | |||||
/* USER CODE END DebugMonitor_IRQn 0 */ | |||||
/* USER CODE BEGIN DebugMonitor_IRQn 1 */ | |||||
/* USER CODE END DebugMonitor_IRQn 1 */ | |||||
} | |||||
/** | |||||
* @brief This function handles Pendable request for system service. | |||||
*/ | |||||
void PendSV_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN PendSV_IRQn 0 */ | |||||
/* USER CODE END PendSV_IRQn 0 */ | |||||
/* USER CODE BEGIN PendSV_IRQn 1 */ | |||||
/* USER CODE END PendSV_IRQn 1 */ | |||||
} | |||||
/** | |||||
* @brief This function handles System tick timer. | |||||
*/ | |||||
void SysTick_Handler(void) | |||||
{ | |||||
/* USER CODE BEGIN SysTick_IRQn 0 */ | |||||
if (Timer1 > 0){ | |||||
Timer1--; | |||||
} | |||||
if (Timer2 > 0){ | |||||
Timer2--; | |||||
} | |||||
/* USER CODE END SysTick_IRQn 0 */ | |||||
HAL_IncTick(); | |||||
/* USER CODE BEGIN SysTick_IRQn 1 */ | |||||
HAL_SYSTICK_IRQHandler(); | |||||
/* USER CODE END SysTick_IRQn 1 */ | |||||
} | |||||
/******************************************************************************/ | |||||
/* STM32L1xx Peripheral Interrupt Handlers */ | |||||
/* Add here the Interrupt Handlers for the used peripherals. */ | |||||
/* For the available peripheral interrupt handler names, */ | |||||
/* please refer to the startup file (startup_stm32l1xx.s). */ | |||||
/******************************************************************************/ | |||||
/* USER CODE BEGIN 1 */ | |||||
/* USER CODE END 1 */ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file syscalls.c | |||||
* @author Auto-generated by STM32CubeIDE | |||||
* @brief STM32CubeIDE Minimal System calls file | |||||
* | |||||
* For more information about which c-functions | |||||
* need which of these lowlevel functions | |||||
* please consult the Newlib libc-manual | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes */ | |||||
#include <sys/stat.h> | |||||
#include <stdlib.h> | |||||
#include <errno.h> | |||||
#include <stdio.h> | |||||
#include <signal.h> | |||||
#include <time.h> | |||||
#include <sys/time.h> | |||||
#include <sys/times.h> | |||||
/* Variables */ | |||||
//#undef errno | |||||
extern int errno; | |||||
extern int __io_putchar(int ch) __attribute__((weak)); | |||||
extern int __io_getchar(void) __attribute__((weak)); | |||||
register char * stack_ptr asm("sp"); | |||||
char *__env[1] = { 0 }; | |||||
char **environ = __env; | |||||
/* Functions */ | |||||
void initialise_monitor_handles() | |||||
{ | |||||
} | |||||
int _getpid(void) | |||||
{ | |||||
return 1; | |||||
} | |||||
int _kill(int pid, int sig) | |||||
{ | |||||
errno = EINVAL; | |||||
return -1; | |||||
} | |||||
void _exit (int status) | |||||
{ | |||||
_kill(status, -1); | |||||
while (1) {} /* Make sure we hang here */ | |||||
} | |||||
__attribute__((weak)) int _read(int file, char *ptr, int len) | |||||
{ | |||||
int DataIdx; | |||||
for (DataIdx = 0; DataIdx < len; DataIdx++) | |||||
{ | |||||
*ptr++ = __io_getchar(); | |||||
} | |||||
return len; | |||||
} | |||||
__attribute__((weak)) int _write(int file, char *ptr, int len) | |||||
{ | |||||
int DataIdx; | |||||
for (DataIdx = 0; DataIdx < len; DataIdx++) | |||||
{ | |||||
__io_putchar(*ptr++); | |||||
} | |||||
return len; | |||||
} | |||||
int _close(int file) | |||||
{ | |||||
return -1; | |||||
} | |||||
int _fstat(int file, struct stat *st) | |||||
{ | |||||
st->st_mode = S_IFCHR; | |||||
return 0; | |||||
} | |||||
int _isatty(int file) | |||||
{ | |||||
return 1; | |||||
} | |||||
int _lseek(int file, int ptr, int dir) | |||||
{ | |||||
return 0; | |||||
} | |||||
int _open(char *path, int flags, ...) | |||||
{ | |||||
/* Pretend like we always fail */ | |||||
return -1; | |||||
} | |||||
int _wait(int *status) | |||||
{ | |||||
errno = ECHILD; | |||||
return -1; | |||||
} | |||||
int _unlink(char *name) | |||||
{ | |||||
errno = ENOENT; | |||||
return -1; | |||||
} | |||||
int _times(struct tms *buf) | |||||
{ | |||||
return -1; | |||||
} | |||||
int _stat(char *file, struct stat *st) | |||||
{ | |||||
st->st_mode = S_IFCHR; | |||||
return 0; | |||||
} | |||||
int _link(char *old, char *new) | |||||
{ | |||||
errno = EMLINK; | |||||
return -1; | |||||
} | |||||
int _fork(void) | |||||
{ | |||||
errno = EAGAIN; | |||||
return -1; | |||||
} | |||||
int _execve(char *name, char **argv, char **env) | |||||
{ | |||||
errno = ENOMEM; | |||||
return -1; | |||||
} |
/** | |||||
****************************************************************************** | |||||
* @file sysmem.c | |||||
* @author Generated by STM32CubeIDE | |||||
* @brief STM32CubeIDE System Memory calls file | |||||
* | |||||
* For more information about which C functions | |||||
* need which of these lowlevel functions | |||||
* please consult the newlib libc manual | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/* Includes */ | |||||
#include <errno.h> | |||||
#include <stdint.h> | |||||
/** | |||||
* Pointer to the current high watermark of the heap usage | |||||
*/ | |||||
static uint8_t *__sbrk_heap_end = NULL; | |||||
/** | |||||
* @brief _sbrk() allocates memory to the newlib heap and is used by malloc | |||||
* and others from the C library | |||||
* | |||||
* @verbatim | |||||
* ############################################################################ | |||||
* # .data # .bss # newlib heap # MSP stack # | |||||
* # # # # Reserved by _Min_Stack_Size # | |||||
* ############################################################################ | |||||
* ^-- RAM start ^-- _end _estack, RAM end --^ | |||||
* @endverbatim | |||||
* | |||||
* This implementation starts allocating at the '_end' linker symbol | |||||
* The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack | |||||
* The implementation considers '_estack' linker symbol to be RAM end | |||||
* NOTE: If the MSP stack, at any point during execution, grows larger than the | |||||
* reserved size, please increase the '_Min_Stack_Size'. | |||||
* | |||||
* @param incr Memory size | |||||
* @return Pointer to allocated memory | |||||
*/ | |||||
void *_sbrk(ptrdiff_t incr) | |||||
{ | |||||
extern uint8_t _end; /* Symbol defined in the linker script */ | |||||
extern uint8_t _estack; /* Symbol defined in the linker script */ | |||||
extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ | |||||
const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; | |||||
const uint8_t *max_heap = (uint8_t *)stack_limit; | |||||
uint8_t *prev_heap_end; | |||||
/* Initalize heap end at first call */ | |||||
if (NULL == __sbrk_heap_end) | |||||
{ | |||||
__sbrk_heap_end = &_end; | |||||
} | |||||
/* Protect heap from growing into the reserved MSP stack */ | |||||
if (__sbrk_heap_end + incr > max_heap) | |||||
{ | |||||
errno = ENOMEM; | |||||
return (void *)-1; | |||||
} | |||||
prev_heap_end = __sbrk_heap_end; | |||||
__sbrk_heap_end += incr; | |||||
return (void *)prev_heap_end; | |||||
} |
/** | |||||
****************************************************************************** | |||||
* @file system_stm32l1xx.c | |||||
* @author MCD Application Team | |||||
* @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File. | |||||
* | |||||
* This file provides two functions and one global variable to be called from | |||||
* user application: | |||||
* - SystemInit(): This function is called at startup just after reset and | |||||
* before branch to main program. This call is made inside | |||||
* the "startup_stm32l1xx.s" file. | |||||
* | |||||
* - SystemCoreClock variable: Contains the core clock (HCLK), it can be used | |||||
* by the user application to setup the SysTick | |||||
* timer or configure other parameters. | |||||
* | |||||
* - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must | |||||
* be called whenever the core clock is changed | |||||
* during program execution. | |||||
* | |||||
****************************************************************************** | |||||
* @attention | |||||
* | |||||
* <h2><center>© Copyright (c) 2017 STMicroelectronics. | |||||
* All rights reserved.</center></h2> | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
/** @addtogroup CMSIS | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup stm32l1xx_system | |||||
* @{ | |||||
*/ | |||||
/** @addtogroup STM32L1xx_System_Private_Includes | |||||
* @{ | |||||
*/ | |||||
#include "stm32l1xx.h" | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32L1xx_System_Private_TypesDefinitions | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32L1xx_System_Private_Defines | |||||
* @{ | |||||
*/ | |||||
#if !defined (HSE_VALUE) | |||||
#define HSE_VALUE ((uint32_t)8000000U) /*!< Default value of the External oscillator in Hz. | |||||
This value can be provided and adapted by the user application. */ | |||||
#endif /* HSE_VALUE */ | |||||
#if !defined (HSI_VALUE) | |||||
#define HSI_VALUE ((uint32_t)8000000U) /*!< Default value of the Internal oscillator in Hz. | |||||
This value can be provided and adapted by the user application. */ | |||||
#endif /* HSI_VALUE */ | |||||
/*!< Uncomment the following line if you need to use external SRAM mounted | |||||
on STM32L152D_EVAL board as data memory */ | |||||
/* #define DATA_IN_ExtSRAM */ | |||||
/*!< Uncomment the following line if you need to relocate your vector Table in | |||||
Internal SRAM. */ | |||||
/* #define VECT_TAB_SRAM */ | |||||
#define VECT_TAB_OFFSET 0x00U /*!< Vector Table base offset field. | |||||
This value must be a multiple of 0x200. */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32L1xx_System_Private_Macros | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32L1xx_System_Private_Variables | |||||
* @{ | |||||
*/ | |||||
/* This variable is updated in three ways: | |||||
1) by calling CMSIS function SystemCoreClockUpdate() | |||||
2) by calling HAL API function HAL_RCC_GetHCLKFreq() | |||||
3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency | |||||
Note: If you use this function to configure the system clock; then there | |||||
is no need to call the 2 first functions listed above, since SystemCoreClock | |||||
variable is updated automatically. | |||||
*/ | |||||
uint32_t SystemCoreClock = 2097000U; | |||||
const uint8_t PLLMulTable[9] = {3U, 4U, 6U, 8U, 12U, 16U, 24U, 32U, 48U}; | |||||
const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; | |||||
const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32L1xx_System_Private_FunctionPrototypes | |||||
* @{ | |||||
*/ | |||||
#if defined (STM32L151xD) || defined (STM32L152xD) || defined (STM32L162xD) | |||||
#ifdef DATA_IN_ExtSRAM | |||||
static void SystemInit_ExtMemCtl(void); | |||||
#endif /* DATA_IN_ExtSRAM */ | |||||
#endif /* STM32L151xD || STM32L152xD || STM32L162xD */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** @addtogroup STM32L1xx_System_Private_Functions | |||||
* @{ | |||||
*/ | |||||
/** | |||||
* @brief Setup the microcontroller system. | |||||
* Initialize the Embedded Flash Interface, the PLL and update the | |||||
* SystemCoreClock variable. | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
void SystemInit (void) | |||||
{ | |||||
#ifdef DATA_IN_ExtSRAM | |||||
SystemInit_ExtMemCtl(); | |||||
#endif /* DATA_IN_ExtSRAM */ | |||||
#ifdef VECT_TAB_SRAM | |||||
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ | |||||
#else | |||||
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ | |||||
#endif | |||||
} | |||||
/** | |||||
* @brief Update SystemCoreClock according to Clock Register Values | |||||
* The SystemCoreClock variable contains the core clock (HCLK), it can | |||||
* be used by the user application to setup the SysTick timer or configure | |||||
* other parameters. | |||||
* | |||||
* @note Each time the core clock (HCLK) changes, this function must be called | |||||
* to update SystemCoreClock variable value. Otherwise, any configuration | |||||
* based on this variable will be incorrect. | |||||
* | |||||
* @note - The system frequency computed by this function is not the real | |||||
* frequency in the chip. It is calculated based on the predefined | |||||
* constant and the selected clock source: | |||||
* | |||||
* - If SYSCLK source is MSI, SystemCoreClock will contain the MSI | |||||
* value as defined by the MSI range. | |||||
* | |||||
* - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) | |||||
* | |||||
* - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) | |||||
* | |||||
* - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) | |||||
* or HSI_VALUE(*) multiplied/divided by the PLL factors. | |||||
* | |||||
* (*) HSI_VALUE is a constant defined in stm32l1xx.h file (default value | |||||
* 16 MHz) but the real value may vary depending on the variations | |||||
* in voltage and temperature. | |||||
* | |||||
* (**) HSE_VALUE is a constant defined in stm32l1xx.h file (default value | |||||
* 8 MHz), user has to ensure that HSE_VALUE is same as the real | |||||
* frequency of the crystal used. Otherwise, this function may | |||||
* have wrong result. | |||||
* | |||||
* - The result of this function could be not correct when using fractional | |||||
* value for HSE crystal. | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
void SystemCoreClockUpdate (void) | |||||
{ | |||||
uint32_t tmp = 0, pllmul = 0, plldiv = 0, pllsource = 0, msirange = 0; | |||||
/* Get SYSCLK source -------------------------------------------------------*/ | |||||
tmp = RCC->CFGR & RCC_CFGR_SWS; | |||||
switch (tmp) | |||||
{ | |||||
case 0x00: /* MSI used as system clock */ | |||||
msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE) >> 13; | |||||
SystemCoreClock = (32768 * (1 << (msirange + 1))); | |||||
break; | |||||
case 0x04: /* HSI used as system clock */ | |||||
SystemCoreClock = HSI_VALUE; | |||||
break; | |||||
case 0x08: /* HSE used as system clock */ | |||||
SystemCoreClock = HSE_VALUE; | |||||
break; | |||||
case 0x0C: /* PLL used as system clock */ | |||||
/* Get PLL clock source and multiplication factor ----------------------*/ | |||||
pllmul = RCC->CFGR & RCC_CFGR_PLLMUL; | |||||
plldiv = RCC->CFGR & RCC_CFGR_PLLDIV; | |||||
pllmul = PLLMulTable[(pllmul >> 18)]; | |||||
plldiv = (plldiv >> 22) + 1; | |||||
pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; | |||||
if (pllsource == 0x00) | |||||
{ | |||||
/* HSI oscillator clock selected as PLL clock entry */ | |||||
SystemCoreClock = (((HSI_VALUE) * pllmul) / plldiv); | |||||
} | |||||
else | |||||
{ | |||||
/* HSE selected as PLL clock entry */ | |||||
SystemCoreClock = (((HSE_VALUE) * pllmul) / plldiv); | |||||
} | |||||
break; | |||||
default: /* MSI used as system clock */ | |||||
msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE) >> 13; | |||||
SystemCoreClock = (32768 * (1 << (msirange + 1))); | |||||
break; | |||||
} | |||||
/* Compute HCLK clock frequency --------------------------------------------*/ | |||||
/* Get HCLK prescaler */ | |||||
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; | |||||
/* HCLK clock frequency */ | |||||
SystemCoreClock >>= tmp; | |||||
} | |||||
#if defined (STM32L151xD) || defined (STM32L152xD) || defined (STM32L162xD) | |||||
#ifdef DATA_IN_ExtSRAM | |||||
/** | |||||
* @brief Setup the external memory controller. | |||||
* Called in SystemInit() function before jump to main. | |||||
* This function configures the external SRAM mounted on STM32L152D_EVAL board | |||||
* This SRAM will be used as program data memory (including heap and stack). | |||||
* @param None | |||||
* @retval None | |||||
*/ | |||||
void SystemInit_ExtMemCtl(void) | |||||
{ | |||||
__IO uint32_t tmpreg = 0; | |||||
/* Flash 1 wait state */ | |||||
FLASH->ACR |= FLASH_ACR_LATENCY; | |||||
/* Power enable */ | |||||
RCC->APB1ENR |= RCC_APB1ENR_PWREN; | |||||
/* Delay after an RCC peripheral clock enabling */ | |||||
tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN); | |||||
/* Select the Voltage Range 1 (1.8 V) */ | |||||
PWR->CR = PWR_CR_VOS_0; | |||||
/* Wait Until the Voltage Regulator is ready */ | |||||
while((PWR->CSR & PWR_CSR_VOSF) != RESET) | |||||
{ | |||||
} | |||||
/*-- GPIOs Configuration -----------------------------------------------------*/ | |||||
/* | |||||
+-------------------+--------------------+------------------+------------------+ | |||||
+ SRAM pins assignment + | |||||
+-------------------+--------------------+------------------+------------------+ | |||||
| PD0 <-> FSMC_D2 | PE0 <-> FSMC_NBL0 | PF0 <-> FSMC_A0 | PG0 <-> FSMC_A10 | | |||||
| PD1 <-> FSMC_D3 | PE1 <-> FSMC_NBL1 | PF1 <-> FSMC_A1 | PG1 <-> FSMC_A11 | | |||||
| PD4 <-> FSMC_NOE | PE7 <-> FSMC_D4 | PF2 <-> FSMC_A2 | PG2 <-> FSMC_A12 | | |||||
| PD5 <-> FSMC_NWE | PE8 <-> FSMC_D5 | PF3 <-> FSMC_A3 | PG3 <-> FSMC_A13 | | |||||
| PD8 <-> FSMC_D13 | PE9 <-> FSMC_D6 | PF4 <-> FSMC_A4 | PG4 <-> FSMC_A14 | | |||||
| PD9 <-> FSMC_D14 | PE10 <-> FSMC_D7 | PF5 <-> FSMC_A5 | PG5 <-> FSMC_A15 | | |||||
| PD10 <-> FSMC_D15 | PE11 <-> FSMC_D8 | PF12 <-> FSMC_A6 | PG10<-> FSMC_NE2 | | |||||
| PD11 <-> FSMC_A16 | PE12 <-> FSMC_D9 | PF13 <-> FSMC_A7 |------------------+ | |||||
| PD12 <-> FSMC_A17 | PE13 <-> FSMC_D10 | PF14 <-> FSMC_A8 | | |||||
| PD13 <-> FSMC_A18 | PE14 <-> FSMC_D11 | PF15 <-> FSMC_A9 | | |||||
| PD14 <-> FSMC_D0 | PE15 <-> FSMC_D12 |------------------+ | |||||
| PD15 <-> FSMC_D1 |--------------------+ | |||||
+-------------------+ | |||||
*/ | |||||
/* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ | |||||
RCC->AHBENR = 0x000080D8; | |||||
/* Delay after an RCC peripheral clock enabling */ | |||||
tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_GPIODEN); | |||||
/* Connect PDx pins to FSMC Alternate function */ | |||||
GPIOD->AFR[0] = 0x00CC00CC; | |||||
GPIOD->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PDx pins in Alternate function mode */ | |||||
GPIOD->MODER = 0xAAAA0A0A; | |||||
/* Configure PDx pins speed to 40 MHz */ | |||||
GPIOD->OSPEEDR = 0xFFFF0F0F; | |||||
/* Configure PDx pins Output type to push-pull */ | |||||
GPIOD->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PDx pins */ | |||||
GPIOD->PUPDR = 0x00000000; | |||||
/* Connect PEx pins to FSMC Alternate function */ | |||||
GPIOE->AFR[0] = 0xC00000CC; | |||||
GPIOE->AFR[1] = 0xCCCCCCCC; | |||||
/* Configure PEx pins in Alternate function mode */ | |||||
GPIOE->MODER = 0xAAAA800A; | |||||
/* Configure PEx pins speed to 40 MHz */ | |||||
GPIOE->OSPEEDR = 0xFFFFC00F; | |||||
/* Configure PEx pins Output type to push-pull */ | |||||
GPIOE->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PEx pins */ | |||||
GPIOE->PUPDR = 0x00000000; | |||||
/* Connect PFx pins to FSMC Alternate function */ | |||||
GPIOF->AFR[0] = 0x00CCCCCC; | |||||
GPIOF->AFR[1] = 0xCCCC0000; | |||||
/* Configure PFx pins in Alternate function mode */ | |||||
GPIOF->MODER = 0xAA000AAA; | |||||
/* Configure PFx pins speed to 40 MHz */ | |||||
GPIOF->OSPEEDR = 0xFF000FFF; | |||||
/* Configure PFx pins Output type to push-pull */ | |||||
GPIOF->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PFx pins */ | |||||
GPIOF->PUPDR = 0x00000000; | |||||
/* Connect PGx pins to FSMC Alternate function */ | |||||
GPIOG->AFR[0] = 0x00CCCCCC; | |||||
GPIOG->AFR[1] = 0x00000C00; | |||||
/* Configure PGx pins in Alternate function mode */ | |||||
GPIOG->MODER = 0x00200AAA; | |||||
/* Configure PGx pins speed to 40 MHz */ | |||||
GPIOG->OSPEEDR = 0x00300FFF; | |||||
/* Configure PGx pins Output type to push-pull */ | |||||
GPIOG->OTYPER = 0x00000000; | |||||
/* No pull-up, pull-down for PGx pins */ | |||||
GPIOG->PUPDR = 0x00000000; | |||||
/*-- FSMC Configuration ------------------------------------------------------*/ | |||||
/* Enable the FSMC interface clock */ | |||||
RCC->AHBENR = 0x400080D8; | |||||
/* Delay after an RCC peripheral clock enabling */ | |||||
tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_FSMCEN); | |||||
(void)(tmpreg); | |||||
/* Configure and enable Bank1_SRAM3 */ | |||||
FSMC_Bank1->BTCR[4] = 0x00001011; | |||||
FSMC_Bank1->BTCR[5] = 0x00000300; | |||||
FSMC_Bank1E->BWTR[4] = 0x0FFFFFFF; | |||||
/* | |||||
Bank1_SRAM3 is configured as follow: | |||||
p.FSMC_AddressSetupTime = 0; | |||||
p.FSMC_AddressHoldTime = 0; | |||||
p.FSMC_DataSetupTime = 3; | |||||
p.FSMC_BusTurnAroundDuration = 0; | |||||
p.FSMC_CLKDivision = 0; | |||||
p.FSMC_DataLatency = 0; | |||||
p.FSMC_AccessMode = FSMC_AccessMode_A; | |||||
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3; | |||||
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; | |||||
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; | |||||
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; | |||||
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; | |||||
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; | |||||
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; | |||||
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; | |||||
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; | |||||
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; | |||||
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; | |||||
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; | |||||
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; | |||||
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; | |||||
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; | |||||
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); | |||||
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); | |||||
*/ | |||||
} | |||||
#endif /* DATA_IN_ExtSRAM */ | |||||
#endif /* STM32L151xD || STM32L152xD || STM32L162xD */ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/** | |||||
* @} | |||||
*/ | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
/** | |||||
****************************************************************************** | |||||
* @file startup_stm32l152xe.s | |||||
* @author MCD Application Team | |||||
* @brief STM32L152XE Devices vector table for GCC toolchain. | |||||
* This module performs: | |||||
* - Set the initial SP | |||||
* - Set the initial PC == Reset_Handler, | |||||
* - Set the vector table entries with the exceptions ISR address | |||||
* - Configure the clock system | |||||
* - Branches to main in the C library (which eventually | |||||
* calls main()). | |||||
* After Reset the Cortex-M3 processor is in Thread mode, | |||||
* priority is Privileged, and the Stack is set to Main. | |||||
****************************************************************************** | |||||
* | |||||
* @attention | |||||
* | |||||
* Copyright (c) 2017 STMicroelectronics. All rights reserved. | |||||
* | |||||
* This software component is licensed by ST 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 | |||||
* | |||||
****************************************************************************** | |||||
*/ | |||||
.syntax unified | |||||
.cpu cortex-m3 | |||||
.fpu softvfp | |||||
.thumb | |||||
.global g_pfnVectors | |||||
.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 | |||||
.equ BootRAM, 0xF108F85F | |||||
/** | |||||
* @brief This is the code that gets called when the processor first | |||||
* starts execution following a reset event. Only the absolutely | |||||
* necessary set is performed, after which the application | |||||
* supplied main() routine is called. | |||||
* @param None | |||||
* @retval : None | |||||
*/ | |||||
.section .text.Reset_Handler | |||||
.weak Reset_Handler | |||||
.type Reset_Handler, %function | |||||
Reset_Handler: | |||||
/* 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], #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 | |||||
bx lr | |||||
.size Reset_Handler, .-Reset_Handler | |||||
/** | |||||
* @brief This is the code that gets called when the processor receives an | |||||
* unexpected interrupt. This simply enters an infinite loop, preserving | |||||
* the system state for examination by a debugger. | |||||
* | |||||
* @param None | |||||
* @retval : None | |||||
*/ | |||||
.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 M3. 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 | |||||
.type g_pfnVectors, %object | |||||
.size g_pfnVectors, .-g_pfnVectors | |||||
g_pfnVectors: | |||||
.word _estack | |||||
.word Reset_Handler | |||||
.word NMI_Handler | |||||
.word HardFault_Handler | |||||
.word MemManage_Handler | |||||
.word BusFault_Handler | |||||
.word UsageFault_Handler | |||||
.word 0 | |||||
.word 0 | |||||
.word 0 | |||||
.word 0 | |||||
.word SVC_Handler | |||||
.word DebugMon_Handler | |||||
.word 0 | |||||
.word PendSV_Handler | |||||
.word SysTick_Handler | |||||
.word WWDG_IRQHandler | |||||
.word PVD_IRQHandler | |||||
.word TAMPER_STAMP_IRQHandler | |||||
.word RTC_WKUP_IRQHandler | |||||
.word FLASH_IRQHandler | |||||
.word RCC_IRQHandler | |||||
.word EXTI0_IRQHandler | |||||
.word EXTI1_IRQHandler | |||||
.word EXTI2_IRQHandler | |||||
.word EXTI3_IRQHandler | |||||
.word EXTI4_IRQHandler | |||||
.word DMA1_Channel1_IRQHandler | |||||
.word DMA1_Channel2_IRQHandler | |||||
.word DMA1_Channel3_IRQHandler | |||||
.word DMA1_Channel4_IRQHandler | |||||
.word DMA1_Channel5_IRQHandler | |||||
.word DMA1_Channel6_IRQHandler | |||||
.word DMA1_Channel7_IRQHandler | |||||
.word ADC1_IRQHandler | |||||
.word USB_HP_IRQHandler | |||||
.word USB_LP_IRQHandler | |||||
.word DAC_IRQHandler | |||||
.word COMP_IRQHandler | |||||
.word EXTI9_5_IRQHandler | |||||
.word LCD_IRQHandler | |||||
.word TIM9_IRQHandler | |||||
.word TIM10_IRQHandler | |||||
.word TIM11_IRQHandler | |||||
.word TIM2_IRQHandler | |||||
.word TIM3_IRQHandler | |||||
.word TIM4_IRQHandler | |||||
.word I2C1_EV_IRQHandler | |||||
.word I2C1_ER_IRQHandler | |||||
.word I2C2_EV_IRQHandler | |||||
.word I2C2_ER_IRQHandler | |||||
.word SPI1_IRQHandler | |||||
.word SPI2_IRQHandler | |||||
.word USART1_IRQHandler | |||||
.word USART2_IRQHandler | |||||
.word USART3_IRQHandler | |||||
.word EXTI15_10_IRQHandler | |||||
.word RTC_Alarm_IRQHandler | |||||
.word USB_FS_WKUP_IRQHandler | |||||
.word TIM6_IRQHandler | |||||
.word TIM7_IRQHandler | |||||
.word 0 | |||||
.word TIM5_IRQHandler | |||||
.word SPI3_IRQHandler | |||||
.word UART4_IRQHandler | |||||
.word UART5_IRQHandler | |||||
.word DMA2_Channel1_IRQHandler | |||||
.word DMA2_Channel2_IRQHandler | |||||
.word DMA2_Channel3_IRQHandler | |||||
.word DMA2_Channel4_IRQHandler | |||||
.word DMA2_Channel5_IRQHandler | |||||
.word 0 | |||||
.word COMP_ACQ_IRQHandler | |||||
.word 0 | |||||
.word 0 | |||||
.word 0 | |||||
.word 0 | |||||
.word 0 | |||||
.word BootRAM /* @0x108. This is for boot in RAM mode for | |||||
STM32L152XE devices. */ | |||||
/******************************************************************************* | |||||
* | |||||
* 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 MemManage_Handler | |||||
.thumb_set MemManage_Handler,Default_Handler | |||||
.weak BusFault_Handler | |||||
.thumb_set BusFault_Handler,Default_Handler | |||||
.weak UsageFault_Handler | |||||
.thumb_set UsageFault_Handler,Default_Handler | |||||
.weak SVC_Handler | |||||
.thumb_set SVC_Handler,Default_Handler | |||||
.weak DebugMon_Handler | |||||
.thumb_set DebugMon_Handler,Default_Handler | |||||
.weak PendSV_Handler | |||||
.thumb_set PendSV_Handler,Default_Handler | |||||
.weak SysTick_Handler | |||||
.thumb_set SysTick_Handler,Default_Handler | |||||
.weak WWDG_IRQHandler | |||||
.thumb_set WWDG_IRQHandler,Default_Handler | |||||
.weak PVD_IRQHandler | |||||
.thumb_set PVD_IRQHandler,Default_Handler | |||||
.weak TAMPER_STAMP_IRQHandler | |||||
.thumb_set TAMPER_STAMP_IRQHandler,Default_Handler | |||||
.weak RTC_WKUP_IRQHandler | |||||
.thumb_set RTC_WKUP_IRQHandler,Default_Handler | |||||
.weak FLASH_IRQHandler | |||||
.thumb_set FLASH_IRQHandler,Default_Handler | |||||
.weak RCC_IRQHandler | |||||
.thumb_set RCC_IRQHandler,Default_Handler | |||||
.weak EXTI0_IRQHandler | |||||
.thumb_set EXTI0_IRQHandler,Default_Handler | |||||
.weak EXTI1_IRQHandler | |||||
.thumb_set EXTI1_IRQHandler,Default_Handler | |||||
.weak EXTI2_IRQHandler | |||||
.thumb_set EXTI2_IRQHandler,Default_Handler | |||||
.weak EXTI3_IRQHandler | |||||
.thumb_set EXTI3_IRQHandler,Default_Handler | |||||
.weak EXTI4_IRQHandler | |||||
.thumb_set EXTI4_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel1_IRQHandler | |||||
.thumb_set DMA1_Channel1_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel2_IRQHandler | |||||
.thumb_set DMA1_Channel2_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel3_IRQHandler | |||||
.thumb_set DMA1_Channel3_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel4_IRQHandler | |||||
.thumb_set DMA1_Channel4_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel5_IRQHandler | |||||
.thumb_set DMA1_Channel5_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel6_IRQHandler | |||||
.thumb_set DMA1_Channel6_IRQHandler,Default_Handler | |||||
.weak DMA1_Channel7_IRQHandler | |||||
.thumb_set DMA1_Channel7_IRQHandler,Default_Handler | |||||
.weak ADC1_IRQHandler | |||||
.thumb_set ADC1_IRQHandler,Default_Handler | |||||
.weak USB_HP_IRQHandler | |||||
.thumb_set USB_HP_IRQHandler,Default_Handler | |||||
.weak USB_LP_IRQHandler | |||||
.thumb_set USB_LP_IRQHandler,Default_Handler | |||||
.weak DAC_IRQHandler | |||||
.thumb_set DAC_IRQHandler,Default_Handler | |||||
.weak COMP_IRQHandler | |||||
.thumb_set COMP_IRQHandler,Default_Handler | |||||
.weak EXTI9_5_IRQHandler | |||||
.thumb_set EXTI9_5_IRQHandler,Default_Handler | |||||
.weak LCD_IRQHandler | |||||
.thumb_set LCD_IRQHandler,Default_Handler | |||||
.weak TIM9_IRQHandler | |||||
.thumb_set TIM9_IRQHandler,Default_Handler | |||||
.weak TIM10_IRQHandler | |||||
.thumb_set TIM10_IRQHandler,Default_Handler | |||||
.weak TIM11_IRQHandler | |||||
.thumb_set TIM11_IRQHandler,Default_Handler | |||||
.weak TIM2_IRQHandler | |||||
.thumb_set TIM2_IRQHandler,Default_Handler | |||||
.weak TIM3_IRQHandler | |||||
.thumb_set TIM3_IRQHandler,Default_Handler | |||||
.weak TIM4_IRQHandler | |||||
.thumb_set TIM4_IRQHandler,Default_Handler | |||||
.weak I2C1_EV_IRQHandler | |||||
.thumb_set I2C1_EV_IRQHandler,Default_Handler | |||||
.weak I2C1_ER_IRQHandler | |||||
.thumb_set I2C1_ER_IRQHandler,Default_Handler | |||||
.weak I2C2_EV_IRQHandler | |||||
.thumb_set I2C2_EV_IRQHandler,Default_Handler | |||||
.weak I2C2_ER_IRQHandler | |||||
.thumb_set I2C2_ER_IRQHandler,Default_Handler | |||||
.weak SPI1_IRQHandler | |||||
.thumb_set SPI1_IRQHandler,Default_Handler | |||||
.weak SPI2_IRQHandler | |||||
.thumb_set SPI2_IRQHandler,Default_Handler | |||||
.weak USART1_IRQHandler | |||||
.thumb_set USART1_IRQHandler,Default_Handler | |||||
.weak USART2_IRQHandler | |||||
.thumb_set USART2_IRQHandler,Default_Handler | |||||
.weak USART3_IRQHandler | |||||
.thumb_set USART3_IRQHandler,Default_Handler | |||||
.weak EXTI15_10_IRQHandler | |||||
.thumb_set EXTI15_10_IRQHandler,Default_Handler | |||||
.weak RTC_Alarm_IRQHandler | |||||
.thumb_set RTC_Alarm_IRQHandler,Default_Handler | |||||
.weak USB_FS_WKUP_IRQHandler | |||||
.thumb_set USB_FS_WKUP_IRQHandler,Default_Handler | |||||
.weak TIM6_IRQHandler | |||||
.thumb_set TIM6_IRQHandler,Default_Handler | |||||
.weak TIM7_IRQHandler | |||||
.thumb_set TIM7_IRQHandler,Default_Handler | |||||
.weak TIM5_IRQHandler | |||||
.thumb_set TIM5_IRQHandler,Default_Handler | |||||
.weak SPI3_IRQHandler | |||||
.thumb_set SPI3_IRQHandler,Default_Handler | |||||
.weak UART4_IRQHandler | |||||
.thumb_set UART4_IRQHandler,Default_Handler | |||||
.weak UART5_IRQHandler | |||||
.thumb_set UART5_IRQHandler,Default_Handler | |||||
.weak DMA2_Channel1_IRQHandler | |||||
.thumb_set DMA2_Channel1_IRQHandler,Default_Handler | |||||
.weak DMA2_Channel2_IRQHandler | |||||
.thumb_set DMA2_Channel2_IRQHandler,Default_Handler | |||||
.weak DMA2_Channel3_IRQHandler | |||||
.thumb_set DMA2_Channel3_IRQHandler,Default_Handler | |||||
.weak DMA2_Channel4_IRQHandler | |||||
.thumb_set DMA2_Channel4_IRQHandler,Default_Handler | |||||
.weak DMA2_Channel5_IRQHandler | |||||
.thumb_set DMA2_Channel5_IRQHandler,Default_Handler | |||||
.weak COMP_ACQ_IRQHandler | |||||
.thumb_set COMP_ACQ_IRQHandler,Default_Handler | |||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | |||||
Core/Src/fatfs_sd.o: ../Core/Src/fatfs_sd.c \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal.h \ | |||||
../Core/Inc/stm32l1xx_hal_conf.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_def.h \ | |||||
../Drivers/CMSIS/Device/ST/STM32L1xx/Include/stm32l1xx.h \ | |||||
../Drivers/CMSIS/Device/ST/STM32L1xx/Include/stm32l152xe.h \ | |||||
../Drivers/CMSIS/Include/core_cm3.h \ | |||||
../Drivers/CMSIS/Include/cmsis_version.h \ | |||||
../Drivers/CMSIS/Include/cmsis_compiler.h \ | |||||
../Drivers/CMSIS/Include/cmsis_gcc.h \ | |||||
../Drivers/CMSIS/Include/mpu_armv7.h \ | |||||
../Drivers/CMSIS/Device/ST/STM32L1xx/Include/system_stm32l1xx.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc_ex.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio_ex.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_dma.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_cortex.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_adc.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_adc_ex.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ex.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ramfunc.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr_ex.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_spi.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_uart.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_exti.h \ | |||||
../Middlewares/Third_Party/FatFs/src/diskio.h \ | |||||
../Middlewares/Third_Party/FatFs/src/integer.h ../Core/Inc/fatfs_sd.h | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal.h: | |||||
../Core/Inc/stm32l1xx_hal_conf.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_def.h: | |||||
../Drivers/CMSIS/Device/ST/STM32L1xx/Include/stm32l1xx.h: | |||||
../Drivers/CMSIS/Device/ST/STM32L1xx/Include/stm32l152xe.h: | |||||
../Drivers/CMSIS/Include/core_cm3.h: | |||||
../Drivers/CMSIS/Include/cmsis_version.h: | |||||
../Drivers/CMSIS/Include/cmsis_compiler.h: | |||||
../Drivers/CMSIS/Include/cmsis_gcc.h: | |||||
../Drivers/CMSIS/Include/mpu_armv7.h: | |||||
../Drivers/CMSIS/Device/ST/STM32L1xx/Include/system_stm32l1xx.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc_ex.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio_ex.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_dma.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_cortex.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_adc.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_adc_ex.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ex.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ramfunc.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr_ex.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_spi.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_uart.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_exti.h: | |||||
../Middlewares/Third_Party/FatFs/src/diskio.h: | |||||
../Middlewares/Third_Party/FatFs/src/integer.h: | |||||
../Core/Inc/fatfs_sd.h: |
fatfs_sd.c:21:13:SELECT 8 static | |||||
fatfs_sd.c:28:13:DESELECT 8 static | |||||
fatfs_sd.c:35:13:SPI_TxByte 16 static | |||||
fatfs_sd.c:42:13:SPI_TxBuffer 16 static | |||||
fatfs_sd.c:49:16:SPI_RxByte 24 static | |||||
fatfs_sd.c:61:13:SPI_RxBytePtr 16 static | |||||
fatfs_sd.c:71:16:SD_ReadyWait 16 static | |||||
fatfs_sd.c:87:13:SD_PowerOn 24 static | |||||
fatfs_sd.c:125:13:SD_PowerOff 4 static | |||||
fatfs_sd.c:131:16:SD_CheckPower 4 static | |||||
fatfs_sd.c:137:13:SD_RxDataBlock 24 static | |||||
fatfs_sd.c:166:13:SD_TxDataBlock 24 static | |||||
fatfs_sd.c:208:13:SD_SendCmd 24 static | |||||
fatfs_sd.c:247:9:SD_disk_initialize 32 static | |||||
fatfs_sd.c:347:9:SD_disk_status 16 static | |||||
fatfs_sd.c:354:9:SD_disk_read 24 static | |||||
fatfs_sd.c:396:9:SD_disk_write 24 static | |||||
fatfs_sd.c:451:9:SD_disk_ioctl 56 static |
Core/Src/main.o: ../Core/Src/main.c ../Core/Inc/main.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal.h \ | |||||
../Core/Inc/stm32l1xx_hal_conf.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_def.h \ | |||||
../Drivers/CMSIS/Device/ST/STM32L1xx/Include/stm32l1xx.h \ | |||||
../Drivers/CMSIS/Device/ST/STM32L1xx/Include/stm32l152xe.h \ | |||||
../Drivers/CMSIS/Include/core_cm3.h \ | |||||
../Drivers/CMSIS/Include/cmsis_version.h \ | |||||
../Drivers/CMSIS/Include/cmsis_compiler.h \ | |||||
../Drivers/CMSIS/Include/cmsis_gcc.h \ | |||||
../Drivers/CMSIS/Include/mpu_armv7.h \ | |||||
../Drivers/CMSIS/Device/ST/STM32L1xx/Include/system_stm32l1xx.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc_ex.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio_ex.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_dma.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_cortex.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_adc.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_adc_ex.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ex.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ramfunc.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr_ex.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_spi.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_uart.h \ | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_exti.h \ | |||||
../FATFS/App/fatfs.h ../Middlewares/Third_Party/FatFs/src/ff.h \ | |||||
../Middlewares/Third_Party/FatFs/src/integer.h ../FATFS/Target/ffconf.h \ | |||||
../Middlewares/Third_Party/FatFs/src/ff_gen_drv.h \ | |||||
../Middlewares/Third_Party/FatFs/src/diskio.h \ | |||||
../Middlewares/Third_Party/FatFs/src/ff.h ../FATFS/Target/user_diskio.h \ | |||||
../Core/Inc/fatfs_sd.h | |||||
../Core/Inc/main.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal.h: | |||||
../Core/Inc/stm32l1xx_hal_conf.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_def.h: | |||||
../Drivers/CMSIS/Device/ST/STM32L1xx/Include/stm32l1xx.h: | |||||
../Drivers/CMSIS/Device/ST/STM32L1xx/Include/stm32l152xe.h: | |||||
../Drivers/CMSIS/Include/core_cm3.h: | |||||
../Drivers/CMSIS/Include/cmsis_version.h: | |||||
../Drivers/CMSIS/Include/cmsis_compiler.h: | |||||
../Drivers/CMSIS/Include/cmsis_gcc.h: | |||||
../Drivers/CMSIS/Include/mpu_armv7.h: | |||||
../Drivers/CMSIS/Device/ST/STM32L1xx/Include/system_stm32l1xx.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_rcc_ex.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_gpio_ex.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_dma.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_cortex.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_adc.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_adc_ex.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ex.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_flash_ramfunc.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_pwr_ex.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_spi.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_uart.h: | |||||
../Drivers/STM32L1xx_HAL_Driver/Inc/stm32l1xx_hal_exti.h: | |||||
../FATFS/App/fatfs.h: | |||||
../Middlewares/Third_Party/FatFs/src/ff.h: | |||||
../Middlewares/Third_Party/FatFs/src/integer.h: | |||||
../FATFS/Target/ffconf.h: | |||||
../Middlewares/Third_Party/FatFs/src/ff_gen_drv.h: | |||||
../Middlewares/Third_Party/FatFs/src/diskio.h: | |||||
../Middlewares/Third_Party/FatFs/src/ff.h: | |||||
../FATFS/Target/user_diskio.h: | |||||
../Core/Inc/fatfs_sd.h: |