Add 5.ESP8266无线通信--基于MQTT协议无线监控
1 files modified
121 files added
New file |
| | |
| | | <?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.813226633"> |
| | | <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.813226633" 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.813226633" 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.813226633." name="/" resourcePath=""> |
| | | <toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.2092344657" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug"> |
| | | <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.162432798" name="MCU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32L433CBTx" valueType="string"/> |
| | | <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.1417920074" name="CPU" 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.629112301" name="Core" 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.1233979394" 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.1850447780" 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.404080088" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/> |
| | | <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1310947787" 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.5 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32L433CBTx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/CMSIS/Device/ST/STM32L4xx/Include | ../Drivers/STM32L4xx_HAL_Driver/Inc | ../Drivers/STM32L4xx_HAL_Driver/Inc/Legacy || || || USE_HAL_DRIVER | STM32L433xx || || Drivers | Core/Startup | Core || || || ${workspace_loc:/${ProjName}/STM32L433CBTX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || " valueType="string"/> |
| | | <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.298351097" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/> |
| | | <builder buildPath="${workspace_loc:/BearKE1}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1011249320" 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.1641113985" 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.1190923526" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g3" valueType="enumerated"/> |
| | | <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.definedsymbols.728735993" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols"> |
| | | <listOptionValue builtIn="false" value="DEBUG"/> |
| | | </option> |
| | | <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.includepaths.1639182910" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.includepaths" useByScannerDiscovery="false" valueType="includePath"/> |
| | | <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.includefiles.2086168604" name="Include files (-include)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.includefiles" useByScannerDiscovery="false" valueType="includeFiles"/> |
| | | <inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.254595273" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/> |
| | | </tool> |
| | | <tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.236868786" 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.1434761739" 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.1724418847" 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.636385733" 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="DEBUG"/> |
| | | <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/> |
| | | <listOptionValue builtIn="false" value="STM32L433xx"/> |
| | | </option> |
| | | <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.697453194" 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=""${workspace_loc:/${ProjName}/Core/Src/oled}""/> |
| | | <listOptionValue builtIn="false" value="../Drivers/STM32L4xx_HAL_Driver/Inc"/> |
| | | <listOptionValue builtIn="false" value="../Drivers/STM32L4xx_HAL_Driver/Inc/Legacy"/> |
| | | <listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32L4xx/Include"/> |
| | | <listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/> |
| | | </option> |
| | | <inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.397717148" 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.608608373" 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.998189421" 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.480234079" 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.1822092375" 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.1520632085" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" useByScannerDiscovery="false" value="${workspace_loc:/${ProjName}/STM32L433CBTX_FLASH.ld}" valueType="string"/> |
| | | <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.otherflags.1327577117" name="Other flags" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.otherflags" useByScannerDiscovery="false" valueType="stringList"> |
| | | <listOptionValue builtIn="false" value="-u _printf_float"/> |
| | | </option> |
| | | <inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.1456534294" 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.826356845" 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.2006845803" 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.679522245" 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.1168899632" 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.1287817572" 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.1396476652" 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.957178855" 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.957455454" 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.941415151" 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.546478038"> |
| | | <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.546478038" 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.546478038" 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.546478038." name="/" resourcePath=""> |
| | | <toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.1151978979" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release"> |
| | | <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.150885193" name="MCU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32L433CBTx" valueType="string"/> |
| | | <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.582863003" name="CPU" 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.1250260190" name="Core" 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.1681477295" 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.787073888" 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.1081525582" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/> |
| | | <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.155710749" 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.5 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32L433CBTx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/CMSIS/Device/ST/STM32L4xx/Include | ../Drivers/STM32L4xx_HAL_Driver/Inc | ../Drivers/STM32L4xx_HAL_Driver/Inc/Legacy || || || USE_HAL_DRIVER | STM32L433xx || || Drivers | Core/Startup | Core || || || ${workspace_loc:/${ProjName}/STM32L433CBTX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || " valueType="string"/> |
| | | <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.572997470" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/> |
| | | <builder buildPath="${workspace_loc:/BearKE1}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.454264271" 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.1615786894" 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.1998817988" 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.g0" valueType="enumerated"/> |
| | | <inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.183261183" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/> |
| | | </tool> |
| | | <tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.618990986" 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.935827463" 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.g0" valueType="enumerated"/> |
| | | <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.1565638692" name="Optimization level" 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.120487722" 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="STM32L433xx"/> |
| | | </option> |
| | | <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.1403649792" 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/STM32L4xx_HAL_Driver/Inc"/> |
| | | <listOptionValue builtIn="false" value="../Drivers/STM32L4xx_HAL_Driver/Inc/Legacy"/> |
| | | <listOptionValue builtIn="false" value="../Drivers/CMSIS/Device/ST/STM32L4xx/Include"/> |
| | | <listOptionValue builtIn="false" value="../Drivers/CMSIS/Include"/> |
| | | </option> |
| | | <inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.255076545" 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.1176832109" 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.484495381" 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.g0" valueType="enumerated"/> |
| | | <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.71840864" name="Optimization level" 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.887489610" 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.503855115" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32L433CBTX_FLASH.ld}" valueType="string"/> |
| | | <inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.1218191905" 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.1190185157" 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.2061255109" 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.359852805" 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.1403043900" 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.1499198044" 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.928384629" 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.1692956272" 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.1475525158" 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.464062641" 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="BearKE1.null.333105878" name="BearKE1"/> |
| | | </storageModule> |
| | | <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> |
| | | <storageModule moduleId="scannerConfiguration"> |
| | | <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> |
| | | <scannerConfigBuildInfo instanceId="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.813226633;com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.813226633.;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.236868786;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.397717148"> |
| | | <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/> |
| | | </scannerConfigBuildInfo> |
| | | <scannerConfigBuildInfo instanceId="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.546478038;com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.546478038.;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.618990986;com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.255076545"> |
| | | <autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId=""/> |
| | | </scannerConfigBuildInfo> |
| | | </storageModule> |
| | | <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> |
| | | <storageModule moduleId="refreshScope"/> |
| | | </cproject> |
New file |
| | |
| | | [PreviousLibFiles] |
| | | LibFiles=Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l433xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/system_stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_armclang_ltm.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_armv81mml.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_cm35p.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\gpio.c;Core\Src\adc.c;Core\Src\i2c.c;Core\Src\tim.c;Core\Src\usart.c;Core\Src\stm32l4xx_it.c;Core\Src\stm32l4xx_hal_msp.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;Core\Src/system_stm32l4xx.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;Core\Src/system_stm32l4xx.c;;; |
| | | HeaderPath=Drivers\STM32L4xx_HAL_Driver\Inc;Drivers\STM32L4xx_HAL_Driver\Inc\Legacy;Drivers\CMSIS\Device\ST\STM32L4xx\Include;Drivers\CMSIS\Include;Core\Inc; |
| | | CDefines=USE_HAL_DRIVER;STM32L433xx;USE_HAL_DRIVER;USE_HAL_DRIVER; |
| | | |
| | | [PreviousGenFiles] |
| | | AdvancedFolderStructure=true |
| | | HeaderFileListSize=8 |
| | | HeaderFiles#0=E:/STM32CubeIDE/BearKE1/Core/Inc/gpio.h |
| | | HeaderFiles#1=E:/STM32CubeIDE/BearKE1/Core/Inc/adc.h |
| | | HeaderFiles#2=E:/STM32CubeIDE/BearKE1/Core/Inc/i2c.h |
| | | HeaderFiles#3=E:/STM32CubeIDE/BearKE1/Core/Inc/tim.h |
| | | HeaderFiles#4=E:/STM32CubeIDE/BearKE1/Core/Inc/usart.h |
| | | HeaderFiles#5=E:/STM32CubeIDE/BearKE1/Core/Inc/stm32l4xx_it.h |
| | | HeaderFiles#6=E:/STM32CubeIDE/BearKE1/Core/Inc/stm32l4xx_hal_conf.h |
| | | HeaderFiles#7=E:/STM32CubeIDE/BearKE1/Core/Inc/main.h |
| | | HeaderFolderListSize=1 |
| | | HeaderPath#0=E:/STM32CubeIDE/BearKE1/Core/Inc |
| | | HeaderFiles=; |
| | | SourceFileListSize=8 |
| | | SourceFiles#0=E:/STM32CubeIDE/BearKE1/Core/Src/gpio.c |
| | | SourceFiles#1=E:/STM32CubeIDE/BearKE1/Core/Src/adc.c |
| | | SourceFiles#2=E:/STM32CubeIDE/BearKE1/Core/Src/i2c.c |
| | | SourceFiles#3=E:/STM32CubeIDE/BearKE1/Core/Src/tim.c |
| | | SourceFiles#4=E:/STM32CubeIDE/BearKE1/Core/Src/usart.c |
| | | SourceFiles#5=E:/STM32CubeIDE/BearKE1/Core/Src/stm32l4xx_it.c |
| | | SourceFiles#6=E:/STM32CubeIDE/BearKE1/Core/Src/stm32l4xx_hal_msp.c |
| | | SourceFiles#7=E:/STM32CubeIDE/BearKE1/Core/Src/main.c |
| | | SourceFolderListSize=1 |
| | | SourcePath#0=E:/STM32CubeIDE/BearKE1/Core/Src |
| | | SourceFiles=; |
| | | |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <projectDescription> |
| | | <name>BearKE1</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.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> |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
| | | <project> |
| | | <configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.813226633" 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="-507441614523024997" 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.546478038" 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="-507441614523024997" 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> |
New file |
| | |
| | | 66BE74F758C12D739921AEA421D593D3=5 |
| | | 8DF89ED150041C4CBC7CB9A9CAA90856=5C1FC6A16884810719D794EA665E4E8D |
| | | DC22A860405A8BF2F2C095E5B6529F12=5C1FC6A16884810719D794EA665E4E8D |
| | | eclipse.preferences.version=1 |
New 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"/> |
| | | <booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.limit_swo_clock.enabled" value="false"/> |
| | | <stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.limit_swo_clock.value" value=""/> |
| | | <stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.loadList" value="{"fItems":[{"fIsFromMainTab":true,"fPath":"Debug/BearKE1.elf","fProjectName":"BearKE1","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_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="E:\STM32CubeIDE\BearKE1\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"/> |
| | | <booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkenable_rtos" value="false"/> |
| | | <stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkrestart_configurations" value="{"fItems":[{"fDisplayName":"Reset","fIsSuppressible":false,"fResetAttribute":"Software system reset","fResetStrategies":[{"fDisplayName":"Software system reset","fLaunchAttribute":"system_reset","fGdbCommands":["monitor reset\r\n"],"fCmdOptions":["-g"]},{"fDisplayName":"Hardware reset","fLaunchAttribute":"hardware_reset","fGdbCommands":["monitor reset hardware\r\n"],"fCmdOptions":["-g"]},{"fDisplayName":"Core reset","fLaunchAttribute":"core_reset","fGdbCommands":["monitor reset core\r\n"],"fCmdOptions":["-g"]},{"fDisplayName":"None","fLaunchAttribute":"no_reset","fGdbCommands":[],"fCmdOptions":["-g"]}],"fGdbCommandGroup":{"name":"Additional commands","commands":[]}}]}"/> |
| | | <booleanAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.enableRtosProxy" value="false"/> |
| | | <stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyCustomProperties" value=""/> |
| | | <stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriver" value="threadx"/> |
| | | <booleanAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriverAuto" value="false"/> |
| | | <stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriverPort" value="cortex_m0"/> |
| | | <intAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyPort" value="60000"/> |
| | | <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.jtagDeviceId" value="com.st.stm32cube.ide.mcu.debug.stlink"/> |
| | | <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/BearKE1.elf"/> |
| | | <stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="BearKE1"/> |
| | | <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.813226633"/> |
| | | <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> |
| | | <listEntry value="/BearKE1"/> |
| | | </listAttribute> |
| | | <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> |
| | | <listEntry value="4"/> |
| | | </listAttribute> |
| | | <stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/> |
| | | </launchConfiguration> |
New file |
| | |
| | | #MicroXplorer Configuration settings - do not modify |
| | | ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_9 |
| | | ADC1.Channel-1\#ChannelRegularConversion=ADC_CHANNEL_11 |
| | | ADC1.ContinuousConvMode=ENABLE |
| | | ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag,master,Rank-1\#ChannelRegularConversion,Channel-1\#ChannelRegularConversion,SamplingTime-1\#ChannelRegularConversion,OffsetNumber-1\#ChannelRegularConversion,NbrOfConversion,ContinuousConvMode |
| | | ADC1.NbrOfConversion=2 |
| | | ADC1.NbrOfConversionFlag=1 |
| | | ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE |
| | | ADC1.OffsetNumber-1\#ChannelRegularConversion=ADC_OFFSET_NONE |
| | | ADC1.Rank-0\#ChannelRegularConversion=1 |
| | | ADC1.Rank-1\#ChannelRegularConversion=2 |
| | | ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 |
| | | ADC1.SamplingTime-1\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 |
| | | ADC1.master=1 |
| | | File.Version=6 |
| | | GPIO.groupedBy=Group By Peripherals |
| | | I2C2.IPParameters=Timing |
| | | I2C2.Timing=0x10909CEC |
| | | KeepUserPlacement=false |
| | | Mcu.Family=STM32L4 |
| | | Mcu.IP0=ADC1 |
| | | Mcu.IP1=I2C2 |
| | | Mcu.IP2=NVIC |
| | | Mcu.IP3=RCC |
| | | Mcu.IP4=SYS |
| | | Mcu.IP5=TIM2 |
| | | Mcu.IP6=TIM6 |
| | | Mcu.IP7=USART1 |
| | | Mcu.IP8=USART2 |
| | | Mcu.IPNb=9 |
| | | Mcu.Name=STM32L433C(B-C)Tx |
| | | Mcu.Package=LQFP48 |
| | | Mcu.Pin0=PC13 |
| | | Mcu.Pin1=PH0-OSC_IN (PH0) |
| | | Mcu.Pin10=PB14 |
| | | Mcu.Pin11=PA9 |
| | | Mcu.Pin12=PA10 |
| | | Mcu.Pin13=PA13 (JTMS-SWDIO) |
| | | Mcu.Pin14=PA14 (JTCK-SWCLK) |
| | | Mcu.Pin15=PA15 (JTDI) |
| | | Mcu.Pin16=PB3 (JTDO-TRACESWO) |
| | | Mcu.Pin17=PB4 (NJTRST) |
| | | Mcu.Pin18=PB5 |
| | | Mcu.Pin19=PB6 |
| | | Mcu.Pin2=PH1-OSC_OUT (PH1) |
| | | Mcu.Pin20=PB7 |
| | | Mcu.Pin21=VP_SYS_VS_Systick |
| | | Mcu.Pin22=VP_TIM6_VS_ClockSourceINT |
| | | Mcu.Pin3=PA1 |
| | | Mcu.Pin4=PA2 |
| | | Mcu.Pin5=PA3 |
| | | Mcu.Pin6=PA4 |
| | | Mcu.Pin7=PA6 |
| | | Mcu.Pin8=PB1 |
| | | Mcu.Pin9=PB13 |
| | | Mcu.PinsNb=23 |
| | | Mcu.ThirdPartyNb=0 |
| | | Mcu.UserConstants= |
| | | Mcu.UserName=STM32L433CBTx |
| | | MxCube.Version=6.3.0 |
| | | MxDb.Version=DB.6.0.30 |
| | | NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false |
| | | NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false |
| | | NVIC.EXTI15_10_IRQn=true\:2\:0\:true\:false\:true\:true\:true |
| | | NVIC.ForceEnableDMAVector=true |
| | | NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false |
| | | NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false |
| | | NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false |
| | | NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false |
| | | NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 |
| | | NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false |
| | | NVIC.SysTick_IRQn=true\:0\:0\:true\:false\:true\:false\:true |
| | | NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true |
| | | NVIC.USART2_IRQn=true\:0\:0\:false\:false\:true\:true\:true |
| | | NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false |
| | | PA1.GPIOParameters=GPIO_PuPd,GPIO_Label |
| | | PA1.GPIO_Label=Beep |
| | | PA1.GPIO_PuPd=GPIO_PULLDOWN |
| | | PA1.Signal=S_TIM2_CH2 |
| | | PA10.Mode=Asynchronous |
| | | PA10.Signal=USART1_RX |
| | | PA13\ (JTMS-SWDIO).Mode=Serial_Wire |
| | | PA13\ (JTMS-SWDIO).Signal=SYS_JTMS-SWDIO |
| | | PA14\ (JTCK-SWCLK).Mode=Serial_Wire |
| | | PA14\ (JTCK-SWCLK).Signal=SYS_JTCK-SWCLK |
| | | PA15\ (JTDI).GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI |
| | | PA15\ (JTDI).GPIO_Label=Key2 |
| | | PA15\ (JTDI).GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING |
| | | PA15\ (JTDI).GPIO_PuPd=GPIO_PULLUP |
| | | PA15\ (JTDI).Locked=true |
| | | PA15\ (JTDI).Signal=GPXTI15 |
| | | PA2.Mode=Asynchronous |
| | | PA2.Signal=USART2_TX |
| | | PA3.Mode=Asynchronous |
| | | PA3.Signal=USART2_RX |
| | | PA4.GPIOParameters=GPIO_Label |
| | | PA4.GPIO_Label=AdcLux |
| | | PA4.Signal=ADCx_IN9 |
| | | PA6.GPIOParameters=GPIO_Label |
| | | PA6.GPIO_Label=AdcMic |
| | | PA6.Signal=ADCx_IN11 |
| | | PA9.Mode=Asynchronous |
| | | PA9.Signal=USART1_TX |
| | | PB1.GPIOParameters=GPIO_Label |
| | | PB1.GPIO_Label=Relay1 |
| | | PB1.Locked=true |
| | | PB1.Signal=GPIO_Output |
| | | PB13.Locked=true |
| | | PB13.Mode=I2C |
| | | PB13.Signal=I2C2_SCL |
| | | PB14.Locked=true |
| | | PB14.Mode=I2C |
| | | PB14.Signal=I2C2_SDA |
| | | PB3\ (JTDO-TRACESWO).GPIOParameters=GPIO_Label |
| | | PB3\ (JTDO-TRACESWO).GPIO_Label=Relay2 |
| | | PB3\ (JTDO-TRACESWO).Locked=true |
| | | PB3\ (JTDO-TRACESWO).Signal=GPIO_Output |
| | | PB4\ (NJTRST).GPIOParameters=PinState,GPIO_Label |
| | | PB4\ (NJTRST).GPIO_Label=SysLed |
| | | PB4\ (NJTRST).Locked=true |
| | | PB4\ (NJTRST).PinState=GPIO_PIN_SET |
| | | PB4\ (NJTRST).Signal=GPIO_Output |
| | | PB5.GPIOParameters=PinState,GPIO_Label |
| | | PB5.GPIO_Label=BlueLed |
| | | PB5.Locked=true |
| | | PB5.PinState=GPIO_PIN_SET |
| | | PB5.Signal=GPIO_Output |
| | | PB6.GPIOParameters=PinState,GPIO_Label |
| | | PB6.GPIO_Label=RedLed |
| | | PB6.Locked=true |
| | | PB6.PinState=GPIO_PIN_SET |
| | | PB6.Signal=GPIO_Output |
| | | PB7.GPIOParameters=PinState,GPIO_Label |
| | | PB7.GPIO_Label=GreenLed |
| | | PB7.Locked=true |
| | | PB7.PinState=GPIO_PIN_SET |
| | | PB7.Signal=GPIO_Output |
| | | PC13.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI |
| | | PC13.GPIO_Label=Key1 |
| | | PC13.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING |
| | | PC13.GPIO_PuPd=GPIO_PULLUP |
| | | PC13.Locked=true |
| | | PC13.Signal=GPXTI13 |
| | | PH0-OSC_IN\ (PH0).Mode=HSE-External-Oscillator |
| | | PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN |
| | | PH1-OSC_OUT\ (PH1).Mode=HSE-External-Oscillator |
| | | PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT |
| | | PinOutPanel.RotationAngle=0 |
| | | ProjectManager.AskForMigrate=true |
| | | ProjectManager.BackupPrevious=false |
| | | ProjectManager.CompilerOptimize=6 |
| | | ProjectManager.ComputerToolchain=false |
| | | ProjectManager.CoupleFile=true |
| | | ProjectManager.CustomerFirmwarePackage= |
| | | ProjectManager.DefaultFWLocation=true |
| | | ProjectManager.DeletePrevious=true |
| | | ProjectManager.DeviceId=STM32L433CBTx |
| | | ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.17.0 |
| | | 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=BearKE1.ioc |
| | | ProjectManager.ProjectName=BearKE1 |
| | | ProjectManager.RegisterCallBack= |
| | | ProjectManager.StackSize=0x400 |
| | | ProjectManager.TargetToolchain=STM32CubeIDE |
| | | ProjectManager.ToolChainLocation= |
| | | ProjectManager.UnderRoot=true |
| | | ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_TIM6_Init-TIM6-false-HAL-true,4-MX_TIM2_Init-TIM2-false-HAL-true,5-MX_USART1_UART_Init-USART1-false-HAL-true,6-MX_ADC1_Init-ADC1-false-HAL-true,7-MX_I2C2_Init-I2C2-false-HAL-true |
| | | RCC.ADCFreq_Value=12000000 |
| | | RCC.AHBFreq_Value=80000000 |
| | | RCC.APB1Freq_Value=80000000 |
| | | RCC.APB1TimFreq_Value=80000000 |
| | | RCC.APB2Freq_Value=80000000 |
| | | RCC.APB2TimFreq_Value=80000000 |
| | | RCC.CortexFreq_Value=80000000 |
| | | RCC.FCLKCortexFreq_Value=80000000 |
| | | RCC.FamilyName=M |
| | | RCC.HCLKFreq_Value=80000000 |
| | | RCC.HSE_VALUE=8000000 |
| | | RCC.HSI48_VALUE=48000000 |
| | | RCC.HSI_VALUE=16000000 |
| | | RCC.I2C1Freq_Value=80000000 |
| | | RCC.I2C2Freq_Value=80000000 |
| | | RCC.I2C3Freq_Value=80000000 |
| | | RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1R,PLLSAI1RoutputFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value |
| | | RCC.LPTIM1Freq_Value=80000000 |
| | | RCC.LPTIM2Freq_Value=80000000 |
| | | RCC.LPUART1Freq_Value=80000000 |
| | | RCC.LSCOPinFreq_Value=32000 |
| | | RCC.LSE_VALUE=32768 |
| | | RCC.LSI_VALUE=32000 |
| | | RCC.MCO1PinFreq_Value=80000000 |
| | | RCC.MSI_VALUE=4000000 |
| | | RCC.PLLN=20 |
| | | RCC.PLLPoutputFreq_Value=22857142.85714286 |
| | | RCC.PLLQoutputFreq_Value=80000000 |
| | | RCC.PLLRCLKFreq_Value=80000000 |
| | | RCC.PLLSAI1N=9 |
| | | RCC.PLLSAI1PoutputFreq_Value=10285714.285714285 |
| | | RCC.PLLSAI1QoutputFreq_Value=36000000 |
| | | RCC.PLLSAI1R=RCC_PLLR_DIV6 |
| | | RCC.PLLSAI1RoutputFreq_Value=12000000 |
| | | RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE |
| | | RCC.PWRFreq_Value=80000000 |
| | | RCC.RNGFreq_Value=36000000 |
| | | RCC.SAI1Freq_Value=10285714.285714285 |
| | | RCC.SWPMI1Freq_Value=80000000 |
| | | RCC.SYSCLKFreq_VALUE=80000000 |
| | | RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK |
| | | RCC.USART1Freq_Value=80000000 |
| | | RCC.USART2Freq_Value=80000000 |
| | | RCC.USART3Freq_Value=80000000 |
| | | RCC.USBFreq_Value=36000000 |
| | | RCC.VCOInputFreq_Value=8000000 |
| | | RCC.VCOOutputFreq_Value=160000000 |
| | | RCC.VCOSAI1OutputFreq_Value=72000000 |
| | | SH.ADCx_IN11.0=ADC1_IN11,IN11-Single-Ended |
| | | SH.ADCx_IN11.ConfNb=1 |
| | | SH.ADCx_IN9.0=ADC1_IN9,IN9-Single-Ended |
| | | SH.ADCx_IN9.ConfNb=1 |
| | | SH.GPXTI13.0=GPIO_EXTI13 |
| | | SH.GPXTI13.ConfNb=1 |
| | | SH.GPXTI15.0=GPIO_EXTI15 |
| | | SH.GPXTI15.ConfNb=1 |
| | | SH.S_TIM2_CH2.0=TIM2_CH2,PWM Generation2 CH2 |
| | | SH.S_TIM2_CH2.ConfNb=1 |
| | | TIM2.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 |
| | | TIM2.IPParameters=Channel-PWM Generation2 CH2,Prescaler,Period,Pulse-PWM Generation2 CH2 |
| | | TIM2.Period=370-1 |
| | | TIM2.Prescaler=80-1 |
| | | TIM2.Pulse-PWM\ Generation2\ CH2=185 |
| | | TIM6.IPParameters=Prescaler,Period |
| | | TIM6.Period=1 |
| | | TIM6.Prescaler=80-1 |
| | | USART1.IPParameters=VirtualMode-Asynchronous |
| | | USART1.VirtualMode-Asynchronous=VM_ASYNC |
| | | USART2.IPParameters=VirtualMode-Asynchronous |
| | | USART2.VirtualMode-Asynchronous=VM_ASYNC |
| | | VP_SYS_VS_Systick.Mode=SysTick |
| | | VP_SYS_VS_Systick.Signal=SYS_VS_Systick |
| | | VP_TIM6_VS_ClockSourceINT.Mode=Enable_Timer |
| | | VP_TIM6_VS_ClockSourceINT.Signal=TIM6_VS_ClockSourceINT |
| | | board=custom |
| | | isbadioc=false |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file adc.h |
| | | * @brief This file contains all the function prototypes for |
| | | * the adc.c file |
| | | ****************************************************************************** |
| | | * @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 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | /* Define to prevent recursive inclusion -------------------------------------*/ |
| | | #ifndef __ADC_H__ |
| | | #define __ADC_H__ |
| | | |
| | | #ifdef __cplusplus |
| | | extern "C" { |
| | | #endif |
| | | |
| | | /* Includes ------------------------------------------------------------------*/ |
| | | #include "main.h" |
| | | |
| | | /* USER CODE BEGIN Includes */ |
| | | |
| | | /* USER CODE END Includes */ |
| | | |
| | | extern ADC_HandleTypeDef hadc1; |
| | | |
| | | /* USER CODE BEGIN Private defines */ |
| | | |
| | | /* USER CODE END Private defines */ |
| | | |
| | | void MX_ADC1_Init(void); |
| | | |
| | | /* USER CODE BEGIN Prototypes */ |
| | | extern int adc_sample_lux_noisy(uint32_t *lux, uint32_t *noisy); |
| | | /* USER CODE END Prototypes */ |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | | |
| | | #endif /* __ADC_H__ */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /* |
| | | * coreJSON v3.0.0 |
| | | * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
| | | * |
| | | * Permission is hereby granted, free of charge, to any person obtaining a copy of |
| | | * this software and associated documentation files (the "Software"), to deal in |
| | | * the Software without restriction, including without limitation the rights to |
| | | * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
| | | * the Software, and to permit persons to whom the Software is furnished to do so, |
| | | * subject to the following conditions: |
| | | * |
| | | * The above copyright notice and this permission notice shall be included in all |
| | | * copies or substantial portions of the Software. |
| | | * |
| | | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| | | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |
| | | * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
| | | * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
| | | * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| | | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| | | */ |
| | | |
| | | /** |
| | | * @file core_json.h |
| | | * @brief Include this header file to use coreJSON in your application. |
| | | */ |
| | | |
| | | #ifndef CORE_JSON_H_ |
| | | #define CORE_JSON_H_ |
| | | |
| | | #include <stdbool.h> |
| | | #include <stddef.h> |
| | | |
| | | /** |
| | | * @ingroup json_enum_types |
| | | * @brief Return codes from coreJSON library functions. |
| | | */ |
| | | typedef enum |
| | | { |
| | | JSONPartial = 0, /**< @brief JSON document is valid so far but incomplete. */ |
| | | JSONSuccess, /**< @brief JSON document is valid and complete. */ |
| | | JSONIllegalDocument, /**< @brief JSON document is invalid or malformed. */ |
| | | JSONMaxDepthExceeded, /**< @brief JSON document has nesting that exceeds JSON_MAX_DEPTH. */ |
| | | JSONNotFound, /**< @brief Query key could not be found in the JSON document. */ |
| | | JSONNullParameter, /**< @brief Pointer parameter passed to a function is NULL. */ |
| | | JSONBadParameter /**< @brief Query key is empty, or any subpart is empty, or max is 0. */ |
| | | } JSONStatus_t; |
| | | |
| | | /** |
| | | * @brief Parse a buffer to determine if it contains a valid JSON document. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * @note The maximum nesting depth may be specified by defining the macro |
| | | * JSON_MAX_DEPTH. The default is 32 of sizeof(char). |
| | | * |
| | | * @note By default, a valid JSON document may contain a single element |
| | | * (e.g., string, boolean, number). To require that a valid document |
| | | * contain an object or array, define JSON_VALIDATE_COLLECTIONS_ONLY. |
| | | * |
| | | * @return #JSONSuccess if the buffer contents are valid JSON; |
| | | * #JSONNullParameter if buf is NULL; |
| | | * #JSONBadParameter if max is 0; |
| | | * #JSONIllegalDocument if the buffer contents are NOT valid JSON; |
| | | * #JSONMaxDepthExceeded if object and array nesting exceeds a threshold; |
| | | * #JSONPartial if the buffer contents are potentially valid but incomplete. |
| | | * |
| | | * <b>Example</b> |
| | | * @code{c} |
| | | * // Variables used in this example. |
| | | * JSONStatus_t result; |
| | | * char buffer[] = "{\"foo\":\"abc\",\"bar\":{\"foo\":\"xyz\"}}"; |
| | | * size_t bufferLength = sizeof( buffer ) - 1; |
| | | * |
| | | * result = JSON_Validate( buffer, bufferLength ); |
| | | * |
| | | * // JSON document is valid. |
| | | * assert( result == JSONSuccess ); |
| | | * @endcode |
| | | */ |
| | | /* @[declare_json_validate] */ |
| | | JSONStatus_t JSON_Validate( const char * buf, |
| | | size_t max ); |
| | | /* @[declare_json_validate] */ |
| | | |
| | | /** |
| | | * @brief Find a key or array index in a JSON document and output the |
| | | * pointer @p outValue to its value. |
| | | * |
| | | * Any value may also be an object or an array to a maximum depth. A search |
| | | * may descend through nested objects or arrays when the query contains matching |
| | | * key strings or array indexes joined by a separator. |
| | | * |
| | | * For example, if the provided buffer contains <code>{"foo":"abc","bar":{"foo":"xyz"}}</code>, |
| | | * then a search for 'foo' would output <code>abc</code>, 'bar' would output |
| | | * <code>{"foo":"xyz"}</code>, and a search for 'bar.foo' would output |
| | | * <code>xyz</code>. |
| | | * |
| | | * If the provided buffer contains <code>[123,456,{"foo":"abc","bar":[88,99]}]</code>, |
| | | * then a search for '[1]' would output <code>456</code>, '[2].foo' would output |
| | | * <code>abc</code>, and '[2].bar[0]' would output <code>88</code>. |
| | | * |
| | | * On success, the pointer @p outValue points to a location in buf. No null |
| | | * termination is done for the value. For valid JSON it is safe to place |
| | | * a null character at the end of the value, so long as the character |
| | | * replaced is put back before running another search. |
| | | * |
| | | * @param[in] buf The buffer to search. |
| | | * @param[in] max size of the buffer. |
| | | * @param[in] query The object keys and array indexes to search for. |
| | | * @param[in] queryLength Length of the key. |
| | | * @param[out] outValue A pointer to receive the address of the value found. |
| | | * @param[out] outValueLength A pointer to receive the length of the value found. |
| | | * |
| | | * @note The maximum nesting depth may be specified by defining the macro |
| | | * JSON_MAX_DEPTH. The default is 32 of sizeof(char). |
| | | * |
| | | * @note JSON_Search() performs validation, but stops upon finding a matching |
| | | * key and its value. To validate the entire JSON document, use JSON_Validate(). |
| | | * |
| | | * @return #JSONSuccess if the query is matched and the value output; |
| | | * #JSONNullParameter if any pointer parameters are NULL; |
| | | * #JSONBadParameter if the query is empty, or the portion after a separator is empty, |
| | | * or max is 0, or an index is too large to convert to a signed 32-bit integer; |
| | | * #JSONNotFound if the query has no match. |
| | | * |
| | | * <b>Example</b> |
| | | * @code{c} |
| | | * // Variables used in this example. |
| | | * JSONStatus_t result; |
| | | * char buffer[] = "{\"foo\":\"abc\",\"bar\":{\"foo\":\"xyz\"}}"; |
| | | * size_t bufferLength = sizeof( buffer ) - 1; |
| | | * char query[] = "bar.foo"; |
| | | * size_t queryLength = sizeof( query ) - 1; |
| | | * char * value; |
| | | * size_t valueLength; |
| | | * |
| | | * // Calling JSON_Validate() is not necessary if the document is guaranteed to be valid. |
| | | * result = JSON_Validate( buffer, bufferLength ); |
| | | * |
| | | * if( result == JSONSuccess ) |
| | | * { |
| | | * result = JSON_Search( buffer, bufferLength, query, queryLength, |
| | | * &value, &valueLength ); |
| | | * } |
| | | * |
| | | * if( result == JSONSuccess ) |
| | | * { |
| | | * // The pointer "value" will point to a location in the "buffer". |
| | | * char save = value[ valueLength ]; |
| | | * // After saving the character, set it to a null byte for printing. |
| | | * value[ valueLength ] = '\0'; |
| | | * // "Found: bar.foo -> xyz" will be printed. |
| | | * printf( "Found: %s -> %s\n", query, value ); |
| | | * // Restore the original character. |
| | | * value[ valueLength ] = save; |
| | | * } |
| | | * @endcode |
| | | * |
| | | * @note The maximum index value is ~2 billion ( 2^31 - 9 ). |
| | | */ |
| | | /* @[declare_json_search] */ |
| | | #define JSON_Search( buf, max, query, queryLength, outValue, outValueLength ) \ |
| | | JSON_SearchT( buf, max, query, queryLength, outValue, outValueLength, NULL ) |
| | | /* @[declare_json_search] */ |
| | | |
| | | /** |
| | | * @brief The largest value usable as an array index in a query |
| | | * for JSON_Search(), ~2 billion. |
| | | */ |
| | | #define MAX_INDEX_VALUE ( 0x7FFFFFF7 ) /* 2^31 - 9 */ |
| | | |
| | | /** |
| | | * @ingroup json_enum_types |
| | | * @brief Value types from the JSON standard. |
| | | */ |
| | | typedef enum |
| | | { |
| | | JSONInvalid = 0, /**< @brief Not a valid JSON type. */ |
| | | JSONString, /**< @brief A quote delimited sequence of Unicode characters. */ |
| | | JSONNumber, /**< @brief A rational number. */ |
| | | JSONTrue, /**< @brief The literal value true. */ |
| | | JSONFalse, /**< @brief The literal value false. */ |
| | | JSONNull, /**< @brief The literal value null. */ |
| | | JSONObject, /**< @brief A collection of zero or more key-value pairs. */ |
| | | JSONArray /**< @brief A collection of zero or more values. */ |
| | | } JSONTypes_t; |
| | | |
| | | /** |
| | | * @brief Same as JSON_Search(), but also outputs a type for the value found |
| | | * |
| | | * See @ref JSON_Search for documentation of common behavior. |
| | | * |
| | | * @param[in] buf The buffer to search. |
| | | * @param[in] max size of the buffer. |
| | | * @param[in] query The object keys and array indexes to search for. |
| | | * @param[in] queryLength Length of the key. |
| | | * @param[out] outValue A pointer to receive the address of the value found. |
| | | * @param[out] outValueLength A pointer to receive the length of the value found. |
| | | * @param[out] outType An enum indicating the JSON-specific type of the value. |
| | | */ |
| | | /* @[declare_json_searcht] */ |
| | | JSONStatus_t JSON_SearchT( char * buf, |
| | | size_t max, |
| | | const char * query, |
| | | size_t queryLength, |
| | | char ** outValue, |
| | | size_t * outValueLength, |
| | | JSONTypes_t * outType ); |
| | | /* @[declare_json_searcht] */ |
| | | |
| | | /** |
| | | * @brief Same as JSON_SearchT(), but with const qualified buf and outValue arguments. |
| | | * |
| | | * See @ref JSON_Search for documentation of common behavior. |
| | | * |
| | | * @param[in] buf The buffer to search. |
| | | * @param[in] max size of the buffer. |
| | | * @param[in] query The object keys and array indexes to search for. |
| | | * @param[in] queryLength Length of the key. |
| | | * @param[out] outValue A pointer to receive the address of the value found. |
| | | * @param[out] outValueLength A pointer to receive the length of the value found. |
| | | * @param[out] outType An enum indicating the JSON-specific type of the value. |
| | | */ |
| | | /* @[declare_json_searchconst] */ |
| | | JSONStatus_t JSON_SearchConst( const char * buf, |
| | | size_t max, |
| | | const char * query, |
| | | size_t queryLength, |
| | | const char ** outValue, |
| | | size_t * outValueLength, |
| | | JSONTypes_t * outType ); |
| | | /* @[declare_json_searchconst] */ |
| | | |
| | | /** |
| | | * @ingroup json_struct_types |
| | | * @brief Structure to represent a key-value pair. |
| | | */ |
| | | typedef struct |
| | | { |
| | | const char * key; /**< @brief Pointer to the code point sequence for key. */ |
| | | size_t keyLength; /**< @brief Length of the code point sequence for key. */ |
| | | const char * value; /**< @brief Pointer to the code point sequence for value. */ |
| | | size_t valueLength; /**< @brief Length of the code point sequence for value. */ |
| | | JSONTypes_t jsonType; /**< @brief JSON-specific type of the value. */ |
| | | } JSONPair_t; |
| | | |
| | | /** |
| | | * @brief Output the next key-value pair or value from a collection. |
| | | * |
| | | * This function may be used in a loop to output each key-value pair from an object, |
| | | * or each value from an array. For the first invocation, the integers pointed to by |
| | | * start and next should be initialized to 0. These will be updated by the function. |
| | | * If another key-value pair or value is present, the output structure is populated |
| | | * and #JSONSuccess is returned; otherwise the structure is unchanged and #JSONNotFound |
| | | * is returned. |
| | | * |
| | | * @param[in] buf The buffer to search. |
| | | * @param[in] max size of the buffer. |
| | | * @param[in,out] start The index at which the collection begins. |
| | | * @param[in,out] next The index at which to seek the next value. |
| | | * @param[out] outPair A pointer to receive the next key-value pair. |
| | | * |
| | | * @note This function expects a valid JSON document; run JSON_Validate() first. |
| | | * |
| | | * @note For an object, the outPair structure will reference a key and its value. |
| | | * For an array, only the value will be referenced (i.e., outPair.key will be NULL). |
| | | * |
| | | * @return #JSONSuccess if a value is output; |
| | | * #JSONIllegalDocument if the buffer does not contain a collection; |
| | | * #JSONNotFound if there are no further values in the collection. |
| | | * |
| | | * <b>Example</b> |
| | | * @code{c} |
| | | * // Variables used in this example. |
| | | * static char * json_types[] = |
| | | * { |
| | | * "invalid", |
| | | * "string", |
| | | * "number", |
| | | * "true", |
| | | * "false", |
| | | * "null", |
| | | * "object", |
| | | * "array" |
| | | * }; |
| | | * |
| | | * void show( const char * json, |
| | | * size_t length ) |
| | | * { |
| | | * size_t start = 0, next = 0; |
| | | * JSONPair_t pair = { 0 }; |
| | | * JSONStatus_t result; |
| | | * |
| | | * result = JSON_Validate( json, length ); |
| | | * if( result == JSONSuccess ) |
| | | * { |
| | | * result = JSON_Iterate( json, length, &start, &next, &pair ); |
| | | * } |
| | | * |
| | | * while( result == JSONSuccess ) |
| | | * { |
| | | * if( pair.key != NULL ) |
| | | * { |
| | | * printf( "key: %.*s\t", ( int ) pair.keyLength, pair.key ); |
| | | * } |
| | | * |
| | | * printf( "value: (%s) %.*s\n", json_types[ pair.jsonType ], |
| | | * ( int ) pair.valueLength, pair.value ); |
| | | * |
| | | * result = JSON_Iterate( json, length, &start, &next, &pair ); |
| | | * } |
| | | * } |
| | | * @endcode |
| | | */ |
| | | /* @[declare_json_iterate] */ |
| | | JSONStatus_t JSON_Iterate( const char * buf, |
| | | size_t max, |
| | | size_t * start, |
| | | size_t * next, |
| | | JSONPair_t * outPair ); |
| | | /* @[declare_json_iterate] */ |
| | | #endif /* ifndef CORE_JSON_H_ */ |
New file |
| | |
| | | /* |
| | | * dht11.h |
| | | * |
| | | * Created on: Aug 8, 2021 |
| | | * Author: Think |
| | | */ |
| | | |
| | | #ifndef INC_DHT11_H_ |
| | | #define INC_DHT11_H_ |
| | | |
| | | extern int DHT11_SampleData(float *temperature, float *humidity); |
| | | |
| | | #endif /* INC_DHT11_H_ */ |
New file |
| | |
| | | /* |
| | | * ds18b20.h |
| | | * |
| | | * Created on: 2021年8月17日 |
| | | * Author: Think |
| | | */ |
| | | |
| | | #ifndef INC_DS18B20_H_ |
| | | #define INC_DS18B20_H_ |
| | | |
| | | extern int DS18B20_SampleData(float *temperature); |
| | | |
| | | #endif /* INC_DS18B20_H_ */ |
New file |
| | |
| | | /* |
| | | * esp8266.h |
| | | * |
| | | * Created on: 2021年8月25日 |
| | | * Author: Think |
| | | */ |
| | | |
| | | #ifndef SRC_ESP8266_H_ |
| | | #define SRC_ESP8266_H_ |
| | | |
| | | #include <stdio.h> |
| | | |
| | | #define wifi_huart &huart2 /* WiFi模块使用的串口 */ |
| | | #define g_wifi_rxbuf g_uart2_rxbuf /* WiFi 模块的接收buffer */ |
| | | #define g_wifi_rxbytes g_uart2_bytes /* WiFi 模块接收的数据大小 */ |
| | | |
| | | /* 清除WiFi模块接收buffer里的数据内容宏,用宏不用函数是因为函数调用需要额外时间开销 */ |
| | | #define clear_atcmd_buf() do { memset(g_wifi_rxbuf, 0, sizeof(g_wifi_rxbuf)); \ |
| | | g_wifi_rxbytes=0; } while(0) |
| | | |
| | | /* ESP8266 WiFi模块发送AT命令函数。返回值为0表示成功,!0 表示失败 */ |
| | | #define EXPECT_OK "OK\r\n" |
| | | extern int send_atcmd(char *atcmd, char *expect_reply, unsigned int timeout); |
| | | |
| | | /* ESP8266 WiFi模块初始化函数。返回值为0表示成功,!0 表示失败 */ |
| | | extern int esp8266_module_init(void); |
| | | |
| | | /* ESP8266 WiFi模块复位重启函数。返回值为0表示成功,!0 表示失败 */ |
| | | extern int esp8266_module_reset(void); |
| | | |
| | | /* ESP8266 WiFi模块连接路由器函数。返回值为0表示成功,!0 表示失败 */ |
| | | extern int esp8266_join_network(char *ssid, char *pwd); |
| | | |
| | | /* ESP8266 获取自己的IP地址和网关IP地址。返回值为0表示成功,!0 表示失败 */ |
| | | int esp8266_get_ipaddr(char *ipaddr, char *gateway, int ipaddr_size); |
| | | |
| | | /* ESP8266 WiFi模块做ping命令测试网络连通性。返回值为0表示成功,!0 表示失败 */ |
| | | int esp8266_ping_test(char *host); |
| | | |
| | | /* ESP8266 WiFi模块建立TCP socket 连接函数。返回值为0表示成功,!0 表示失败 */ |
| | | extern int esp8266_sock_connect(char *servip, int port); |
| | | |
| | | /* ESP8266 WiFi模块断开TCP socket 连接函数。返回值为0表示成功,!0 表示失败 */ |
| | | extern int esp8266_sock_disconnect(void); |
| | | |
| | | /* ESP8266 WiFi通过TCP Socket发送数据函数。返回值为0表示失败,>0 表示成功发送字节数 */ |
| | | extern int esp8266_sock_send(unsigned char *data, int bytes); |
| | | |
| | | /* ESP8266 WiFi通过TCP Socket接收数据函数。返回值为0无数据,>0 表示接收到数据字节数 */ |
| | | extern int esp8266_sock_recv(unsigned char *buf, int size); |
| | | |
| | | #endif /* SRC_ESP8266_H_ */ |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file gpio.h |
| | | * @brief This file contains all the function prototypes for |
| | | * the gpio.c file |
| | | ****************************************************************************** |
| | | * @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 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | /* Define to prevent recursive inclusion -------------------------------------*/ |
| | | #ifndef __GPIO_H__ |
| | | #define __GPIO_H__ |
| | | |
| | | #ifdef __cplusplus |
| | | extern "C" { |
| | | #endif |
| | | |
| | | /* Includes ------------------------------------------------------------------*/ |
| | | #include "main.h" |
| | | |
| | | /* USER CODE BEGIN Includes */ |
| | | |
| | | /* USER CODE END Includes */ |
| | | |
| | | /* USER CODE BEGIN Private defines */ |
| | | |
| | | /* USER CODE END Private defines */ |
| | | |
| | | void MX_GPIO_Init(void); |
| | | |
| | | /* USER CODE BEGIN Prototypes */ |
| | | |
| | | enum |
| | | { |
| | | SysLed, |
| | | RedLed, |
| | | GreenLed, |
| | | BlueLed, |
| | | LedMax, |
| | | }; |
| | | |
| | | enum |
| | | { |
| | | Relay1, |
| | | Relay2, |
| | | RelayMax, |
| | | }; |
| | | |
| | | #define OFF 0 |
| | | #define ON 1 |
| | | |
| | | typedef struct gpio_s |
| | | { |
| | | const char *name; |
| | | GPIO_TypeDef *group; |
| | | uint16_t pin; |
| | | } gpio_t; |
| | | |
| | | extern gpio_t relays[RelayMax]; |
| | | extern gpio_t leds[LedMax] ; |
| | | |
| | | /* 彿°è¯´æï¿???? æ§å¶LEDï¿????/ççåè½å½æ° |
| | | * åæ°è¯´æï¿???? whichæå®è¦æ§å¶åªä¸ªç¯ï¼åå¼ä¸ºæä¸¾éç RedLedãGreenLedæBlueLed |
| | | * statusè¦æ§å¶ç¯äº®è¿æ¯çï¼åå¼ä¸ºå®å®ï¿???? ON ï¿???? OFF |
| | | * è¿åå¼ï¼ ï¿???? |
| | | */ |
| | | extern void turn_led(int which, int status); |
| | | |
| | | /* 彿°è¯´æï¿???? æ§å¶LEDéªççåè½å½ï¿???? |
| | | * åæ°è¯´æï¿???? whichæå®è¦æ§å¶åªä¸ªç¯ï¼åå¼ä¸ºæä¸¾éç RedLedãGreenLedæBlueLed |
| | | * interval指定闪烁的间隔时间,其单位为毫秒 |
| | | * è¿åå¼ï¼ ï¿???? |
| | | */ |
| | | extern void blink_led(int which, uint32_t interval); |
| | | |
| | | |
| | | extern void sysled_hearbeat(void); |
| | | |
| | | |
| | | extern void turn_relay(int which, int status); |
| | | |
| | | /* USER CODE END Prototypes */ |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | | #endif /*__ GPIO_H__ */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /********************************************************************** |
| | | * Copyright: (C)2021 LingYun IoT System Studio <www.weike-iot.com> |
| | | * Author: GuoWenxue<guowenxue@gmail.com> QQ: 281143292 |
| | | * Description: BearKE1 NB-IoT Board GPIO simulate I2C bus source code |
| | | * |
| | | * ChangeLog: |
| | | * Version Date Author Description |
| | | * V1.0.0 2021.08.10 GuoWenxue Release initial version |
| | | ***********************************************************************/ |
| | | |
| | | #ifndef INC_GPIO_I2C_H_ |
| | | #define INC_GPIO_I2C_H_ |
| | | |
| | | /* I2C Bus ERROR Number */ |
| | | enum |
| | | { |
| | | NO_ERROR = 0x00, // no error |
| | | PARM_ERROR = 0x01, // parameter out of range error |
| | | ACK_ERROR = 0x02, // no acknowledgment error |
| | | CHECKSUM_ERROR = 0x04, // checksum mismatch error |
| | | TIMEOUT_ERROR = 0x08, // timeout error |
| | | BUS_ERROR = 0x10, // bus busy |
| | | }; |
| | | |
| | | enum |
| | | { |
| | | ACK_NONE, /* Without ACK/NAK Reply */ |
| | | ACK, /* Reply with ACK */ |
| | | NAK, /* Reply with NAK */ |
| | | }; |
| | | |
| | | |
| | | extern int I2C_Master_Receive(uint8_t addr, uint8_t *buf, int len); |
| | | |
| | | extern int I2C_Master_Transmit(uint8_t addr, uint8_t *data, int bytes); |
| | | |
| | | #endif /* INC_GPIO_I2C_H_ */ |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file i2c.h |
| | | * @brief This file contains all the function prototypes for |
| | | * the i2c.c file |
| | | ****************************************************************************** |
| | | * @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 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | /* Define to prevent recursive inclusion -------------------------------------*/ |
| | | #ifndef __I2C_H__ |
| | | #define __I2C_H__ |
| | | |
| | | #ifdef __cplusplus |
| | | extern "C" { |
| | | #endif |
| | | |
| | | /* Includes ------------------------------------------------------------------*/ |
| | | #include "main.h" |
| | | |
| | | /* USER CODE BEGIN Includes */ |
| | | |
| | | /* USER CODE END Includes */ |
| | | |
| | | extern I2C_HandleTypeDef hi2c2; |
| | | |
| | | /* USER CODE BEGIN Private defines */ |
| | | |
| | | /* USER CODE END Private defines */ |
| | | |
| | | void MX_I2C2_Init(void); |
| | | |
| | | /* USER CODE BEGIN Prototypes */ |
| | | |
| | | /* USER CODE END Prototypes */ |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | | |
| | | #endif /* __I2C_H__ */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /* 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 "stm32l4xx_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 Key1_Pin GPIO_PIN_13 |
| | | #define Key1_GPIO_Port GPIOC |
| | | #define Key1_EXTI_IRQn EXTI15_10_IRQn |
| | | #define Beep_Pin GPIO_PIN_1 |
| | | #define Beep_GPIO_Port GPIOA |
| | | #define AdcLux_Pin GPIO_PIN_4 |
| | | #define AdcLux_GPIO_Port GPIOA |
| | | #define AdcMic_Pin GPIO_PIN_6 |
| | | #define AdcMic_GPIO_Port GPIOA |
| | | #define Relay1_Pin GPIO_PIN_1 |
| | | #define Relay1_GPIO_Port GPIOB |
| | | #define Key2_Pin GPIO_PIN_15 |
| | | #define Key2_GPIO_Port GPIOA |
| | | #define Key2_EXTI_IRQn EXTI15_10_IRQn |
| | | #define Relay2_Pin GPIO_PIN_3 |
| | | #define Relay2_GPIO_Port GPIOB |
| | | #define SysLed_Pin GPIO_PIN_4 |
| | | #define SysLed_GPIO_Port GPIOB |
| | | #define BlueLed_Pin GPIO_PIN_5 |
| | | #define BlueLed_GPIO_Port GPIOB |
| | | #define RedLed_Pin GPIO_PIN_6 |
| | | #define RedLed_GPIO_Port GPIOB |
| | | #define GreenLed_Pin GPIO_PIN_7 |
| | | #define GreenLed_GPIO_Port GPIOB |
| | | /* USER CODE BEGIN Private defines */ |
| | | |
| | | /* |
| | | * These inlines deal with timer wrapping correctly. You are strongly encouraged to use them |
| | | * 1. Because people otherwise forget |
| | | * 2. Because if the timer wrap changes in future you won't have to alter your driver code. |
| | | * |
| | | * time_after(a,b) returns true if the time a is after time b. |
| | | * |
| | | * Do this with "<0" and ">=0" to only test the sign of the result. A good compiler would generate |
| | | * better code (and a really good compiler wouldn't care). Gcc is currently neither. |
| | | */ |
| | | #define time_after(a,b) ( (int32_t)(b) - (int32_t)(a) < 0 ) |
| | | #define time_before(a,b) time_after(b,a) |
| | | |
| | | #define time_after_eq(a,b) ( (int32_t)(a) - (int32_t)(b) >= 0 ) |
| | | #define time_before_eq(a,b) time_after_eq(b,a) |
| | | |
| | | /* USER CODE END Private defines */ |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | | |
| | | #endif /* __MAIN_H */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /* |
| | | * sht30.h |
| | | * |
| | | * Created on: Aug 9, 2021 |
| | | * Author: Think |
| | | */ |
| | | |
| | | #ifndef INC_SHT30_H_ |
| | | #define INC_SHT30_H_ |
| | | |
| | | #include "stm32l4xx_hal.h" |
| | | |
| | | /* chip 7-bits hardware address */ |
| | | #define SHT30_ADDR 0x44 /* ADDR connected to GND */ |
| | | |
| | | /* I2C protocol communication address */ |
| | | #define SHT30_ADDR_WR (SHT30_ADDR<<1) /* address bit[0]=0 is write */ |
| | | #define SHT30_ADDR_RD ((SHT30_ADDR<<1) | 0x01) /* address bit[0]=1 is read */ |
| | | |
| | | #define SHT30_DATA_SIZE 6 /* 2B temperature + 1B CRC, 2B humidity + 1B CRC */ |
| | | |
| | | typedef enum |
| | | { |
| | | /* Soft reset command */ |
| | | SOFT_RESET_CMD = 0x30A2, |
| | | |
| | | /* Measurement Commands for Single Shot Data Acquisition Mode: |
| | | * Repeatability (low,medium and high) and clock stretching (enabled ordisabled) |
| | | */ |
| | | HIGH_ENABLED_CMD = 0x2C06, |
| | | MEDIUM_ENABLED_CMD = 0x2C0D, |
| | | LOW_ENABLED_CMD = 0x2C10, |
| | | HIGH_DISABLED_CMD = 0x2400, |
| | | MEDIUM_DISABLED_CMD = 0x240B, |
| | | LOW_DISABLED_CMD = 0x2416, |
| | | |
| | | /* Measurement Commands for Periodic Data Acquisition Mode |
| | | * Data acquisition frequency: 0.5, 1, 2, 4 & 10 measurements per second, mps |
| | | */ |
| | | HIGH_0_5_CMD = 0x2032, |
| | | MEDIUM_0_5_CMD = 0x2024, |
| | | LOW_0_5_CMD = 0x202F, |
| | | HIGH_1_CMD = 0x2130, |
| | | MEDIUM_1_CMD = 0x2126, |
| | | LOW_1_CMD = 0x212D, |
| | | HIGH_2_CMD = 0x2236, |
| | | MEDIUM_2_CMD = 0x2220, |
| | | LOW_2_CMD = 0x222B, |
| | | HIGH_4_CMD = 0x2334, |
| | | MEDIUM_4_CMD = 0x2322, |
| | | LOW_4_CMD = 0x2329, |
| | | HIGH_10_CMD = 0x2737, |
| | | MEDIUM_10_CMD = 0x2721, |
| | | LOW_10_CMD = 0x272A, |
| | | |
| | | /* Readout of Measurement Results for Periodic Mode */ |
| | | READOUT_FOR_PERIODIC_MODE = 0xE000, |
| | | } SHT30_CMD; |
| | | |
| | | |
| | | extern int SHT30_SampleData(float *temperature, float *humidity); |
| | | |
| | | |
| | | #endif /* INC_SHT30_H_ */ |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file stm32l4xx_hal_conf.h |
| | | * @author MCD Application Team |
| | | * @brief HAL configuration template file. |
| | | * This file should be copied to the application folder and renamed |
| | | * to stm32l4xx_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 STM32L4xx_HAL_CONF_H |
| | | #define STM32L4xx_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_COMP_MODULE_ENABLED */ |
| | | /*#define HAL_CRC_MODULE_ENABLED */ |
| | | /*#define HAL_CRYP_MODULE_ENABLED */ |
| | | /*#define HAL_DAC_MODULE_ENABLED */ |
| | | /*#define HAL_DCMI_MODULE_ENABLED */ |
| | | /*#define HAL_DMA2D_MODULE_ENABLED */ |
| | | /*#define HAL_DFSDM_MODULE_ENABLED */ |
| | | /*#define HAL_DSI_MODULE_ENABLED */ |
| | | /*#define HAL_FIREWALL_MODULE_ENABLED */ |
| | | /*#define HAL_GFXMMU_MODULE_ENABLED */ |
| | | /*#define HAL_HCD_MODULE_ENABLED */ |
| | | /*#define HAL_HASH_MODULE_ENABLED */ |
| | | /*#define HAL_I2S_MODULE_ENABLED */ |
| | | /*#define HAL_IRDA_MODULE_ENABLED */ |
| | | /*#define HAL_IWDG_MODULE_ENABLED */ |
| | | /*#define HAL_LTDC_MODULE_ENABLED */ |
| | | /*#define HAL_LCD_MODULE_ENABLED */ |
| | | /*#define HAL_LPTIM_MODULE_ENABLED */ |
| | | /*#define HAL_MMC_MODULE_ENABLED */ |
| | | /*#define HAL_NAND_MODULE_ENABLED */ |
| | | /*#define HAL_NOR_MODULE_ENABLED */ |
| | | /*#define HAL_OPAMP_MODULE_ENABLED */ |
| | | /*#define HAL_OSPI_MODULE_ENABLED */ |
| | | /*#define HAL_OSPI_MODULE_ENABLED */ |
| | | /*#define HAL_PCD_MODULE_ENABLED */ |
| | | /*#define HAL_PKA_MODULE_ENABLED */ |
| | | /*#define HAL_QSPI_MODULE_ENABLED */ |
| | | /*#define HAL_QSPI_MODULE_ENABLED */ |
| | | /*#define HAL_RNG_MODULE_ENABLED */ |
| | | /*#define HAL_RTC_MODULE_ENABLED */ |
| | | /*#define HAL_SAI_MODULE_ENABLED */ |
| | | /*#define HAL_SD_MODULE_ENABLED */ |
| | | /*#define HAL_SMBUS_MODULE_ENABLED */ |
| | | /*#define HAL_SMARTCARD_MODULE_ENABLED */ |
| | | /*#define HAL_SPI_MODULE_ENABLED */ |
| | | /*#define HAL_SRAM_MODULE_ENABLED */ |
| | | /*#define HAL_SWPMI_MODULE_ENABLED */ |
| | | #define HAL_TIM_MODULE_ENABLED |
| | | /*#define HAL_TSC_MODULE_ENABLED */ |
| | | #define HAL_UART_MODULE_ENABLED |
| | | /*#define HAL_USART_MODULE_ENABLED */ |
| | | /*#define HAL_WWDG_MODULE_ENABLED */ |
| | | /*#define HAL_EXTI_MODULE_ENABLED */ |
| | | /*#define HAL_PSSI_MODULE_ENABLED */ |
| | | #define HAL_GPIO_MODULE_ENABLED |
| | | #define HAL_EXTI_MODULE_ENABLED |
| | | #define HAL_I2C_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)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 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)4000000U) /*!< 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)16000000U) /*!< Value of the Internal oscillator in Hz*/ |
| | | #endif /* HSI_VALUE */ |
| | | |
| | | /** |
| | | * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. |
| | | * This internal oscillator is mainly dedicated to provide a high precision clock to |
| | | * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. |
| | | * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency |
| | | * which is subject to manufacturing process variations. |
| | | */ |
| | | #if !defined (HSI48_VALUE) |
| | | #define HSI48_VALUE ((uint32_t)48000000U) /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. |
| | | The real value my vary depending on manufacturing process variations.*/ |
| | | #endif /* HSI48_VALUE */ |
| | | |
| | | /** |
| | | * @brief Internal Low Speed oscillator (LSI) value. |
| | | */ |
| | | #if !defined (LSI_VALUE) |
| | | #define LSI_VALUE 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. |
| | | * This value is used by the UART, RTC HAL module to compute the system frequency |
| | | */ |
| | | #if !defined (LSE_VALUE) |
| | | #define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/ |
| | | #endif /* LSE_VALUE */ |
| | | |
| | | #if !defined (LSE_STARTUP_TIMEOUT) |
| | | #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ |
| | | #endif /* HSE_STARTUP_TIMEOUT */ |
| | | |
| | | /** |
| | | * @brief External clock source for SAI1 peripheral |
| | | * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source |
| | | * frequency. |
| | | */ |
| | | #if !defined (EXTERNAL_SAI1_CLOCK_VALUE) |
| | | #define EXTERNAL_SAI1_CLOCK_VALUE 2097000U /*!< Value of the SAI1 External clock source in Hz*/ |
| | | #endif /* EXTERNAL_SAI1_CLOCK_VALUE */ |
| | | |
| | | /** |
| | | * @brief External clock source for SAI2 peripheral |
| | | * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source |
| | | * frequency. |
| | | */ |
| | | #if !defined (EXTERNAL_SAI2_CLOCK_VALUE) |
| | | #define EXTERNAL_SAI2_CLOCK_VALUE 48000U /*!< Value of the SAI2 External clock source in Hz*/ |
| | | #endif /* EXTERNAL_SAI2_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 3300U /*!< Value of VDD in mv */ |
| | | #define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */ |
| | | #define USE_RTOS 0U |
| | | #define PREFETCH_ENABLE 0U |
| | | #define INSTRUCTION_CACHE_ENABLE 1U |
| | | #define DATA_CACHE_ENABLE 1U |
| | | |
| | | /* ########################## 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 stm32l4xx_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_CAN_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_COMP_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_CRYP_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_DAC_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_DCMI_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_DSI_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_GFXMMU_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_HASH_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_HCD_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_I2C_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_IRDA_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_LTDC_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_MMC_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_OSPI_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_PCD_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_QSPI_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_RNG_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_RTC_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_SAI_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_SD_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_SPI_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_SWPMI_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_TIM_REGISTER_CALLBACKS 0U |
| | | #define USE_HAL_TSC_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 "stm32l4xx_hal_rcc.h" |
| | | #endif /* HAL_RCC_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_GPIO_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_gpio.h" |
| | | #endif /* HAL_GPIO_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_DMA_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_dma.h" |
| | | #endif /* HAL_DMA_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_DFSDM_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_dfsdm.h" |
| | | #endif /* HAL_DFSDM_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_CORTEX_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_cortex.h" |
| | | #endif /* HAL_CORTEX_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_ADC_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_adc.h" |
| | | #endif /* HAL_ADC_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_CAN_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_can.h" |
| | | #endif /* HAL_CAN_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_CAN_LEGACY_MODULE_ENABLED |
| | | #include "Legacy/stm32l4xx_hal_can_legacy.h" |
| | | #endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_COMP_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_comp.h" |
| | | #endif /* HAL_COMP_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_CRC_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_crc.h" |
| | | #endif /* HAL_CRC_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_CRYP_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_cryp.h" |
| | | #endif /* HAL_CRYP_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_DAC_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_dac.h" |
| | | #endif /* HAL_DAC_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_DCMI_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_dcmi.h" |
| | | #endif /* HAL_DCMI_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_DMA2D_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_dma2d.h" |
| | | #endif /* HAL_DMA2D_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_DSI_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_dsi.h" |
| | | #endif /* HAL_DSI_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_EXTI_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_exti.h" |
| | | #endif /* HAL_EXTI_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_GFXMMU_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_gfxmmu.h" |
| | | #endif /* HAL_GFXMMU_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_FIREWALL_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_firewall.h" |
| | | #endif /* HAL_FIREWALL_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_FLASH_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_flash.h" |
| | | #endif /* HAL_FLASH_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_HASH_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_hash.h" |
| | | #endif /* HAL_HASH_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_HCD_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_hcd.h" |
| | | #endif /* HAL_HCD_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_I2C_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_i2c.h" |
| | | #endif /* HAL_I2C_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_IRDA_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_irda.h" |
| | | #endif /* HAL_IRDA_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_IWDG_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_iwdg.h" |
| | | #endif /* HAL_IWDG_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_LCD_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_lcd.h" |
| | | #endif /* HAL_LCD_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_LPTIM_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_lptim.h" |
| | | #endif /* HAL_LPTIM_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_LTDC_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_ltdc.h" |
| | | #endif /* HAL_LTDC_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_MMC_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_mmc.h" |
| | | #endif /* HAL_MMC_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_NAND_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_nand.h" |
| | | #endif /* HAL_NAND_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_NOR_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_nor.h" |
| | | #endif /* HAL_NOR_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_OPAMP_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_opamp.h" |
| | | #endif /* HAL_OPAMP_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_OSPI_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_ospi.h" |
| | | #endif /* HAL_OSPI_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_PCD_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_pcd.h" |
| | | #endif /* HAL_PCD_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_PKA_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_pka.h" |
| | | #endif /* HAL_PKA_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_PSSI_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_pssi.h" |
| | | #endif /* HAL_PSSI_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_PWR_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_pwr.h" |
| | | #endif /* HAL_PWR_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_QSPI_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_qspi.h" |
| | | #endif /* HAL_QSPI_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_RNG_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_rng.h" |
| | | #endif /* HAL_RNG_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_RTC_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_rtc.h" |
| | | #endif /* HAL_RTC_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_SAI_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_sai.h" |
| | | #endif /* HAL_SAI_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_SD_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_sd.h" |
| | | #endif /* HAL_SD_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_SMARTCARD_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_smartcard.h" |
| | | #endif /* HAL_SMARTCARD_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_SMBUS_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_smbus.h" |
| | | #endif /* HAL_SMBUS_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_SPI_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_spi.h" |
| | | #endif /* HAL_SPI_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_SRAM_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_sram.h" |
| | | #endif /* HAL_SRAM_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_SWPMI_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_swpmi.h" |
| | | #endif /* HAL_SWPMI_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_TIM_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_tim.h" |
| | | #endif /* HAL_TIM_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_TSC_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_tsc.h" |
| | | #endif /* HAL_TSC_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_UART_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_uart.h" |
| | | #endif /* HAL_UART_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_USART_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_usart.h" |
| | | #endif /* HAL_USART_MODULE_ENABLED */ |
| | | |
| | | #ifdef HAL_WWDG_MODULE_ENABLED |
| | | #include "stm32l4xx_hal_wwdg.h" |
| | | #endif /* HAL_WWDG_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 /* STM32L4xx_HAL_CONF_H */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /* USER CODE BEGIN Header */ |
| | | /** |
| | | ****************************************************************************** |
| | | * @file stm32l4xx_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 __STM32L4xx_IT_H |
| | | #define __STM32L4xx_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 USART1_IRQHandler(void); |
| | | void USART2_IRQHandler(void); |
| | | void EXTI15_10_IRQHandler(void); |
| | | /* USER CODE BEGIN EFP */ |
| | | |
| | | /* USER CODE END EFP */ |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | | |
| | | #endif /* __STM32L4xx_IT_H */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file tim.h |
| | | * @brief This file contains all the function prototypes for |
| | | * the tim.c file |
| | | ****************************************************************************** |
| | | * @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 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | /* Define to prevent recursive inclusion -------------------------------------*/ |
| | | #ifndef __TIM_H__ |
| | | #define __TIM_H__ |
| | | |
| | | #ifdef __cplusplus |
| | | extern "C" { |
| | | #endif |
| | | |
| | | /* Includes ------------------------------------------------------------------*/ |
| | | #include "main.h" |
| | | |
| | | /* USER CODE BEGIN Includes */ |
| | | |
| | | /* USER CODE END Includes */ |
| | | |
| | | extern TIM_HandleTypeDef htim2; |
| | | extern TIM_HandleTypeDef htim6; |
| | | |
| | | /* USER CODE BEGIN Private defines */ |
| | | |
| | | /* USER CODE END Private defines */ |
| | | |
| | | void MX_TIM2_Init(void); |
| | | void MX_TIM6_Init(void); |
| | | |
| | | void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); |
| | | |
| | | /* USER CODE BEGIN Prototypes */ |
| | | |
| | | extern void delay_us(uint16_t us); /* us max to 60000 */ |
| | | |
| | | extern void beep_start(uint8_t times, uint16_t interval); |
| | | |
| | | /* USER CODE END Prototypes */ |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | | |
| | | #endif /* __TIM_H__ */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file usart.h |
| | | * @brief This file contains all the function prototypes for |
| | | * the usart.c file |
| | | ****************************************************************************** |
| | | * @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 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | /* Define to prevent recursive inclusion -------------------------------------*/ |
| | | #ifndef __USART_H__ |
| | | #define __USART_H__ |
| | | |
| | | #ifdef __cplusplus |
| | | extern "C" { |
| | | #endif |
| | | |
| | | /* Includes ------------------------------------------------------------------*/ |
| | | #include "main.h" |
| | | |
| | | /* USER CODE BEGIN Includes */ |
| | | #include <stdio.h> |
| | | #include <string.h> |
| | | /* USER CODE END Includes */ |
| | | |
| | | extern UART_HandleTypeDef huart1; |
| | | extern UART_HandleTypeDef huart2; |
| | | |
| | | /* USER CODE BEGIN Private defines */ |
| | | extern char g_uart1_rxbuf[256]; |
| | | extern uint8_t g_uart1_bytes; |
| | | |
| | | #define clear_uart1_rxbuf() do { memset(g_uart1_rxbuf, 0, sizeof(g_uart1_rxbuf)); g_uart1_bytes=0; } while(0) |
| | | |
| | | extern char g_uart2_rxbuf[256]; |
| | | extern uint8_t g_uart2_bytes; |
| | | |
| | | #define clear_uart2_rxbuf() do { memset(g_uart2_rxbuf, 0, sizeof(g_uart2_rxbuf)); g_uart2_bytes=0; } while(0) |
| | | |
| | | /* USER CODE END Private defines */ |
| | | |
| | | void MX_USART1_UART_Init(void); |
| | | void MX_USART2_UART_Init(void); |
| | | |
| | | /* USER CODE BEGIN Prototypes */ |
| | | |
| | | /* USER CODE END Prototypes */ |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | | |
| | | #endif /* __USART_H__ */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file adc.c |
| | | * @brief This file provides code for the configuration |
| | | * of the ADC instances. |
| | | ****************************************************************************** |
| | | * @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 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | |
| | | /* Includes ------------------------------------------------------------------*/ |
| | | #include "adc.h" |
| | | |
| | | /* USER CODE BEGIN 0 */ |
| | | |
| | | /* USER CODE END 0 */ |
| | | |
| | | ADC_HandleTypeDef hadc1; |
| | | |
| | | /* ADC1 init function */ |
| | | void MX_ADC1_Init(void) |
| | | { |
| | | |
| | | /* USER CODE BEGIN ADC1_Init 0 */ |
| | | |
| | | /* USER CODE END ADC1_Init 0 */ |
| | | |
| | | ADC_ChannelConfTypeDef sConfig = {0}; |
| | | |
| | | /* USER CODE BEGIN ADC1_Init 1 */ |
| | | |
| | | /* USER CODE END ADC1_Init 1 */ |
| | | /** Common config |
| | | */ |
| | | hadc1.Instance = ADC1; |
| | | hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; |
| | | hadc1.Init.Resolution = ADC_RESOLUTION_12B; |
| | | hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; |
| | | hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE; |
| | | hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; |
| | | hadc1.Init.LowPowerAutoWait = DISABLE; |
| | | hadc1.Init.ContinuousConvMode = ENABLE; |
| | | hadc1.Init.NbrOfConversion = 2; |
| | | hadc1.Init.DiscontinuousConvMode = DISABLE; |
| | | hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; |
| | | hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; |
| | | hadc1.Init.DMAContinuousRequests = DISABLE; |
| | | hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; |
| | | hadc1.Init.OversamplingMode = DISABLE; |
| | | if (HAL_ADC_Init(&hadc1) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | /** Configure Regular Channel |
| | | */ |
| | | sConfig.Channel = ADC_CHANNEL_9; |
| | | sConfig.Rank = ADC_REGULAR_RANK_1; |
| | | sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; |
| | | sConfig.SingleDiff = ADC_SINGLE_ENDED; |
| | | sConfig.OffsetNumber = ADC_OFFSET_NONE; |
| | | sConfig.Offset = 0; |
| | | if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | /** Configure Regular Channel |
| | | */ |
| | | sConfig.Channel = ADC_CHANNEL_11; |
| | | sConfig.Rank = ADC_REGULAR_RANK_2; |
| | | if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | /* USER CODE BEGIN ADC1_Init 2 */ |
| | | |
| | | /* USER CODE END ADC1_Init 2 */ |
| | | |
| | | } |
| | | |
| | | void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) |
| | | { |
| | | |
| | | GPIO_InitTypeDef GPIO_InitStruct = {0}; |
| | | RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; |
| | | if(adcHandle->Instance==ADC1) |
| | | { |
| | | /* USER CODE BEGIN ADC1_MspInit 0 */ |
| | | |
| | | /* USER CODE END ADC1_MspInit 0 */ |
| | | /** Initializes the peripherals clock |
| | | */ |
| | | PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC; |
| | | PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI1; |
| | | PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_HSE; |
| | | PeriphClkInit.PLLSAI1.PLLSAI1M = 1; |
| | | PeriphClkInit.PLLSAI1.PLLSAI1N = 9; |
| | | PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7; |
| | | PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2; |
| | | PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV6; |
| | | PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_ADC1CLK; |
| | | if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | |
| | | /* ADC1 clock enable */ |
| | | __HAL_RCC_ADC_CLK_ENABLE(); |
| | | |
| | | __HAL_RCC_GPIOA_CLK_ENABLE(); |
| | | /**ADC1 GPIO Configuration |
| | | PA4 ------> ADC1_IN9 |
| | | PA6 ------> ADC1_IN11 |
| | | */ |
| | | GPIO_InitStruct.Pin = AdcLux_Pin|AdcMic_Pin; |
| | | GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL; |
| | | GPIO_InitStruct.Pull = GPIO_NOPULL; |
| | | HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |
| | | |
| | | /* USER CODE BEGIN ADC1_MspInit 1 */ |
| | | |
| | | /* USER CODE END ADC1_MspInit 1 */ |
| | | } |
| | | } |
| | | |
| | | void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) |
| | | { |
| | | |
| | | if(adcHandle->Instance==ADC1) |
| | | { |
| | | /* USER CODE BEGIN ADC1_MspDeInit 0 */ |
| | | |
| | | /* USER CODE END ADC1_MspDeInit 0 */ |
| | | /* Peripheral clock disable */ |
| | | __HAL_RCC_ADC_CLK_DISABLE(); |
| | | |
| | | /**ADC1 GPIO Configuration |
| | | PA4 ------> ADC1_IN9 |
| | | PA6 ------> ADC1_IN11 |
| | | */ |
| | | HAL_GPIO_DeInit(GPIOA, AdcLux_Pin|AdcMic_Pin); |
| | | |
| | | /* USER CODE BEGIN ADC1_MspDeInit 1 */ |
| | | |
| | | /* USER CODE END ADC1_MspDeInit 1 */ |
| | | } |
| | | } |
| | | |
| | | /* USER CODE BEGIN 1 */ |
| | | |
| | | enum |
| | | { |
| | | ADCCHN_NOISY, |
| | | ADCCHN_LUX, |
| | | ADCCHN_MAX, |
| | | }; |
| | | |
| | | int adc_sample_lux_noisy(uint32_t *lux, uint32_t *noisy) |
| | | { |
| | | uint8_t i; |
| | | uint32_t timeout = 0xffffff; |
| | | |
| | | for(i=0; i<ADCCHN_MAX; i++) |
| | | { |
| | | HAL_ADC_Start(&hadc1); |
| | | |
| | | HAL_ADC_PollForConversion(&hadc1, timeout); |
| | | |
| | | if( ADCCHN_NOISY == i ) |
| | | { |
| | | *noisy = HAL_ADC_GetValue(&hadc1); |
| | | } |
| | | else if( ADCCHN_LUX == i ) |
| | | { |
| | | *lux = HAL_ADC_GetValue(&hadc1); |
| | | } |
| | | |
| | | HAL_Delay(10); |
| | | } |
| | | |
| | | HAL_ADC_Stop(&hadc1); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | /* USER CODE END 1 */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /* |
| | | * coreJSON v3.0.0 |
| | | * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
| | | * |
| | | * Permission is hereby granted, free of charge, to any person obtaining a copy of |
| | | * this software and associated documentation files (the "Software"), to deal in |
| | | * the Software without restriction, including without limitation the rights to |
| | | * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
| | | * the Software, and to permit persons to whom the Software is furnished to do so, |
| | | * subject to the following conditions: |
| | | * |
| | | * The above copyright notice and this permission notice shall be included in all |
| | | * copies or substantial portions of the Software. |
| | | * |
| | | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| | | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |
| | | * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
| | | * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
| | | * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| | | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| | | */ |
| | | |
| | | /** |
| | | * @file core_json.c |
| | | * @brief The source file that implements the user-facing functions in core_json.h. |
| | | */ |
| | | |
| | | #include <assert.h> |
| | | #include <stddef.h> |
| | | #include <stdint.h> |
| | | #include "core_json.h" |
| | | |
| | | /** @cond DO_NOT_DOCUMENT */ |
| | | |
| | | /* A compromise to satisfy both MISRA and CBMC */ |
| | | typedef union |
| | | { |
| | | char c; |
| | | uint8_t u; |
| | | } char_; |
| | | |
| | | #define isdigit_( x ) ( ( ( x ) >= '0' ) && ( ( x ) <= '9' ) ) |
| | | #define iscntrl_( x ) ( ( ( x ) >= '\0' ) && ( ( x ) < ' ' ) ) |
| | | /* NB. This is whitespace as defined by the JSON standard (ECMA-404). */ |
| | | #define isspace_( x ) \ |
| | | ( ( ( x ) == ' ' ) || ( ( x ) == '\t' ) || \ |
| | | ( ( x ) == '\n' ) || ( ( x ) == '\r' ) ) |
| | | |
| | | #define isOpenBracket_( x ) ( ( ( x ) == '{' ) || ( ( x ) == '[' ) ) |
| | | #define isCloseBracket_( x ) ( ( ( x ) == '}' ) || ( ( x ) == ']' ) ) |
| | | #define isCurlyPair_( x, y ) ( ( ( x ) == '{' ) && ( ( y ) == '}' ) ) |
| | | #define isSquarePair_( x, y ) ( ( ( x ) == '[' ) && ( ( y ) == ']' ) ) |
| | | #define isMatchingBracket_( x, y ) ( isCurlyPair_( x, y ) || isSquarePair_( x, y ) ) |
| | | #define isSquareOpen_( x ) ( ( x ) == '[' ) |
| | | #define isSquareClose_( x ) ( ( x ) == ']' ) |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond whitespace. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | */ |
| | | static void skipSpace( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | size_t i; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | for( i = *start; i < max; i++ ) |
| | | { |
| | | if( !isspace_( buf[ i ] ) ) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | *start = i; |
| | | } |
| | | |
| | | /** |
| | | * @brief Count the leading 1s in a byte. |
| | | * |
| | | * The high-order 1 bits of the first byte in a UTF-8 encoding |
| | | * indicate the number of additional bytes to follow. |
| | | * |
| | | * @return the count |
| | | */ |
| | | static size_t countHighBits( uint8_t c ) |
| | | { |
| | | uint8_t n = c; |
| | | size_t i = 0; |
| | | |
| | | while( ( n & 0x80U ) != 0U ) |
| | | { |
| | | i++; |
| | | n = ( n & 0x7FU ) << 1U; |
| | | } |
| | | |
| | | return i; |
| | | } |
| | | |
| | | /** |
| | | * @brief Is the value a legal Unicode code point and encoded with |
| | | * the fewest bytes? |
| | | * |
| | | * The last Unicode code point is 0x10FFFF. |
| | | * |
| | | * Unicode 3.1 disallows UTF-8 interpretation of non-shortest form sequences. |
| | | * 1 byte encodes 0 through 7 bits |
| | | * 2 bytes encode 8 through 5+6 = 11 bits |
| | | * 3 bytes encode 12 through 4+6+6 = 16 bits |
| | | * 4 bytes encode 17 through 3+6+6+6 = 21 bits |
| | | * |
| | | * Unicode 3.2 disallows UTF-8 code point values in the surrogate range, |
| | | * [U+D800 to U+DFFF]. |
| | | * |
| | | * @note Disallow ASCII, as this is called only for multibyte sequences. |
| | | */ |
| | | static bool shortestUTF8( size_t length, |
| | | uint32_t value ) |
| | | { |
| | | bool ret = false; |
| | | uint32_t min, max; |
| | | |
| | | assert( ( length >= 2U ) && ( length <= 4U ) ); |
| | | |
| | | switch( length ) |
| | | { |
| | | case 2: |
| | | min = ( uint32_t ) 1 << 7U; |
| | | max = ( ( uint32_t ) 1 << 11U ) - 1U; |
| | | break; |
| | | |
| | | case 3: |
| | | min = ( uint32_t ) 1 << 11U; |
| | | max = ( ( uint32_t ) 1 << 16U ) - 1U; |
| | | break; |
| | | |
| | | default: |
| | | min = ( uint32_t ) 1 << 16U; |
| | | max = 0x10FFFFU; |
| | | break; |
| | | } |
| | | |
| | | if( ( value >= min ) && ( value <= max ) && |
| | | ( ( value < 0xD800U ) || ( value > 0xDFFFU ) ) ) |
| | | { |
| | | ret = true; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond a UTF-8 code point. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * @return true if a valid code point was present; |
| | | * false otherwise. |
| | | * |
| | | * 00–7F Single-byte character |
| | | * 80–BF Trailing byte |
| | | * C0–DF Leading byte of two-byte character |
| | | * E0–EF Leading byte of three-byte character |
| | | * F0–F7 Leading byte of four-byte character |
| | | * F8–FB Illegal (formerly leading byte of five-byte character) |
| | | * FC–FD Illegal (formerly leading byte of six-byte character) |
| | | * FE–FF Illegal |
| | | * |
| | | * The octet values C0, C1, and F5 to FF are illegal, since C0 and C1 |
| | | * would introduce a non-shortest sequence, and F5 or above would |
| | | * introduce a value greater than the last code point, 0x10FFFF. |
| | | */ |
| | | static bool skipUTF8MultiByte( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | bool ret = false; |
| | | size_t i, bitCount, j; |
| | | uint32_t value = 0; |
| | | char_ c; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | i = *start; |
| | | assert( i < max ); |
| | | assert( buf[ i ] < '\0' ); |
| | | |
| | | c.c = buf[ i ]; |
| | | |
| | | if( ( c.u > 0xC1U ) && ( c.u < 0xF5U ) ) |
| | | { |
| | | bitCount = countHighBits( c.u ); |
| | | value = ( ( uint32_t ) c.u ) & ( ( ( uint32_t ) 1 << ( 7U - bitCount ) ) - 1U ); |
| | | |
| | | /* The bit count is 1 greater than the number of bytes, |
| | | * e.g., when j is 2, we skip one more byte. */ |
| | | for( j = bitCount - 1U; j > 0U; j-- ) |
| | | { |
| | | i++; |
| | | |
| | | if( i >= max ) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | c.c = buf[ i ]; |
| | | |
| | | /* Additional bytes must match 10xxxxxx. */ |
| | | if( ( c.u & 0xC0U ) != 0x80U ) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | value = ( value << 6U ) | ( c.u & 0x3FU ); |
| | | } |
| | | |
| | | if( ( j == 0U ) && ( shortestUTF8( bitCount, value ) == true ) ) |
| | | { |
| | | *start = i + 1U; |
| | | ret = true; |
| | | } |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond an ASCII or UTF-8 code point. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * @return true if a valid code point was present; |
| | | * false otherwise. |
| | | */ |
| | | static bool skipUTF8( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | bool ret = false; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | if( *start < max ) |
| | | { |
| | | /* an ASCII byte */ |
| | | if( buf[ *start ] >= '\0' ) |
| | | { |
| | | *start += 1U; |
| | | ret = true; |
| | | } |
| | | else |
| | | { |
| | | ret = skipUTF8MultiByte( buf, start, max ); |
| | | } |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Convert a hexadecimal character to an integer. |
| | | * |
| | | * @param[in] c The character to convert. |
| | | * |
| | | * @return the integer value upon success or NOT_A_HEX_CHAR on failure. |
| | | */ |
| | | #define NOT_A_HEX_CHAR ( 0x10U ) |
| | | static uint8_t hexToInt( char c ) |
| | | { |
| | | char_ n; |
| | | |
| | | n.c = c; |
| | | |
| | | if( ( c >= 'a' ) && ( c <= 'f' ) ) |
| | | { |
| | | n.c -= 'a'; |
| | | n.u += 10U; |
| | | } |
| | | else if( ( c >= 'A' ) && ( c <= 'F' ) ) |
| | | { |
| | | n.c -= 'A'; |
| | | n.u += 10U; |
| | | } |
| | | else if( isdigit_( c ) ) |
| | | { |
| | | n.c -= '0'; |
| | | } |
| | | else |
| | | { |
| | | n.u = NOT_A_HEX_CHAR; |
| | | } |
| | | |
| | | return n.u; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond a single \u Unicode |
| | | * escape sequence and output the value. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * @param[out] outValue The value of the hex digits. |
| | | * |
| | | * @return true if a valid escape sequence was present; |
| | | * false otherwise. |
| | | * |
| | | * @note For the sake of security, \u0000 is disallowed. |
| | | */ |
| | | static bool skipOneHexEscape( const char * buf, |
| | | size_t * start, |
| | | size_t max, |
| | | uint16_t * outValue ) |
| | | { |
| | | bool ret = false; |
| | | size_t i, end; |
| | | uint16_t value = 0; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | assert( outValue != NULL ); |
| | | |
| | | i = *start; |
| | | #define HEX_ESCAPE_LENGTH ( 6U ) /* e.g., \u1234 */ |
| | | end = i + HEX_ESCAPE_LENGTH; |
| | | |
| | | if( ( end < max ) && ( buf[ i ] == '\\' ) && ( buf[ i + 1U ] == 'u' ) ) |
| | | { |
| | | for( i += 2U; i < end; i++ ) |
| | | { |
| | | uint8_t n = hexToInt( buf[ i ] ); |
| | | |
| | | if( n == NOT_A_HEX_CHAR ) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | value = ( value << 4U ) | n; |
| | | } |
| | | } |
| | | |
| | | if( ( i == end ) && ( value > 0U ) ) |
| | | { |
| | | ret = true; |
| | | *outValue = value; |
| | | *start = i; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond one or a pair of \u Unicode escape sequences. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * Surrogate pairs are two escape sequences that together denote |
| | | * a code point outside the Basic Multilingual Plane. They must |
| | | * occur as a pair with the first "high" value in [U+D800, U+DBFF], |
| | | * and the second "low" value in [U+DC00, U+DFFF]. |
| | | * |
| | | * @return true if a valid escape sequence was present; |
| | | * false otherwise. |
| | | * |
| | | * @note For the sake of security, \u0000 is disallowed. |
| | | */ |
| | | #define isHighSurrogate( x ) ( ( ( x ) >= 0xD800U ) && ( ( x ) <= 0xDBFFU ) ) |
| | | #define isLowSurrogate( x ) ( ( ( x ) >= 0xDC00U ) && ( ( x ) <= 0xDFFFU ) ) |
| | | |
| | | static bool skipHexEscape( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | bool ret = false; |
| | | size_t i; |
| | | uint16_t value; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | i = *start; |
| | | |
| | | if( skipOneHexEscape( buf, &i, max, &value ) == true ) |
| | | { |
| | | if( isHighSurrogate( value ) ) |
| | | { |
| | | if( ( skipOneHexEscape( buf, &i, max, &value ) == true ) && |
| | | ( isLowSurrogate( value ) ) ) |
| | | { |
| | | ret = true; |
| | | } |
| | | } |
| | | else if( isLowSurrogate( value ) ) |
| | | { |
| | | /* premature low surrogate */ |
| | | } |
| | | else |
| | | { |
| | | ret = true; |
| | | } |
| | | } |
| | | |
| | | if( ret == true ) |
| | | { |
| | | *start = i; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond an escape sequence. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * @return true if a valid escape sequence was present; |
| | | * false otherwise. |
| | | * |
| | | * @note For the sake of security, \NUL is disallowed. |
| | | */ |
| | | static bool skipEscape( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | bool ret = false; |
| | | size_t i; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | i = *start; |
| | | |
| | | if( ( i < ( max - 1U ) ) && ( buf[ i ] == '\\' ) ) |
| | | { |
| | | char c = buf[ i + 1U ]; |
| | | |
| | | switch( c ) |
| | | { |
| | | case '\0': |
| | | break; |
| | | |
| | | case 'u': |
| | | ret = skipHexEscape( buf, &i, max ); |
| | | break; |
| | | |
| | | case '"': |
| | | case '\\': |
| | | case '/': |
| | | case 'b': |
| | | case 'f': |
| | | case 'n': |
| | | case 'r': |
| | | case 't': |
| | | i += 2U; |
| | | ret = true; |
| | | break; |
| | | |
| | | default: |
| | | |
| | | /* a control character: (NUL,SPACE) */ |
| | | if( iscntrl_( c ) ) |
| | | { |
| | | i += 2U; |
| | | ret = true; |
| | | } |
| | | |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if( ret == true ) |
| | | { |
| | | *start = i; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond a double-quoted string. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * @return true if a valid string was present; |
| | | * false otherwise. |
| | | */ |
| | | static bool skipString( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | bool ret = false; |
| | | size_t i; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | i = *start; |
| | | |
| | | if( ( i < max ) && ( buf[ i ] == '"' ) ) |
| | | { |
| | | i++; |
| | | |
| | | while( i < max ) |
| | | { |
| | | if( buf[ i ] == '"' ) |
| | | { |
| | | ret = true; |
| | | i++; |
| | | break; |
| | | } |
| | | |
| | | if( buf[ i ] == '\\' ) |
| | | { |
| | | if( skipEscape( buf, &i, max ) != true ) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | /* An unescaped control character is not allowed. */ |
| | | else if( iscntrl_( buf[ i ] ) ) |
| | | { |
| | | break; |
| | | } |
| | | else if( skipUTF8( buf, &i, max ) != true ) |
| | | { |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | /* MISRA 15.7 */ |
| | | } |
| | | } |
| | | } |
| | | |
| | | if( ret == true ) |
| | | { |
| | | *start = i; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Compare the leading n bytes of two character sequences. |
| | | * |
| | | * @param[in] a first character sequence |
| | | * @param[in] b second character sequence |
| | | * @param[in] n number of bytes |
| | | * |
| | | * @return true if the sequences are the same; |
| | | * false otherwise |
| | | */ |
| | | static bool strnEq( const char * a, |
| | | const char * b, |
| | | size_t n ) |
| | | { |
| | | size_t i; |
| | | |
| | | assert( ( a != NULL ) && ( b != NULL ) ); |
| | | |
| | | for( i = 0; i < n; i++ ) |
| | | { |
| | | if( a[ i ] != b[ i ] ) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | return ( i == n ) ? true : false; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond a literal. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * @param[in] literal The type of literal. |
| | | * @param[in] length The length of the literal. |
| | | * |
| | | * @return true if the literal was present; |
| | | * false otherwise. |
| | | */ |
| | | static bool skipLiteral( const char * buf, |
| | | size_t * start, |
| | | size_t max, |
| | | const char * literal, |
| | | size_t length ) |
| | | { |
| | | bool ret = false; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | assert( literal != NULL ); |
| | | |
| | | if( ( *start < max ) && ( length <= ( max - *start ) ) ) |
| | | { |
| | | ret = strnEq( &buf[ *start ], literal, length ); |
| | | } |
| | | |
| | | if( ret == true ) |
| | | { |
| | | *start += length; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond a JSON literal. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * @return true if a valid literal was present; |
| | | * false otherwise. |
| | | */ |
| | | static bool skipAnyLiteral( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | bool ret = false; |
| | | |
| | | #define skipLit_( x ) \ |
| | | ( skipLiteral( buf, start, max, ( x ), ( sizeof( x ) - 1UL ) ) == true ) |
| | | |
| | | if( skipLit_( "true" ) || skipLit_( "false" ) || skipLit_( "null" ) ) |
| | | { |
| | | ret = true; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond one or more digits. |
| | | * Optionally, output the integer value of the digits. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * @param[out] outValue The integer value of the digits. |
| | | * |
| | | * @note outValue may be NULL. If not NULL, and the output |
| | | * exceeds ~2 billion, then -1 is output. |
| | | * |
| | | * @return true if a digit was present; |
| | | * false otherwise. |
| | | */ |
| | | #define MAX_FACTOR ( MAX_INDEX_VALUE / 10 ) |
| | | static bool skipDigits( const char * buf, |
| | | size_t * start, |
| | | size_t max, |
| | | int32_t * outValue ) |
| | | { |
| | | bool ret = false; |
| | | size_t i, saveStart; |
| | | int32_t value = 0; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | saveStart = *start; |
| | | |
| | | for( i = *start; i < max; i++ ) |
| | | { |
| | | if( !isdigit_( buf[ i ] ) ) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | if( ( outValue != NULL ) && ( value > -1 ) ) |
| | | { |
| | | int8_t n = ( int8_t ) hexToInt( buf[ i ] ); |
| | | |
| | | if( value <= MAX_FACTOR ) |
| | | { |
| | | value = ( value * 10 ) + n; |
| | | } |
| | | else |
| | | { |
| | | value = -1; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if( i > saveStart ) |
| | | { |
| | | ret = true; |
| | | *start = i; |
| | | |
| | | if( outValue != NULL ) |
| | | { |
| | | *outValue = value; |
| | | } |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond the decimal portion of a number. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | */ |
| | | static void skipDecimals( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | size_t i; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | i = *start; |
| | | |
| | | if( ( i < max ) && ( buf[ i ] == '.' ) ) |
| | | { |
| | | i++; |
| | | |
| | | if( skipDigits( buf, &i, max, NULL ) == true ) |
| | | { |
| | | *start = i; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond the exponent portion of a number. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | */ |
| | | static void skipExponent( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | size_t i; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | i = *start; |
| | | |
| | | if( ( i < max ) && ( ( buf[ i ] == 'e' ) || ( buf[ i ] == 'E' ) ) ) |
| | | { |
| | | i++; |
| | | |
| | | if( ( i < max ) && ( ( buf[ i ] == '-' ) || ( buf[ i ] == '+' ) ) ) |
| | | { |
| | | i++; |
| | | } |
| | | |
| | | if( skipDigits( buf, &i, max, NULL ) == true ) |
| | | { |
| | | *start = i; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond a number. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * @return true if a valid number was present; |
| | | * false otherwise. |
| | | */ |
| | | static bool skipNumber( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | bool ret = false; |
| | | size_t i; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | i = *start; |
| | | |
| | | if( ( i < max ) && ( buf[ i ] == '-' ) ) |
| | | { |
| | | i++; |
| | | } |
| | | |
| | | if( i < max ) |
| | | { |
| | | /* JSON disallows superfluous leading zeroes, so an |
| | | * initial zero must either be alone, or followed by |
| | | * a decimal or exponent. |
| | | * |
| | | * Should there be a digit after the zero, that digit |
| | | * will not be skipped by this function, and later parsing |
| | | * will judge this an illegal document. */ |
| | | if( buf[ i ] == '0' ) |
| | | { |
| | | ret = true; |
| | | i++; |
| | | } |
| | | else |
| | | { |
| | | ret = skipDigits( buf, &i, max, NULL ); |
| | | } |
| | | } |
| | | |
| | | if( ret == true ) |
| | | { |
| | | skipDecimals( buf, &i, max ); |
| | | skipExponent( buf, &i, max ); |
| | | *start = i; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond a scalar value. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * @return true if a scalar value was present; |
| | | * false otherwise. |
| | | */ |
| | | static bool skipAnyScalar( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | bool ret = false; |
| | | |
| | | if( ( skipString( buf, start, max ) == true ) || |
| | | ( skipAnyLiteral( buf, start, max ) == true ) || |
| | | ( skipNumber( buf, start, max ) == true ) ) |
| | | { |
| | | ret = true; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond a comma separator |
| | | * and surrounding whitespace. |
| | | * |
| | | * JSON uses a comma to separate values in an array and key-value |
| | | * pairs in an object. JSON does not permit a trailing comma. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * @return true if a non-terminal comma was present; |
| | | * false otherwise. |
| | | */ |
| | | static bool skipSpaceAndComma( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | bool ret = false; |
| | | size_t i; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | skipSpace( buf, start, max ); |
| | | i = *start; |
| | | |
| | | if( ( i < max ) && ( buf[ i ] == ',' ) ) |
| | | { |
| | | i++; |
| | | skipSpace( buf, &i, max ); |
| | | |
| | | if( ( i < max ) && !isCloseBracket_( buf[ i ] ) ) |
| | | { |
| | | ret = true; |
| | | *start = i; |
| | | } |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond the scalar values of an array. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * @note Stops advance if a value is an object or array. |
| | | */ |
| | | static void skipArrayScalars( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | size_t i; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | i = *start; |
| | | |
| | | while( i < max ) |
| | | { |
| | | if( skipAnyScalar( buf, &i, max ) != true ) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | if( skipSpaceAndComma( buf, &i, max ) != true ) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | *start = i; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond the scalar key-value pairs |
| | | * of an object. |
| | | * |
| | | * In JSON, objects consist of comma-separated key-value pairs. |
| | | * A key is always a string (a scalar) while a value may be a |
| | | * scalar, an object, or an array. A colon must appear between |
| | | * each key and value. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * @note Stops advance if a value is an object or array. |
| | | */ |
| | | static void skipObjectScalars( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | size_t i; |
| | | bool comma; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | i = *start; |
| | | |
| | | while( i < max ) |
| | | { |
| | | if( skipString( buf, &i, max ) != true ) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | skipSpace( buf, &i, max ); |
| | | |
| | | if( ( i < max ) && ( buf[ i ] != ':' ) ) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | i++; |
| | | skipSpace( buf, &i, max ); |
| | | |
| | | if( ( i < max ) && isOpenBracket_( buf[ i ] ) ) |
| | | { |
| | | *start = i; |
| | | break; |
| | | } |
| | | |
| | | if( skipAnyScalar( buf, &i, max ) != true ) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | comma = skipSpaceAndComma( buf, &i, max ); |
| | | *start = i; |
| | | |
| | | if( comma != true ) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond one or more scalars. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * @param[in] mode The first character of an array '[' or object '{'. |
| | | */ |
| | | static void skipScalars( const char * buf, |
| | | size_t * start, |
| | | size_t max, |
| | | char mode ) |
| | | { |
| | | assert( isOpenBracket_( mode ) ); |
| | | |
| | | skipSpace( buf, start, max ); |
| | | |
| | | if( mode == '[' ) |
| | | { |
| | | skipArrayScalars( buf, start, max ); |
| | | } |
| | | else |
| | | { |
| | | skipObjectScalars( buf, start, max ); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond a collection and handle nesting. |
| | | * |
| | | * A stack is used to continue parsing the prior collection type |
| | | * when a nested collection is finished. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * |
| | | * @return #JSONSuccess if the buffer contents are a valid JSON collection; |
| | | * #JSONIllegalDocument if the buffer contents are NOT valid JSON; |
| | | * #JSONMaxDepthExceeded if object and array nesting exceeds a threshold; |
| | | * #JSONPartial if the buffer contents are potentially valid but incomplete. |
| | | */ |
| | | #ifndef JSON_MAX_DEPTH |
| | | #define JSON_MAX_DEPTH 32 |
| | | #endif |
| | | static JSONStatus_t skipCollection( const char * buf, |
| | | size_t * start, |
| | | size_t max ) |
| | | { |
| | | JSONStatus_t ret = JSONPartial; |
| | | char c, stack[ JSON_MAX_DEPTH ]; |
| | | int16_t depth = -1; |
| | | size_t i; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | |
| | | i = *start; |
| | | |
| | | while( i < max ) |
| | | { |
| | | c = buf[ i ]; |
| | | i++; |
| | | |
| | | switch( c ) |
| | | { |
| | | case '{': |
| | | case '[': |
| | | depth++; |
| | | |
| | | if( depth == JSON_MAX_DEPTH ) |
| | | { |
| | | ret = JSONMaxDepthExceeded; |
| | | break; |
| | | } |
| | | |
| | | stack[ depth ] = c; |
| | | skipScalars( buf, &i, max, stack[ depth ] ); |
| | | break; |
| | | |
| | | case '}': |
| | | case ']': |
| | | |
| | | if( ( depth > 0 ) && isMatchingBracket_( stack[ depth ], c ) ) |
| | | { |
| | | depth--; |
| | | |
| | | if( skipSpaceAndComma( buf, &i, max ) == true ) |
| | | { |
| | | skipScalars( buf, &i, max, stack[ depth ] ); |
| | | } |
| | | |
| | | break; |
| | | } |
| | | |
| | | ret = ( depth == 0 ) ? JSONSuccess : JSONIllegalDocument; |
| | | break; |
| | | |
| | | default: |
| | | ret = JSONIllegalDocument; |
| | | break; |
| | | } |
| | | |
| | | if( ret != JSONPartial ) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if( ret == JSONSuccess ) |
| | | { |
| | | *start = i; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** @endcond */ |
| | | |
| | | /** |
| | | * See core_json.h for docs. |
| | | * |
| | | * Verify that the entire buffer contains exactly one scalar |
| | | * or collection within optional whitespace. |
| | | */ |
| | | JSONStatus_t JSON_Validate( const char * buf, |
| | | size_t max ) |
| | | { |
| | | JSONStatus_t ret; |
| | | size_t i = 0; |
| | | |
| | | if( buf == NULL ) |
| | | { |
| | | ret = JSONNullParameter; |
| | | } |
| | | else if( max == 0U ) |
| | | { |
| | | ret = JSONBadParameter; |
| | | } |
| | | else |
| | | { |
| | | skipSpace( buf, &i, max ); |
| | | |
| | | /** @cond DO_NOT_DOCUMENT */ |
| | | #ifndef JSON_VALIDATE_COLLECTIONS_ONLY |
| | | if( skipAnyScalar( buf, &i, max ) == true ) |
| | | { |
| | | ret = JSONSuccess; |
| | | } |
| | | else |
| | | #endif |
| | | /** @endcond */ |
| | | { |
| | | ret = skipCollection( buf, &i, max ); |
| | | } |
| | | } |
| | | |
| | | if( ( ret == JSONSuccess ) && ( i < max ) ) |
| | | { |
| | | skipSpace( buf, &i, max ); |
| | | |
| | | if( i != max ) |
| | | { |
| | | ret = JSONIllegalDocument; |
| | | } |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** @cond DO_NOT_DOCUMENT */ |
| | | |
| | | /** |
| | | * @brief Output index and length for the next value. |
| | | * |
| | | * Also advances the buffer index beyond the value. |
| | | * The value may be a scalar or a collection. |
| | | * The start index should point to the beginning of the value. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * @param[out] value A pointer to receive the index of the value. |
| | | * @param[out] valueLength A pointer to receive the length of the value. |
| | | * |
| | | * @return true if a value was present; |
| | | * false otherwise. |
| | | */ |
| | | static bool nextValue( const char * buf, |
| | | size_t * start, |
| | | size_t max, |
| | | size_t * value, |
| | | size_t * valueLength ) |
| | | { |
| | | bool ret = true; |
| | | size_t i, valueStart; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | assert( ( value != NULL ) && ( valueLength != NULL ) ); |
| | | |
| | | i = *start; |
| | | valueStart = i; |
| | | |
| | | if( ( skipAnyScalar( buf, &i, max ) == true ) || |
| | | ( skipCollection( buf, &i, max ) == JSONSuccess ) ) |
| | | { |
| | | *value = valueStart; |
| | | *valueLength = i - valueStart; |
| | | } |
| | | else |
| | | { |
| | | ret = false; |
| | | } |
| | | |
| | | if( ret == true ) |
| | | { |
| | | *start = i; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Output indexes for the next key-value pair of an object. |
| | | * |
| | | * Also advances the buffer index beyond the key-value pair. |
| | | * The value may be a scalar or a collection. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * @param[out] key A pointer to receive the index of the key. |
| | | * @param[out] keyLength A pointer to receive the length of the key. |
| | | * @param[out] value A pointer to receive the index of the value. |
| | | * @param[out] valueLength A pointer to receive the length of the value. |
| | | * |
| | | * @return true if a key-value pair was present; |
| | | * false otherwise. |
| | | */ |
| | | static bool nextKeyValuePair( const char * buf, |
| | | size_t * start, |
| | | size_t max, |
| | | size_t * key, |
| | | size_t * keyLength, |
| | | size_t * value, |
| | | size_t * valueLength ) |
| | | { |
| | | bool ret = true; |
| | | size_t i, keyStart; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( max > 0U ) ); |
| | | assert( ( key != NULL ) && ( keyLength != NULL ) ); |
| | | assert( ( value != NULL ) && ( valueLength != NULL ) ); |
| | | |
| | | i = *start; |
| | | keyStart = i; |
| | | |
| | | if( skipString( buf, &i, max ) == true ) |
| | | { |
| | | *key = keyStart + 1U; |
| | | *keyLength = i - keyStart - 2U; |
| | | } |
| | | else |
| | | { |
| | | ret = false; |
| | | } |
| | | |
| | | if( ret == true ) |
| | | { |
| | | skipSpace( buf, &i, max ); |
| | | |
| | | if( ( i < max ) && ( buf[ i ] == ':' ) ) |
| | | { |
| | | i++; |
| | | skipSpace( buf, &i, max ); |
| | | } |
| | | else |
| | | { |
| | | ret = false; |
| | | } |
| | | } |
| | | |
| | | if( ret == true ) |
| | | { |
| | | ret = nextValue( buf, &i, max, value, valueLength ); |
| | | } |
| | | |
| | | if( ret == true ) |
| | | { |
| | | *start = i; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Find a key in a JSON object and output a pointer to its value. |
| | | * |
| | | * @param[in] buf The buffer to search. |
| | | * @param[in] max size of the buffer. |
| | | * @param[in] query The object keys and array indexes to search for. |
| | | * @param[in] queryLength Length of the key. |
| | | * @param[out] outValue A pointer to receive the index of the value found. |
| | | * @param[out] outValueLength A pointer to receive the length of the value found. |
| | | * |
| | | * Iterate over the key-value pairs of an object, looking for a matching key. |
| | | * |
| | | * @return true if the query is matched and the value output; |
| | | * false otherwise. |
| | | * |
| | | * @note Parsing stops upon finding a match. |
| | | */ |
| | | static bool objectSearch( const char * buf, |
| | | size_t max, |
| | | const char * query, |
| | | size_t queryLength, |
| | | size_t * outValue, |
| | | size_t * outValueLength ) |
| | | { |
| | | bool ret = false; |
| | | |
| | | size_t i = 0, key, keyLength, value = 0, valueLength = 0; |
| | | |
| | | assert( ( buf != NULL ) && ( query != NULL ) ); |
| | | assert( ( outValue != NULL ) && ( outValueLength != NULL ) ); |
| | | |
| | | skipSpace( buf, &i, max ); |
| | | |
| | | if( ( i < max ) && ( buf[ i ] == '{' ) ) |
| | | { |
| | | i++; |
| | | skipSpace( buf, &i, max ); |
| | | |
| | | while( i < max ) |
| | | { |
| | | if( nextKeyValuePair( buf, &i, max, &key, &keyLength, |
| | | &value, &valueLength ) != true ) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | if( ( queryLength == keyLength ) && |
| | | ( strnEq( query, &buf[ key ], keyLength ) == true ) ) |
| | | { |
| | | ret = true; |
| | | break; |
| | | } |
| | | |
| | | if( skipSpaceAndComma( buf, &i, max ) != true ) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if( ret == true ) |
| | | { |
| | | *outValue = value; |
| | | *outValueLength = valueLength; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Find an index in a JSON array and output a pointer to its value. |
| | | * |
| | | * @param[in] buf The buffer to search. |
| | | * @param[in] max size of the buffer. |
| | | * @param[in] queryIndex The index to search for. |
| | | * @param[out] outValue A pointer to receive the index of the value found. |
| | | * @param[out] outValueLength A pointer to receive the length of the value found. |
| | | * |
| | | * Iterate over the values of an array, looking for a matching index. |
| | | * |
| | | * @return true if the queryIndex is found and the value output; |
| | | * false otherwise. |
| | | * |
| | | * @note Parsing stops upon finding a match. |
| | | */ |
| | | static bool arraySearch( const char * buf, |
| | | size_t max, |
| | | uint32_t queryIndex, |
| | | size_t * outValue, |
| | | size_t * outValueLength ) |
| | | { |
| | | bool ret = false; |
| | | size_t i = 0, value = 0, valueLength = 0; |
| | | uint32_t currentIndex = 0; |
| | | |
| | | assert( buf != NULL ); |
| | | assert( ( outValue != NULL ) && ( outValueLength != NULL ) ); |
| | | |
| | | skipSpace( buf, &i, max ); |
| | | |
| | | if( ( i < max ) && ( buf[ i ] == '[' ) ) |
| | | { |
| | | i++; |
| | | skipSpace( buf, &i, max ); |
| | | |
| | | while( i < max ) |
| | | { |
| | | if( nextValue( buf, &i, max, &value, &valueLength ) != true ) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | if( currentIndex == queryIndex ) |
| | | { |
| | | ret = true; |
| | | break; |
| | | } |
| | | |
| | | if( skipSpaceAndComma( buf, &i, max ) != true ) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | currentIndex++; |
| | | } |
| | | } |
| | | |
| | | if( ret == true ) |
| | | { |
| | | *outValue = value; |
| | | *outValueLength = valueLength; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Advance buffer index beyond a query part. |
| | | * |
| | | * The part is the portion of the query which is not |
| | | * a separator or array index. |
| | | * |
| | | * @param[in] buf The buffer to parse. |
| | | * @param[in,out] start The index at which to begin. |
| | | * @param[in] max The size of the buffer. |
| | | * @param[out] outLength The length of the query part. |
| | | * |
| | | * @return true if a valid string was present; |
| | | * false otherwise. |
| | | */ |
| | | #define JSON_QUERY_KEY_SEPARATOR '.' |
| | | #define isSeparator_( x ) ( ( x ) == JSON_QUERY_KEY_SEPARATOR ) |
| | | static bool skipQueryPart( const char * buf, |
| | | size_t * start, |
| | | size_t max, |
| | | size_t * outLength ) |
| | | { |
| | | bool ret = false; |
| | | size_t i; |
| | | |
| | | assert( ( buf != NULL ) && ( start != NULL ) && ( outLength != NULL ) ); |
| | | assert( max > 0U ); |
| | | |
| | | i = *start; |
| | | |
| | | while( ( i < max ) && |
| | | !isSeparator_( buf[ i ] ) && |
| | | !isSquareOpen_( buf[ i ] ) ) |
| | | { |
| | | i++; |
| | | } |
| | | |
| | | if( i > *start ) |
| | | { |
| | | ret = true; |
| | | *outLength = i - *start; |
| | | *start = i; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Handle a nested search by iterating over the parts of the query. |
| | | * |
| | | * @param[in] buf The buffer to search. |
| | | * @param[in] max size of the buffer. |
| | | * @param[in] query The object keys and array indexes to search for. |
| | | * @param[in] queryLength Length of the key. |
| | | * @param[out] outValue A pointer to receive the index of the value found. |
| | | * @param[out] outValueLength A pointer to receive the length of the value found. |
| | | * |
| | | * @return #JSONSuccess if the query is matched and the value output; |
| | | * #JSONBadParameter if the query is empty, or any part is empty, |
| | | * or an index is too large to convert; |
| | | * #JSONNotFound if the query is NOT found. |
| | | * |
| | | * @note Parsing stops upon finding a match. |
| | | */ |
| | | static JSONStatus_t multiSearch( const char * buf, |
| | | size_t max, |
| | | const char * query, |
| | | size_t queryLength, |
| | | size_t * outValue, |
| | | size_t * outValueLength ) |
| | | { |
| | | JSONStatus_t ret = JSONSuccess; |
| | | size_t i = 0, start = 0, queryStart = 0, value = 0, length = max; |
| | | |
| | | assert( ( buf != NULL ) && ( query != NULL ) ); |
| | | assert( ( outValue != NULL ) && ( outValueLength != NULL ) ); |
| | | assert( ( max > 0U ) && ( queryLength > 0U ) ); |
| | | |
| | | while( i < queryLength ) |
| | | { |
| | | bool found = false; |
| | | |
| | | if( isSquareOpen_( query[ i ] ) ) |
| | | { |
| | | int32_t queryIndex = -1; |
| | | i++; |
| | | |
| | | ( void ) skipDigits( query, &i, queryLength, &queryIndex ); |
| | | |
| | | if( ( queryIndex < 0 ) || |
| | | ( i >= queryLength ) || !isSquareClose_( query[ i ] ) ) |
| | | { |
| | | ret = JSONBadParameter; |
| | | break; |
| | | } |
| | | |
| | | i++; |
| | | |
| | | found = arraySearch( &buf[ start ], length, ( uint32_t ) queryIndex, &value, &length ); |
| | | } |
| | | else |
| | | { |
| | | size_t keyLength = 0; |
| | | |
| | | queryStart = i; |
| | | |
| | | if( ( skipQueryPart( query, &i, queryLength, &keyLength ) != true ) || |
| | | /* catch an empty key part or a trailing separator */ |
| | | ( i == ( queryLength - 1U ) ) ) |
| | | { |
| | | ret = JSONBadParameter; |
| | | break; |
| | | } |
| | | |
| | | found = objectSearch( &buf[ start ], length, &query[ queryStart ], keyLength, &value, &length ); |
| | | } |
| | | |
| | | if( found == false ) |
| | | { |
| | | ret = JSONNotFound; |
| | | break; |
| | | } |
| | | |
| | | start += value; |
| | | |
| | | if( ( i < queryLength ) && isSeparator_( query[ i ] ) ) |
| | | { |
| | | i++; |
| | | } |
| | | } |
| | | |
| | | if( ret == JSONSuccess ) |
| | | { |
| | | *outValue = start; |
| | | *outValueLength = length; |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * @brief Return a JSON type based on a separator character or |
| | | * the first character of a value. |
| | | * |
| | | * @param[in] c The character to classify. |
| | | * |
| | | * @return an enum of JSONTypes_t |
| | | */ |
| | | static JSONTypes_t getType( char c ) |
| | | { |
| | | JSONTypes_t t; |
| | | |
| | | switch( c ) |
| | | { |
| | | case '"': |
| | | t = JSONString; |
| | | break; |
| | | |
| | | case '{': |
| | | t = JSONObject; |
| | | break; |
| | | |
| | | case '[': |
| | | t = JSONArray; |
| | | break; |
| | | |
| | | case 't': |
| | | t = JSONTrue; |
| | | break; |
| | | |
| | | case 'f': |
| | | t = JSONFalse; |
| | | break; |
| | | |
| | | case 'n': |
| | | t = JSONNull; |
| | | break; |
| | | |
| | | default: |
| | | t = JSONNumber; |
| | | break; |
| | | } |
| | | |
| | | return t; |
| | | } |
| | | |
| | | /** @endcond */ |
| | | |
| | | /** |
| | | * See core_json.h for docs. |
| | | */ |
| | | JSONStatus_t JSON_SearchConst( const char * buf, |
| | | size_t max, |
| | | const char * query, |
| | | size_t queryLength, |
| | | const char ** outValue, |
| | | size_t * outValueLength, |
| | | JSONTypes_t * outType ) |
| | | { |
| | | JSONStatus_t ret; |
| | | size_t value; |
| | | |
| | | if( ( buf == NULL ) || ( query == NULL ) || |
| | | ( outValue == NULL ) || ( outValueLength == NULL ) ) |
| | | { |
| | | ret = JSONNullParameter; |
| | | } |
| | | else if( ( max == 0U ) || ( queryLength == 0U ) ) |
| | | { |
| | | ret = JSONBadParameter; |
| | | } |
| | | else |
| | | { |
| | | ret = multiSearch( buf, max, query, queryLength, &value, outValueLength ); |
| | | } |
| | | |
| | | if( ret == JSONSuccess ) |
| | | { |
| | | JSONTypes_t t = getType( buf[ value ] ); |
| | | |
| | | if( t == JSONString ) |
| | | { |
| | | /* strip the surrounding quotes */ |
| | | value++; |
| | | *outValueLength -= 2U; |
| | | } |
| | | |
| | | *outValue = &buf[ value ]; |
| | | |
| | | if( outType != NULL ) |
| | | { |
| | | *outType = t; |
| | | } |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** |
| | | * See core_json.h for docs. |
| | | */ |
| | | JSONStatus_t JSON_SearchT( char * buf, |
| | | size_t max, |
| | | const char * query, |
| | | size_t queryLength, |
| | | char ** outValue, |
| | | size_t * outValueLength, |
| | | JSONTypes_t * outType ) |
| | | { |
| | | /* MISRA Rule 11.3 prohibits casting a pointer to a different type. |
| | | * This instance is a false positive, as the rule permits the |
| | | * addition of a type qualifier. */ |
| | | /* coverity[misra_c_2012_rule_11_3_violation] */ |
| | | return JSON_SearchConst( ( const char * ) buf, max, query, queryLength, |
| | | ( const char ** ) outValue, outValueLength, outType ); |
| | | } |
| | | |
| | | /** @cond DO_NOT_DOCUMENT */ |
| | | |
| | | /** |
| | | * @brief Output the next key-value pair or value from a collection. |
| | | * |
| | | * @param[in] buf The buffer to search. |
| | | * @param[in] max size of the buffer. |
| | | * @param[in] start The index at which the collection begins. |
| | | * @param[in,out] next The index at which to seek the next value. |
| | | * @param[out] outKey A pointer to receive the index of the value found. |
| | | * @param[out] outKeyLength A pointer to receive the length of the value found. |
| | | * @param[out] outValue A pointer to receive the index of the value found. |
| | | * @param[out] outValueLength A pointer to receive the length of the value found. |
| | | * |
| | | * @return #JSONSuccess if a value is output; |
| | | * #JSONIllegalDocument if the buffer does not begin with '[' or '{'; |
| | | * #JSONNotFound if there are no further values in the collection. |
| | | */ |
| | | static JSONStatus_t iterate( const char * buf, |
| | | size_t max, |
| | | size_t * start, |
| | | size_t * next, |
| | | size_t * outKey, |
| | | size_t * outKeyLength, |
| | | size_t * outValue, |
| | | size_t * outValueLength ) |
| | | { |
| | | JSONStatus_t ret = JSONNotFound; |
| | | bool found = false; |
| | | |
| | | assert( ( buf != NULL ) && ( max > 0U ) ); |
| | | assert( ( start != NULL ) && ( next != NULL ) ); |
| | | assert( ( outKey != NULL ) && ( outKeyLength != NULL ) ); |
| | | assert( ( outValue != NULL ) && ( outValueLength != NULL ) ); |
| | | |
| | | if( *start < max ) |
| | | { |
| | | switch( buf[ *start ] ) |
| | | { |
| | | case '[': |
| | | found = nextValue( buf, next, max, outValue, outValueLength ); |
| | | |
| | | if( found == true ) |
| | | { |
| | | *outKey = 0; |
| | | *outKeyLength = 0; |
| | | } |
| | | |
| | | break; |
| | | |
| | | case '{': |
| | | found = nextKeyValuePair( buf, next, max, outKey, outKeyLength, |
| | | outValue, outValueLength ); |
| | | break; |
| | | |
| | | default: |
| | | ret = JSONIllegalDocument; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if( found == true ) |
| | | { |
| | | ret = JSONSuccess; |
| | | ( void ) skipSpaceAndComma( buf, next, max ); |
| | | } |
| | | |
| | | return ret; |
| | | } |
| | | |
| | | /** @endcond */ |
| | | |
| | | /** |
| | | * See core_json.h for docs. |
| | | */ |
| | | JSONStatus_t JSON_Iterate( const char * buf, |
| | | size_t max, |
| | | size_t * start, |
| | | size_t * next, |
| | | JSONPair_t * outPair ) |
| | | { |
| | | JSONStatus_t ret; |
| | | size_t key, keyLength, value, valueLength; |
| | | |
| | | if( ( buf == NULL ) || ( start == NULL ) || ( next == NULL ) || |
| | | ( outPair == NULL ) ) |
| | | { |
| | | ret = JSONNullParameter; |
| | | } |
| | | else if( ( max == 0U ) || ( *start >= max ) || ( *next > max ) ) |
| | | { |
| | | ret = JSONBadParameter; |
| | | } |
| | | else |
| | | { |
| | | skipSpace( buf, start, max ); |
| | | |
| | | if( *next <= *start ) |
| | | { |
| | | *next = *start + 1U; |
| | | skipSpace( buf, next, max ); |
| | | } |
| | | |
| | | ret = iterate( buf, max, start, next, &key, &keyLength, |
| | | &value, &valueLength ); |
| | | } |
| | | |
| | | if( ret == JSONSuccess ) |
| | | { |
| | | JSONTypes_t t = getType( buf[ value ] ); |
| | | |
| | | if( t == JSONString ) |
| | | { |
| | | /* strip the surrounding quotes */ |
| | | value++; |
| | | valueLength -= 2U; |
| | | } |
| | | |
| | | outPair->key = ( key == 0U ) ? NULL : &buf[ key ]; |
| | | outPair->keyLength = keyLength; |
| | | outPair->value = &buf[ value ]; |
| | | outPair->valueLength = valueLength; |
| | | outPair->jsonType = t; |
| | | } |
| | | |
| | | return ret; |
| | | } |
New file |
| | |
| | | /* |
| | | * dht11.c |
| | | * |
| | | * Created on: Aug 8, 2021 |
| | | * Author: Think |
| | | */ |
| | | |
| | | #include "tim.h" |
| | | #include "gpio.h" |
| | | #include "main.h" |
| | | |
| | | typedef struct w1_gpio_s |
| | | { |
| | | GPIO_TypeDef *group; |
| | | uint16_t pin; |
| | | } w1_gpio_t; |
| | | |
| | | static w1_gpio_t W1Dat = /* IO pin connected to PA5 */ |
| | | { |
| | | .group = GPIOA, |
| | | .pin = GPIO_PIN_5, |
| | | }; |
| | | |
| | | #define W1DQ_Input() \ |
| | | { \ |
| | | GPIO_InitTypeDef GPIO_InitStruct = {0}; \ |
| | | GPIO_InitStruct.Pin = W1Dat.pin; \ |
| | | GPIO_InitStruct.Mode = GPIO_MODE_INPUT; \ |
| | | GPIO_InitStruct.Pull = GPIO_PULLUP; \ |
| | | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; \ |
| | | HAL_GPIO_Init(W1Dat.group, &GPIO_InitStruct); \ |
| | | } |
| | | |
| | | #define W1DQ_Output() \ |
| | | { \ |
| | | GPIO_InitTypeDef GPIO_InitStruct = {0}; \ |
| | | GPIO_InitStruct.Pin = W1Dat.pin; \ |
| | | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \ |
| | | GPIO_InitStruct.Pull = GPIO_NOPULL; \ |
| | | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; \ |
| | | HAL_GPIO_Init(W1Dat.group, &GPIO_InitStruct); \ |
| | | } |
| | | |
| | | #define W1DQ_Write(x) HAL_GPIO_WritePin(W1Dat.group, W1Dat.pin, \ |
| | | (x==1)?GPIO_PIN_SET:GPIO_PIN_RESET) |
| | | |
| | | #define W1DQ_Read() HAL_GPIO_ReadPin(W1Dat.group, W1Dat.pin) |
| | | |
| | | |
| | | /* 主机发送起始信号 */ |
| | | static void DHT11_StartSignal(void) |
| | | { |
| | | W1DQ_Output(); |
| | | |
| | | /* 主机拉低 >= 18ms */ |
| | | W1DQ_Write(0); |
| | | HAL_Delay(20); |
| | | |
| | | /* 主机拉高 >= 20~40us */ |
| | | W1DQ_Write(1); |
| | | delay_us(30); |
| | | |
| | | W1DQ_Input(); |
| | | } |
| | | |
| | | uint8_t DHT11_RespondSignal(void) |
| | | { |
| | | uint8_t retry = 0; |
| | | |
| | | /* 总线变为低电平说明从设备发送了响应信号: 80us */ |
| | | while( W1DQ_Read() && retry <100) |
| | | { |
| | | retry++; |
| | | delay_us(1); |
| | | } |
| | | |
| | | /* 超时没有收到响应信号 */ |
| | | if(retry >= 100) |
| | | return 1; |
| | | |
| | | /* 从设备再把总线拉高表示从设备要发送数据了: 80us */ |
| | | retry = 0; |
| | | while( !W1DQ_Read() && retry <100) |
| | | { |
| | | retry++; |
| | | delay_us(1); |
| | | } |
| | | |
| | | /* 超时没有收到数据开始信号 */ |
| | | if(retry >= 100) |
| | | return 1; |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | uint8_t DHT11_ReadBit(void) //读取一个位 |
| | | { |
| | | uint8_t retry = 0; |
| | | |
| | | /* 从设备回复的每个位数据以低电平标置开始: 50us */ |
| | | while( W1DQ_Read() && retry<100 ) |
| | | { |
| | | retry++; |
| | | delay_us(1); |
| | | } |
| | | |
| | | /* 数据位都用高电平表示, 但高电平的长短决定了数据是 1 or 0 */ |
| | | retry = 0; |
| | | while( !W1DQ_Read() && retry<100 ) |
| | | { |
| | | retry++; |
| | | delay_us(1); |
| | | } |
| | | |
| | | /* 判断数据位是 1(70us) or 0(26~28us)*/ |
| | | delay_us(40); |
| | | if( W1DQ_Read() ) |
| | | return 1; |
| | | else |
| | | return 0; |
| | | } |
| | | |
| | | uint8_t DHT11_ReadByte(void) //读取一个字节返回值位采集值 |
| | | { |
| | | uint8_t i,dat; |
| | | |
| | | dat = 0; |
| | | for(i=0; i<8; i++) |
| | | { |
| | | dat <<= 1; |
| | | dat |= DHT11_ReadBit(); //每读取到一个位放到最后一位 |
| | | } |
| | | |
| | | return dat; |
| | | } |
| | | |
| | | int DHT11_SampleData(float *temperature, float *humidity) |
| | | { |
| | | uint8_t humi_H8bit; |
| | | uint8_t humi_L8bit; |
| | | uint8_t temp_H8bit; |
| | | uint8_t temp_L8bit; |
| | | uint8_t check_sum; |
| | | |
| | | if( !temperature || !humidity ) |
| | | return -1; |
| | | |
| | | /* 主机发起起始信号并等到从设备的响应信号 */ |
| | | DHT11_StartSignal(); |
| | | if( 0 != DHT11_RespondSignal() ) |
| | | return -2; |
| | | |
| | | humi_H8bit = DHT11_ReadByte(); |
| | | humi_L8bit = DHT11_ReadByte(); |
| | | temp_H8bit = DHT11_ReadByte(); |
| | | temp_L8bit = DHT11_ReadByte(); |
| | | check_sum = DHT11_ReadByte(); |
| | | |
| | | if( (humi_H8bit+humi_L8bit+temp_H8bit+temp_L8bit) != check_sum ) |
| | | return -3; |
| | | |
| | | *humidity = (humi_H8bit*100 + humi_L8bit) / 100.00; |
| | | *temperature = (temp_H8bit*100 + temp_L8bit) / 100.00; |
| | | |
| | | return 0; |
| | | } |
New file |
| | |
| | | /* |
| | | * ds18b20.c |
| | | * |
| | | * Created on: 2021年8月17日 |
| | | * Author: Think |
| | | */ |
| | | #include "tim.h" |
| | | #include "gpio.h" |
| | | #include "main.h" |
| | | |
| | | typedef struct w1_gpio_s |
| | | { |
| | | GPIO_TypeDef *group; |
| | | uint16_t pin; |
| | | } w1_gpio_t; |
| | | |
| | | static w1_gpio_t W1Dat = /* IO pin connected to PA5 */ |
| | | { |
| | | .group = GPIOA, |
| | | .pin = GPIO_PIN_5, |
| | | }; |
| | | |
| | | #define W1DQ_Input() \ |
| | | { \ |
| | | GPIO_InitTypeDef GPIO_InitStruct = {0}; \ |
| | | GPIO_InitStruct.Pin = W1Dat.pin; \ |
| | | GPIO_InitStruct.Mode = GPIO_MODE_INPUT; \ |
| | | GPIO_InitStruct.Pull = GPIO_PULLUP; \ |
| | | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; \ |
| | | HAL_GPIO_Init(W1Dat.group, &GPIO_InitStruct); \ |
| | | } |
| | | |
| | | #define W1DQ_Output() \ |
| | | { \ |
| | | GPIO_InitTypeDef GPIO_InitStruct = {0}; \ |
| | | GPIO_InitStruct.Pin = W1Dat.pin; \ |
| | | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \ |
| | | GPIO_InitStruct.Pull = GPIO_NOPULL; \ |
| | | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; \ |
| | | HAL_GPIO_Init(W1Dat.group, &GPIO_InitStruct); \ |
| | | } |
| | | |
| | | #define W1DQ_Write(x) HAL_GPIO_WritePin(W1Dat.group, W1Dat.pin, \ |
| | | (x==1)?GPIO_PIN_SET:GPIO_PIN_RESET) |
| | | |
| | | #define W1DQ_Read() HAL_GPIO_ReadPin(W1Dat.group, W1Dat.pin) |
| | | |
| | | |
| | | /* Master issues reset pulse and DS18B20s respond with presence pulse */ |
| | | uint8_t DS18B20_Reset(void) |
| | | { |
| | | uint8_t rv = 0; |
| | | uint8_t retry; |
| | | |
| | | /* Setup W1 DQ pin as output and high level*/ |
| | | W1DQ_Output(); |
| | | W1DQ_Write(1); |
| | | delay_us(2); |
| | | |
| | | /* Reset pulse by pulling the DQ pin low >=480us */ |
| | | W1DQ_Write(0); |
| | | delay_us(480); |
| | | |
| | | /* Master releases bus to high. When DS18B20 detects this rising edge, it waits 15µs to 60µs */ |
| | | W1DQ_Write(1); |
| | | delay_us(60); |
| | | |
| | | /* Then DS18B20 transmits a presence pulse by pulling the W1 bus low for 60µs to 240µs */ |
| | | while( W1DQ_Read() && retry <240) |
| | | { |
| | | retry++; |
| | | delay_us(1); |
| | | } |
| | | |
| | | if(retry >= 240) |
| | | rv = 1; |
| | | |
| | | delay_us(240); |
| | | |
| | | /* Master Rx time must >= 480us */ |
| | | W1DQ_Output(); |
| | | W1DQ_Write(1); |
| | | delay_us(240); |
| | | |
| | | return rv; |
| | | } |
| | | |
| | | void DS18B20_WriteByte(uint8_t byte) |
| | | { |
| | | uint8_t i = 0; |
| | | |
| | | W1DQ_Output(); |
| | | |
| | | for(i=0; i<8; i++) |
| | | { |
| | | /* Write 1: pull low <= 15us, Write 0: pull low 15~60us*/ |
| | | W1DQ_Write(0); |
| | | delay_us(10); |
| | | |
| | | /* DS18B20 bit sent by LSB (lower bit first) */ |
| | | if( byte & 0x1 ) |
| | | W1DQ_Write(1); |
| | | else |
| | | W1DQ_Write(0); |
| | | |
| | | /* Write 1/0 slot both >= 60us, hold the level for 60us */ |
| | | delay_us(60); |
| | | |
| | | /* Release W1 bus to high */ |
| | | W1DQ_Write(1); |
| | | delay_us(2); |
| | | |
| | | /* Prepare for next bit */ |
| | | byte >>= 1; |
| | | } |
| | | } |
| | | |
| | | |
| | | uint8_t DS18B20_ReadByte(void) |
| | | { |
| | | uint8_t i = 0; |
| | | uint8_t byte = 0; |
| | | |
| | | for(i=0; i<8; i++) |
| | | { |
| | | /* Read time slot is initiated by master pulling the W1 bus |
| | | * low for minimum of 1µs and then releasing the bus */ |
| | | W1DQ_Output(); |
| | | W1DQ_Write(0); |
| | | delay_us(2); |
| | | W1DQ_Write(1); |
| | | delay_us(2); |
| | | |
| | | /* After master initiates read time slot, DS18B20 will begin |
| | | * transmitting a 1 or 0 on bus */ |
| | | W1DQ_Input(); |
| | | |
| | | /* DS18B20 bit sent by LSB (lower bit first) */ |
| | | if( W1DQ_Read() ) |
| | | { |
| | | byte |= 1<<i; |
| | | } |
| | | |
| | | /* Read slot for >= 60us */ |
| | | delay_us(60); |
| | | |
| | | /* Release W1 bus to high */ |
| | | W1DQ_Output(); |
| | | W1DQ_Write(1); |
| | | delay_us(2); |
| | | } |
| | | |
| | | return byte; |
| | | } |
| | | |
| | | static inline int DS18B20_Start_Convert(void) |
| | | { |
| | | /* Master issues reset pulse and DS18B20s respond with presence pulse */ |
| | | if( 0 != DS18B20_Reset() ) |
| | | return -1; |
| | | |
| | | /* Master issues Skip ROM command */ |
| | | DS18B20_WriteByte(0xCC); |
| | | |
| | | /* Master issues Convert T command. */ |
| | | DS18B20_WriteByte(0x44); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | static inline int DS18B20_Start_Read(uint8_t *buf, int bytes) |
| | | { |
| | | /* Master issues reset pulse and DS18B20s respond with presence pulse */ |
| | | if( 0 != DS18B20_Reset() ) |
| | | return -1; |
| | | |
| | | /* Master issues Skip ROM command */ |
| | | DS18B20_WriteByte(0xCC); |
| | | |
| | | /* Master issues Read Scratchpad command. */ |
| | | DS18B20_WriteByte(0xBE); |
| | | |
| | | buf[0] = DS18B20_ReadByte(); /* Temperature LSB */ |
| | | buf[1] = DS18B20_ReadByte(); /* Temperature MSB */ |
| | | |
| | | /*Don't care followed 7 bytes data */ |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int DS18B20_SampleData(float *temperature) |
| | | { |
| | | uint8_t byte[2]; |
| | | uint8_t sign; |
| | | uint16_t temp; |
| | | |
| | | if( !temperature ) |
| | | return -1; |
| | | |
| | | if( 0 != DS18B20_Start_Convert() ) |
| | | return -2; |
| | | |
| | | if( 0 != DS18B20_Start_Read(byte, 2) ) |
| | | return -3; |
| | | |
| | | /* Temperature byte[0] is LSB, byte[1] is MSB, total 16 bit: |
| | | * Byte[0]: bit[3:0]: decimal bits, bit[7:4]: integer bits |
| | | * bYTE[1]: bit[2:0]: integer bits, bit[7:3]: sign bits |
| | | */ |
| | | if( byte[1]> 0x7 ) /* bit[7:3] is 1 */ |
| | | { |
| | | temp = ~(byte[1]<<8|byte[0]) + 1; //补码 |
| | | sign=0; //温度为负 |
| | | } |
| | | else |
| | | { |
| | | sign=1;//温度为正 |
| | | temp = byte[1]<<8 | byte[0]; |
| | | } |
| | | |
| | | /* byte[1]的低三位和byte[0]的高四位组成温度值的整数部分, |
| | | * 而byte[0]的低四位为小数精度部分,且精度系数为0.0625 */ |
| | | *temperature = (temp>>4) + (temp&0xF)*0.0625 ; |
| | | if( !sign ) |
| | | { |
| | | *temperature = -*temperature; |
| | | } |
| | | |
| | | return 0; |
| | | } |
New file |
| | |
| | | #include <stdlib.h> |
| | | #include "usart.h" |
| | | #include "esp8266.h" |
| | | |
| | | /* WiFi模块驱动调试宏,注释下面两个宏定义可以取消调试打印 */ |
| | | //#define CONFIG_WIFI_DEBUG |
| | | #define CONFIG_WIFI_PRINT |
| | | |
| | | #ifdef CONFIG_WIFI_DEBUG |
| | | #define wifi_dbg(format,args...) printf(format, ##args) |
| | | #else |
| | | #define wifi_dbg(format,args...) do{} while(0) |
| | | #endif |
| | | |
| | | #ifdef CONFIG_WIFI_PRINT |
| | | #define wifi_print(format,args...) printf(format, ##args) |
| | | #else |
| | | #define wifi_print(format,args...) do{} while(0) |
| | | #endif |
| | | |
| | | |
| | | int send_atcmd(char *atcmd, char *expect_reply, unsigned int timeout) |
| | | { |
| | | int rv = 1; |
| | | unsigned int i; |
| | | char *expect; |
| | | |
| | | /* check function input arguments validation */ |
| | | if( !atcmd || strlen(atcmd)<=0 ) |
| | | { |
| | | wifi_print("ERROR: Invalid input arguments\r\n"); |
| | | return -1; |
| | | } |
| | | |
| | | wifi_dbg("\r\nStart send AT command: %s", atcmd); |
| | | clear_atcmd_buf(); |
| | | HAL_UART_Transmit(wifi_huart, (uint8_t *)atcmd, strlen(atcmd), 1000); |
| | | |
| | | expect = expect_reply ? expect_reply : "OK\r\n"; |
| | | |
| | | /* Receive AT reply string by UART interrupt handler, stop by "OK/ERROR" or timeout */ |
| | | for(i=0; i<timeout; i++) |
| | | { |
| | | if( strstr(g_wifi_rxbuf, expect) ) |
| | | { |
| | | wifi_dbg("AT command Got expect reply '%s'\r\n", expect); |
| | | rv = 0; |
| | | goto CleanUp; |
| | | } |
| | | |
| | | if( strstr(g_wifi_rxbuf, "ERROR\r\n") || strstr(g_wifi_rxbuf, "FAIL\r\n")) |
| | | { |
| | | rv = 2; |
| | | goto CleanUp; |
| | | } |
| | | |
| | | HAL_Delay(1); |
| | | } |
| | | |
| | | |
| | | CleanUp: |
| | | wifi_dbg("<<<< AT command reply:\r\n%s", g_wifi_rxbuf); |
| | | return rv; |
| | | } |
| | | |
| | | int atcmd_send_data(unsigned char *data, int bytes, unsigned int timeout) |
| | | { |
| | | int rv = -1; |
| | | unsigned int i; |
| | | |
| | | /* check function input arguments validation */ |
| | | if( !data || bytes <= 0 ) |
| | | { |
| | | wifi_print("ERROR: Invalid input arguments\r\n"); |
| | | return -1; |
| | | } |
| | | |
| | | wifi_dbg("\r\nStart AT command send [%d] bytes data\n", bytes); |
| | | |
| | | clear_atcmd_buf(); |
| | | HAL_UART_Transmit(wifi_huart, data, bytes, 1000); |
| | | |
| | | /* Receive AT reply string by UART interrupt handler, stop by "OK/ERROR" or timeout */ |
| | | for(i=0; i<timeout; i++) |
| | | { |
| | | if( strstr(g_wifi_rxbuf, "SEND OK\r\n") ) |
| | | { |
| | | rv = 0; |
| | | goto CleanUp; |
| | | } |
| | | |
| | | if( strstr(g_wifi_rxbuf, "ERROR\r\n") ) |
| | | { |
| | | rv = 1; |
| | | goto CleanUp; |
| | | } |
| | | |
| | | HAL_Delay(1); |
| | | } |
| | | |
| | | |
| | | CleanUp: |
| | | wifi_dbg("<<<< AT command reply:\r\n%s", g_wifi_rxbuf); |
| | | return rv; |
| | | } |
| | | |
| | | |
| | | int esp8266_module_init(void) |
| | | { |
| | | int i; |
| | | |
| | | wifi_print("INFO: Reset ESP8266 module now...\r\n"); |
| | | send_atcmd("AT+RST\r\n", EXPECT_OK, 500); |
| | | |
| | | for(i=0; i<6; i++) |
| | | { |
| | | if( !send_atcmd("AT\r\n", EXPECT_OK, 500) ) |
| | | { |
| | | wifi_print("INFO: Send AT to ESP8266 and got reply ok\r\n"); |
| | | break; |
| | | } |
| | | |
| | | HAL_Delay(100); |
| | | } |
| | | |
| | | if( i>= 6 ) |
| | | { |
| | | wifi_print("ERROR: Can't receive AT replay after reset\r\n"); |
| | | return -2; |
| | | } |
| | | |
| | | if( send_atcmd("AT+CWMODE=1\r\n", EXPECT_OK, 500) ) |
| | | { |
| | | wifi_print("ERROR: Set ESP8266 work as Station mode failure\r\n"); |
| | | return -3; |
| | | } |
| | | |
| | | if( send_atcmd("AT+CWDHCP=1,1\r\n", EXPECT_OK, 500) ) |
| | | { |
| | | wifi_print("ERROR: Enable ESP8266 Station mode DHCP failure\r\n"); |
| | | return -4; |
| | | } |
| | | |
| | | #if 0 |
| | | if( send_atcmd("AT+GMR\r\n", EXPECT_OK, 500) ) |
| | | { |
| | | wifi_print("ERROR: AT+GMR check ESP8266 reversion failure\r\n"); |
| | | return -5; |
| | | } |
| | | #endif |
| | | |
| | | HAL_Delay(500); |
| | | return 0; |
| | | } |
| | | |
| | | int esp8266_join_network(char *ssid, char *pwd) |
| | | { |
| | | char atcmd[128] = {0x00}; |
| | | int i; |
| | | |
| | | if( !ssid || !pwd ) |
| | | { |
| | | wifi_print("ERROR: Invalid input arguments\r\n"); |
| | | return -1; |
| | | } |
| | | |
| | | snprintf(atcmd, sizeof(atcmd), "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pwd); |
| | | if( send_atcmd(atcmd, "CONNECTED", 10000) ) |
| | | { |
| | | wifi_print("ERROR: ESP8266 connect to '%s' failure\r\n", ssid); |
| | | return -2; |
| | | } |
| | | wifi_print("INFO: ESP8266 connect to '%s' ok\r\n", ssid); |
| | | |
| | | /* check got IP address or not by netmask (255.)*/ |
| | | for(i=0; i<10; i++) |
| | | { |
| | | if( !send_atcmd("AT+CIPSTA_CUR?\r\n", "255.", 1000) ) |
| | | { |
| | | wifi_print("INFO: ESP8266 got IP address ok\r\n"); |
| | | return 0; |
| | | } |
| | | |
| | | HAL_Delay(300); |
| | | } |
| | | |
| | | wifi_print("ERROR: ESP8266 assigned IP address failure\r\n"); |
| | | return -3; |
| | | } |
| | | |
| | | /* |
| | | Reply for AT+CIPSTA_CUR? : |
| | | +CIPSTA_CUR:ip:"192.168.2.100" |
| | | +CIPSTA_CUR:gateway:"192.168.2.1" |
| | | +CIPSTA_CUR:netmask:"255.255.255.0" |
| | | */ |
| | | static int util_parser_ipaddr(char *buf, char *key, char *ipaddr, int size) |
| | | { |
| | | char *start; |
| | | char *end; |
| | | int len; |
| | | |
| | | if( !buf || !key || !ipaddr ) |
| | | { |
| | | return -1; |
| | | } |
| | | |
| | | /* find the key string */ |
| | | start = strstr(buf, key); |
| | | if( !start ) |
| | | { |
| | | return -2; |
| | | } |
| | | |
| | | start+=strlen(key) + 1; /* Skip " */ |
| | | end = strchr(start, '"'); /* find last " */ |
| | | if( !end ) |
| | | { |
| | | return -3; |
| | | } |
| | | |
| | | len = end - start; |
| | | len = len>size ? size : len; |
| | | |
| | | memset(ipaddr, 0, size); |
| | | strncpy(ipaddr, start, len); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int esp8266_get_ipaddr(char *ipaddr, char *gateway, int ipaddr_size) |
| | | { |
| | | if( !ipaddr || !gateway || ipaddr_size<7 ) |
| | | { |
| | | wifi_print("ERROR: Invalid input arguments\r\n"); |
| | | return -1; |
| | | } |
| | | |
| | | if( send_atcmd("AT+CIPSTA_CUR?\r\n", "255.", 1000) ) |
| | | { |
| | | wifi_print("ERROR: ESP8266 AT+CIPSTA_CUR? command failure\r\n"); |
| | | return -2; |
| | | } |
| | | |
| | | if( util_parser_ipaddr(g_wifi_rxbuf, "ip:", ipaddr, ipaddr_size) ) |
| | | { |
| | | wifi_print("ERROR: ESP8266 AT+CIPSTA_CUR? parser IP address failure\r\n"); |
| | | return -3; |
| | | } |
| | | |
| | | if( util_parser_ipaddr(g_wifi_rxbuf, "gateway:", gateway, ipaddr_size) ) |
| | | { |
| | | wifi_print("ERROR: ESP8266 AT+CIPSTA_CUR? parser gateway failure\r\n"); |
| | | return -4; |
| | | } |
| | | |
| | | wifi_print("INFO: ESP8266 got IP address[%s] gateway[%s] ok\r\n", ipaddr, gateway); |
| | | return 0; |
| | | } |
| | | |
| | | int esp8266_ping_test(char *host) |
| | | { |
| | | char atcmd[128] = {0x00}; |
| | | |
| | | if( !host ) |
| | | { |
| | | wifi_print("ERROR: Invalid input arguments\r\n"); |
| | | return -1; |
| | | } |
| | | |
| | | snprintf(atcmd, sizeof(atcmd), "AT+PING=\"%s\"\r\n", host); |
| | | if( send_atcmd(atcmd, EXPECT_OK, 3000) ) |
| | | { |
| | | wifi_print("ERROR: ESP8266 ping test [%s] failure\r\n", host); |
| | | return -2; |
| | | } |
| | | |
| | | wifi_print("INFO: ESP8266 ping test [%s] ok\r\n", host); |
| | | return 0; |
| | | } |
| | | |
| | | int esp8266_sock_connect(char *servip, int port) |
| | | { |
| | | char atcmd[128] = {0x00}; |
| | | |
| | | if( !servip || port<=0 ) |
| | | { |
| | | wifi_print("ERROR: Invalid input arguments\r\n"); |
| | | return -1; |
| | | } |
| | | |
| | | send_atcmd("AT+CIPMUX=0\r\n", EXPECT_OK, 1500); |
| | | |
| | | snprintf(atcmd, sizeof(atcmd), "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", servip, port); |
| | | if( send_atcmd(atcmd, "CONNECT\r\n", 1000) ) |
| | | { |
| | | wifi_print("ERROR: ESP8266 socket connect to [%s:%d] failure\r\n", servip, port); |
| | | return -2; |
| | | } |
| | | |
| | | wifi_print("INFO: ESP8266 socket connect to [%s:%d] ok\r\n", servip, port); |
| | | return 0; |
| | | } |
| | | |
| | | int esp8266_sock_disconnect(void) |
| | | { |
| | | send_atcmd("AT+CIPCLOSE\r\n", EXPECT_OK, 1500); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int esp8266_sock_send(unsigned char *data, int bytes) |
| | | { |
| | | char atcmd[128] = {0x00}; |
| | | |
| | | if( !data || bytes<= 0) |
| | | { |
| | | wifi_print("ERROR: Invalid input arguments\r\n"); |
| | | return -1; |
| | | } |
| | | |
| | | snprintf(atcmd, sizeof(atcmd), "AT+CIPSEND=%d\r\n", bytes); |
| | | if( send_atcmd(atcmd, ">", 500) ) |
| | | { |
| | | wifi_print("ERROR: AT+CIPSEND command failure\r\n"); |
| | | return 0; |
| | | } |
| | | |
| | | if( atcmd_send_data((unsigned char *)data, bytes, 1000) ) |
| | | { |
| | | wifi_print("ERROR: AT+CIPSEND send data failure\r\n"); |
| | | return 0; |
| | | } |
| | | |
| | | return bytes; |
| | | } |
| | | |
| | | |
| | | int esp8266_sock_recv(unsigned char *buf, int size) |
| | | { |
| | | char *data = NULL; |
| | | char *ptr = NULL; |
| | | |
| | | int len; |
| | | int rv; |
| | | int bytes; |
| | | |
| | | if( !buf || size<= 0) |
| | | { |
| | | wifi_print("ERROR: Invalid input arguments\r\n"); |
| | | return -1; |
| | | } |
| | | |
| | | if( g_wifi_rxbytes<= 0 ) |
| | | { |
| | | return 0; |
| | | } |
| | | |
| | | /* No data arrive or not integrated */ |
| | | if( !(ptr=strstr(g_wifi_rxbuf, "+IPD,")) || !(data=strchr( g_wifi_rxbuf, ':' )) ) |
| | | { |
| | | return 0; |
| | | } |
| | | |
| | | data ++; |
| | | bytes = atoi(ptr+strlen("+IPD,")); |
| | | |
| | | len = g_wifi_rxbytes - (data-g_uart2_rxbuf); |
| | | |
| | | if( len < bytes ) |
| | | { |
| | | wifi_dbg("+IPD data not receive over, receive again later ...\r\n"); |
| | | return 0; |
| | | } |
| | | |
| | | memset(buf, 0, size); |
| | | rv = bytes>size ? size : bytes; |
| | | memcpy(buf, data, rv); |
| | | |
| | | clear_atcmd_buf(); |
| | | |
| | | return rv; |
| | | } |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file gpio.c |
| | | * @brief This file provides code for the configuration |
| | | * of all used GPIO pins. |
| | | ****************************************************************************** |
| | | * @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 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | |
| | | /* Includes ------------------------------------------------------------------*/ |
| | | #include "gpio.h" |
| | | |
| | | /* USER CODE BEGIN 0 */ |
| | | |
| | | /* USER CODE END 0 */ |
| | | |
| | | /*----------------------------------------------------------------------------*/ |
| | | /* Configure GPIO */ |
| | | /*----------------------------------------------------------------------------*/ |
| | | /* USER CODE BEGIN 1 */ |
| | | |
| | | /* USER CODE END 1 */ |
| | | |
| | | /** Configure pins as |
| | | * Analog |
| | | * Input |
| | | * Output |
| | | * EVENT_OUT |
| | | * EXTI |
| | | */ |
| | | 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, Relay1_Pin|Relay2_Pin, GPIO_PIN_RESET); |
| | | |
| | | /*Configure GPIO pin Output Level */ |
| | | HAL_GPIO_WritePin(GPIOB, SysLed_Pin|BlueLed_Pin|RedLed_Pin|GreenLed_Pin, GPIO_PIN_SET); |
| | | |
| | | /*Configure GPIO pin : PtPin */ |
| | | GPIO_InitStruct.Pin = Key1_Pin; |
| | | GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; |
| | | GPIO_InitStruct.Pull = GPIO_PULLUP; |
| | | HAL_GPIO_Init(Key1_GPIO_Port, &GPIO_InitStruct); |
| | | |
| | | /*Configure GPIO pins : PBPin PBPin PBPin PBPin |
| | | PBPin PBPin */ |
| | | GPIO_InitStruct.Pin = Relay1_Pin|Relay2_Pin|SysLed_Pin|BlueLed_Pin |
| | | |RedLed_Pin|GreenLed_Pin; |
| | | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; |
| | | GPIO_InitStruct.Pull = GPIO_NOPULL; |
| | | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
| | | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); |
| | | |
| | | /*Configure GPIO pin : PtPin */ |
| | | GPIO_InitStruct.Pin = Key2_Pin; |
| | | GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; |
| | | GPIO_InitStruct.Pull = GPIO_PULLUP; |
| | | HAL_GPIO_Init(Key2_GPIO_Port, &GPIO_InitStruct); |
| | | |
| | | /* EXTI interrupt init*/ |
| | | HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0); |
| | | HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); |
| | | |
| | | } |
| | | |
| | | /* USER CODE BEGIN 2 */ |
| | | |
| | | gpio_t leds[LedMax] = |
| | | { |
| | | { "SysLed", SysLed_GPIO_Port, SysLed_Pin}, |
| | | { "RedLed", RedLed_GPIO_Port, RedLed_Pin}, |
| | | { "GreenLed", GreenLed_GPIO_Port, GreenLed_Pin}, |
| | | { "BlueLed", BlueLed_GPIO_Port, BlueLed_Pin}, |
| | | }; |
| | | |
| | | gpio_t relays[RelayMax] = |
| | | { |
| | | { "Relay1", Relay1_GPIO_Port, Relay1_Pin}, |
| | | { "Relay2", Relay2_GPIO_Port, Relay2_Pin}, |
| | | }; |
| | | |
| | | void turn_relay(int which, int status) |
| | | { |
| | | GPIO_PinState level; |
| | | |
| | | if( which >= LedMax ) |
| | | return ; |
| | | |
| | | level = status==OFF ? GPIO_PIN_RESET : GPIO_PIN_SET; |
| | | |
| | | HAL_GPIO_WritePin(relays[which].group, relays[which].pin, level); |
| | | } |
| | | |
| | | |
| | | void turn_led(int which, int status) |
| | | { |
| | | GPIO_PinState level; |
| | | |
| | | if( which >= LedMax ) |
| | | return ; |
| | | |
| | | level = status==OFF ? GPIO_PIN_SET : GPIO_PIN_RESET; |
| | | |
| | | HAL_GPIO_WritePin(leds[which].group, leds[which].pin, level); |
| | | } |
| | | |
| | | void blink_led(int which, uint32_t interval) |
| | | { |
| | | turn_led(which, ON); |
| | | HAL_Delay(interval); |
| | | |
| | | turn_led(which, OFF); |
| | | HAL_Delay(interval); |
| | | } |
| | | |
| | | |
| | | void sysled_hearbeat(void) |
| | | { |
| | | blink_led(SysLed, 100); |
| | | blink_led(SysLed, 100); |
| | | blink_led(SysLed, 800); |
| | | } |
| | | |
| | | |
| | | void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) |
| | | { |
| | | static uint8_t relay1_status = OFF; |
| | | static uint8_t relay2_status = OFF; |
| | | |
| | | |
| | | if( Key1_Pin == GPIO_Pin ) |
| | | { |
| | | relay1_status ^= 1; |
| | | turn_relay(Relay1, relay1_status); |
| | | } |
| | | else if( Key2_Pin == GPIO_Pin ) |
| | | { |
| | | relay2_status ^= 1; |
| | | turn_relay(Relay2, relay2_status); |
| | | } |
| | | } |
| | | |
| | | /* USER CODE END 2 */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /********************************************************************** |
| | | * Copyright: (C)2021 LingYun IoT System Studio <www.weike-iot.com> |
| | | * Author: GuoWenxue<guowenxue@gmail.com> QQ: 281143292 |
| | | * Description: BearKE1 NB-IoT Board GPIO simulate I2C bus source code |
| | | * |
| | | * Notice: Must implement delay_us() by timer in tim.h first. |
| | | * |
| | | * ChangeLog: |
| | | * Version Date Author Description |
| | | * V1.0.0 2021.08.10 GuoWenxue Release initial version |
| | | ***********************************************************************/ |
| | | |
| | | #include <stdio.h> |
| | | #include "stm32l4xx_hal.h" |
| | | #include "tim.h" /* delay_us() implement */ |
| | | #include "gpio.h" |
| | | #include "gpio_i2c.h" |
| | | |
| | | |
| | | /* comment follow macro will disable I2C bus clock stretching support |
| | | * reference: http://www.i2c-bus.org/clock-stretching/ |
| | | */ |
| | | #define I2C_CLK_STRETCH_TIMEOUT 50 |
| | | |
| | | /* uncomment follow macro will enable debug print */ |
| | | //#define CONFIG_GPIO_I2C_DEBUG |
| | | |
| | | #ifdef CONFIG_GPIO_I2C_DEBUG |
| | | #define i2c_print(format,args...) printf(format, ##args) |
| | | #else |
| | | #define i2c_print(format,args...) do{} while(0) |
| | | #endif |
| | | |
| | | /* GPIO Simulate I2C Bus pins */ |
| | | typedef struct i2c_gpio_s |
| | | { |
| | | GPIO_TypeDef *group; |
| | | uint16_t scl; /* SCL */ |
| | | uint16_t sda; /* SDA */ |
| | | } i2c_gpio_t; |
| | | |
| | | static i2c_gpio_t i2c_pins = { GPIOB, GPIO_PIN_13/*SCL*/, GPIO_PIN_14/*SDA*/ }; |
| | | |
| | | |
| | | #define SDA_IN() do{ GPIO_InitTypeDef GPIO_InitStruct = {0}; \ |
| | | GPIO_InitStruct.Pin = i2c_pins.sda; \ |
| | | GPIO_InitStruct.Mode = GPIO_MODE_INPUT; \ |
| | | GPIO_InitStruct.Pull = GPIO_PULLUP; \ |
| | | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; \ |
| | | HAL_GPIO_Init(i2c_pins.group, &GPIO_InitStruct); \ |
| | | }while(0) |
| | | |
| | | |
| | | #define SDA_OUT() do{ GPIO_InitTypeDef GPIO_InitStruct = {0}; \ |
| | | GPIO_InitStruct.Pin = i2c_pins.sda; \ |
| | | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \ |
| | | GPIO_InitStruct.Pull = GPIO_PULLUP; \ |
| | | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; \ |
| | | HAL_GPIO_Init(i2c_pins.group, &GPIO_InitStruct); \ |
| | | }while(0) |
| | | |
| | | #define SCL_OUT() do{ GPIO_InitTypeDef GPIO_InitStruct = {0}; \ |
| | | GPIO_InitStruct.Pin = i2c_pins.scl; \ |
| | | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \ |
| | | GPIO_InitStruct.Pull = GPIO_PULLUP; \ |
| | | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; \ |
| | | HAL_GPIO_Init(i2c_pins.group, &GPIO_InitStruct); \ |
| | | }while(0) |
| | | |
| | | |
| | | #define SCL_H() HAL_GPIO_WritePin(i2c_pins.group, i2c_pins.scl, GPIO_PIN_SET) |
| | | #define SCL_L() HAL_GPIO_WritePin(i2c_pins.group, i2c_pins.scl, GPIO_PIN_RESET) |
| | | #define SDA_H() HAL_GPIO_WritePin(i2c_pins.group, i2c_pins.sda, GPIO_PIN_SET) |
| | | #define SDA_L() HAL_GPIO_WritePin(i2c_pins.group, i2c_pins.sda, GPIO_PIN_RESET) |
| | | |
| | | #define READ_SDA() HAL_GPIO_ReadPin(i2c_pins.group, i2c_pins.sda) |
| | | #define READ_SCL() HAL_GPIO_ReadPin(i2c_pins.group, i2c_pins.scl) |
| | | |
| | | |
| | | static inline uint8_t I2c_WaitWhileClockStretching(uint16_t timeout) |
| | | { |
| | | while( timeout-- > 0 ) |
| | | { |
| | | if( READ_SCL() ) |
| | | break; |
| | | |
| | | delay_us(1); |
| | | } |
| | | |
| | | return timeout ? NO_ERROR : BUS_ERROR; |
| | | } |
| | | |
| | | /* StartCondition(S) */ |
| | | uint8_t I2c_StartCondition() |
| | | { |
| | | uint8_t rv = NO_ERROR; |
| | | |
| | | SDA_OUT(); |
| | | SCL_OUT(); |
| | | |
| | | /* StartCondition(S): A high to low transition on the SDA line while SCL is high. |
| | | _______ |
| | | SCL: |___ |
| | | _____ |
| | | SDA: |_____ |
| | | */ |
| | | SDA_H(); |
| | | delay_us(1); |
| | | SCL_H(); |
| | | delay_us(1); |
| | | |
| | | #ifdef I2C_CLK_STRETCH_TIMEOUT |
| | | rv = I2c_WaitWhileClockStretching(I2C_CLK_STRETCH_TIMEOUT); |
| | | if( rv ) |
| | | { |
| | | i2c_print("ERROR: %s() I2C bus busy\n", __func__); |
| | | return rv; |
| | | } |
| | | #endif |
| | | |
| | | SDA_L(); |
| | | delay_us(2); |
| | | |
| | | SCL_L(); |
| | | delay_us(2); |
| | | |
| | | return rv; |
| | | } |
| | | |
| | | |
| | | /* StopCondition(P) */ |
| | | uint8_t I2c_StopCondition(void) |
| | | { |
| | | uint8_t rv = NO_ERROR; |
| | | |
| | | SDA_OUT(); |
| | | |
| | | /* StopCondition(P): A low to high transition on the SDA line while SCL is high. |
| | | _____ |
| | | SCL: ___| |
| | | _____ |
| | | SDA: _____| |
| | | */ |
| | | SCL_L(); |
| | | SDA_L(); |
| | | delay_us(2); |
| | | |
| | | SCL_H(); |
| | | delay_us(2); |
| | | |
| | | #ifdef I2C_CLK_STRETCH_TIMEOUT |
| | | rv = I2c_WaitWhileClockStretching(I2C_CLK_STRETCH_TIMEOUT); |
| | | if( rv ) |
| | | { |
| | | i2c_print("ERROR: %s() I2C bus busy\n", __func__); |
| | | } |
| | | #endif |
| | | |
| | | SDA_H(); |
| | | delay_us(2); |
| | | |
| | | return rv; |
| | | } |
| | | |
| | | |
| | | |
| | | uint8_t I2c_WriteByte(uint8_t byte) |
| | | { |
| | | uint8_t rv = NO_ERROR; |
| | | uint8_t mask; |
| | | |
| | | /* Data line changes must happened when SCL is low */ |
| | | SDA_OUT(); |
| | | SCL_L(); |
| | | |
| | | /* 1Byte=8bit, MSB send: bit[7]-->bit[0] */ |
| | | for(mask=0x80; mask>0; mask>>=1) |
| | | { |
| | | if((mask & byte) == 0) |
| | | SDA_L(); |
| | | else |
| | | SDA_H(); |
| | | |
| | | delay_us(1); // data set-up time (t_SU;DAT) |
| | | |
| | | SCL_H(); |
| | | delay_us(5); // SCL high time (t_HIGH) |
| | | |
| | | #ifdef I2C_CLK_STRETCH_TIMEOUT |
| | | rv = I2c_WaitWhileClockStretching(I2C_CLK_STRETCH_TIMEOUT); |
| | | if( rv ) |
| | | { |
| | | i2c_print("ERROR: %s() I2C bus busy\n", __func__); |
| | | goto OUT; |
| | | } |
| | | #endif |
| | | |
| | | SCL_L(); |
| | | delay_us(1); // data hold time(t_HD;DAT) |
| | | } |
| | | |
| | | /* clk #9 wait ACK/NAK from slave */ |
| | | SDA_IN(); |
| | | SCL_H(); // clk #9 for ack |
| | | delay_us(1); // data set-up time (t_SU;DAT) |
| | | |
| | | #ifdef I2C_CLK_STRETCH_TIMEOUT |
| | | rv = I2c_WaitWhileClockStretching(I2C_CLK_STRETCH_TIMEOUT); |
| | | if( rv ) |
| | | { |
| | | i2c_print("ERROR: %s() I2C bus busy\n", __func__); |
| | | goto OUT; |
| | | } |
| | | #endif |
| | | |
| | | /* High level means NAK */ |
| | | if( READ_SDA() ) |
| | | rv = ACK_ERROR; |
| | | |
| | | OUT: |
| | | SCL_L(); |
| | | delay_us(20); |
| | | |
| | | return rv; |
| | | } |
| | | |
| | | |
| | | |
| | | uint8_t I2c_ReadByte(uint8_t *byte, uint8_t ack) |
| | | { |
| | | uint8_t rv = NO_ERROR; |
| | | uint8_t mask; |
| | | |
| | | *byte = 0x00; |
| | | |
| | | SDA_IN(); |
| | | |
| | | /* 1Byte=8bit, MSB send: bit[7]-->bit[0] */ |
| | | for(mask = 0x80; mask > 0; mask >>= 1) |
| | | { |
| | | SCL_H(); // start clock on SCL-line |
| | | delay_us(1); // clock set-up time (t_SU;CLK) |
| | | |
| | | #ifdef I2C_CLK_STRETCH_TIMEOUT |
| | | rv = I2c_WaitWhileClockStretching(I2C_CLK_STRETCH_TIMEOUT); |
| | | if( rv ) |
| | | { |
| | | i2c_print("ERROR: %s() I2C bus busy\n", __func__); |
| | | goto OUT; |
| | | } |
| | | #endif |
| | | |
| | | if(READ_SDA()) |
| | | *byte |= mask; // read bit |
| | | |
| | | SCL_L(); |
| | | delay_us(1); // data hold time(t_HD;DAT) |
| | | } |
| | | |
| | | /* clk #9 send ACK/NAK to slave */ |
| | | |
| | | if(ack == ACK) |
| | | { |
| | | SDA_OUT(); |
| | | SDA_L(); // send Acknowledge if necessary |
| | | } |
| | | else if( ack == NAK ) |
| | | { |
| | | SDA_OUT(); |
| | | SDA_H(); // send NotAcknowledge if necessary |
| | | } |
| | | |
| | | delay_us(1); // data set-up time (t_SU;DAT) |
| | | SCL_H(); // clk #9 for ack |
| | | delay_us(2); // SCL high time (t_HIGH) |
| | | |
| | | #ifdef I2C_CLK_STRETCH_TIMEOUT |
| | | rv = I2c_WaitWhileClockStretching(I2C_CLK_STRETCH_TIMEOUT); |
| | | if( rv ) |
| | | { |
| | | i2c_print("ERROR: %s() I2C bus busy\n", __func__); |
| | | } |
| | | #endif |
| | | |
| | | OUT: |
| | | SCL_L(); |
| | | delay_us(2); // wait to see byte package on scope |
| | | |
| | | return rv; |
| | | } |
| | | |
| | | |
| | | uint8_t I2c_SendAddress(uint8_t addr) |
| | | { |
| | | return I2c_WriteByte(addr); |
| | | } |
| | | |
| | | |
| | | int I2C_Master_Receive(uint8_t addr, uint8_t *buf, int len) |
| | | { |
| | | int i; |
| | | int rv = NO_ERROR; |
| | | uint8_t byte; |
| | | |
| | | I2c_StartCondition(); |
| | | |
| | | rv = I2c_SendAddress(addr); |
| | | if( rv ) |
| | | { |
| | | i2c_print("Send I2C read address failure, rv=%d\n", rv); |
| | | goto OUT; |
| | | } |
| | | |
| | | #ifdef I2C_CLK_STRETCH_TIMEOUT |
| | | /* wait while clock streching */ |
| | | rv = I2c_WaitWhileClockStretching(I2C_CLK_STRETCH_TIMEOUT); |
| | | if( rv ) |
| | | { |
| | | i2c_print("ERROR: %s() I2C wait clock stretching failure, rv=%d\n", __func__, rv); |
| | | return rv; |
| | | } |
| | | #endif |
| | | |
| | | for (i=0; i<len; i++) |
| | | { |
| | | if( !I2c_ReadByte(&byte, ACK) ) |
| | | buf[i] = byte; |
| | | else |
| | | goto OUT; |
| | | } |
| | | |
| | | OUT: |
| | | I2c_StopCondition(); |
| | | return rv; |
| | | } |
| | | |
| | | |
| | | int I2C_Master_Transmit(uint8_t addr, uint8_t *data, int bytes) |
| | | { |
| | | |
| | | int i; |
| | | int rv = NO_ERROR; |
| | | |
| | | if(!data) |
| | | { |
| | | return PARM_ERROR; |
| | | } |
| | | |
| | | i2c_print("I2C Mastr start transimit [%d] bytes data to addr [0x%02x]\n", bytes, addr); |
| | | I2c_StartCondition(); |
| | | |
| | | rv = I2c_SendAddress(addr); |
| | | if( rv ) |
| | | { |
| | | goto OUT; |
| | | } |
| | | |
| | | for (i=0; i<bytes; i++) |
| | | { |
| | | if( NO_ERROR != (rv=I2c_WriteByte(data[i])) ) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | OUT: |
| | | I2c_StopCondition(); |
| | | return rv; |
| | | } |
| | | |
| | | |
| | | |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file i2c.c |
| | | * @brief This file provides code for the configuration |
| | | * of the I2C instances. |
| | | ****************************************************************************** |
| | | * @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 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | |
| | | /* Includes ------------------------------------------------------------------*/ |
| | | #include "i2c.h" |
| | | |
| | | /* USER CODE BEGIN 0 */ |
| | | |
| | | /* USER CODE END 0 */ |
| | | |
| | | I2C_HandleTypeDef hi2c2; |
| | | |
| | | /* I2C2 init function */ |
| | | void MX_I2C2_Init(void) |
| | | { |
| | | |
| | | /* USER CODE BEGIN I2C2_Init 0 */ |
| | | |
| | | /* USER CODE END I2C2_Init 0 */ |
| | | |
| | | /* USER CODE BEGIN I2C2_Init 1 */ |
| | | |
| | | /* USER CODE END I2C2_Init 1 */ |
| | | hi2c2.Instance = I2C2; |
| | | hi2c2.Init.Timing = 0x10909CEC; |
| | | hi2c2.Init.OwnAddress1 = 0; |
| | | hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; |
| | | hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; |
| | | hi2c2.Init.OwnAddress2 = 0; |
| | | hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK; |
| | | hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; |
| | | hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; |
| | | if (HAL_I2C_Init(&hi2c2) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | /** Configure Analogue filter |
| | | */ |
| | | if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | /** Configure Digital filter |
| | | */ |
| | | if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | /* USER CODE BEGIN I2C2_Init 2 */ |
| | | |
| | | /* USER CODE END I2C2_Init 2 */ |
| | | |
| | | } |
| | | |
| | | void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) |
| | | { |
| | | |
| | | GPIO_InitTypeDef GPIO_InitStruct = {0}; |
| | | RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; |
| | | if(i2cHandle->Instance==I2C2) |
| | | { |
| | | /* USER CODE BEGIN I2C2_MspInit 0 */ |
| | | |
| | | /* USER CODE END I2C2_MspInit 0 */ |
| | | /** Initializes the peripherals clock |
| | | */ |
| | | PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C2; |
| | | PeriphClkInit.I2c2ClockSelection = RCC_I2C2CLKSOURCE_PCLK1; |
| | | if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | |
| | | __HAL_RCC_GPIOB_CLK_ENABLE(); |
| | | /**I2C2 GPIO Configuration |
| | | PB13 ------> I2C2_SCL |
| | | PB14 ------> I2C2_SDA |
| | | */ |
| | | GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14; |
| | | GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; |
| | | GPIO_InitStruct.Pull = GPIO_NOPULL; |
| | | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; |
| | | GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; |
| | | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); |
| | | |
| | | /* I2C2 clock enable */ |
| | | __HAL_RCC_I2C2_CLK_ENABLE(); |
| | | /* USER CODE BEGIN I2C2_MspInit 1 */ |
| | | |
| | | /* USER CODE END I2C2_MspInit 1 */ |
| | | } |
| | | } |
| | | |
| | | void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) |
| | | { |
| | | |
| | | if(i2cHandle->Instance==I2C2) |
| | | { |
| | | /* USER CODE BEGIN I2C2_MspDeInit 0 */ |
| | | |
| | | /* USER CODE END I2C2_MspDeInit 0 */ |
| | | /* Peripheral clock disable */ |
| | | __HAL_RCC_I2C2_CLK_DISABLE(); |
| | | |
| | | /**I2C2 GPIO Configuration |
| | | PB13 ------> I2C2_SCL |
| | | PB14 ------> I2C2_SDA |
| | | */ |
| | | HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13); |
| | | |
| | | HAL_GPIO_DeInit(GPIOB, GPIO_PIN_14); |
| | | |
| | | /* USER CODE BEGIN I2C2_MspDeInit 1 */ |
| | | |
| | | /* USER CODE END I2C2_MspDeInit 1 */ |
| | | } |
| | | } |
| | | |
| | | /* USER CODE BEGIN 1 */ |
| | | |
| | | /* USER CODE END 1 */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New 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" |
| | | #include "adc.h" |
| | | #include "i2c.h" |
| | | #include "tim.h" |
| | | #include "usart.h" |
| | | #include "gpio.h" |
| | | |
| | | /* Private includes ----------------------------------------------------------*/ |
| | | /* USER CODE BEGIN Includes */ |
| | | #include <string.h> |
| | | #include "dht11.h" |
| | | #include "sht30.h" |
| | | #include "ds18b20.h" |
| | | #include "core_json.h" |
| | | #include "oled.h" |
| | | #include "esp8266.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 ---------------------------------------------------------*/ |
| | | |
| | | /* USER CODE BEGIN PV */ |
| | | #define FLAG_WIFI_CONNECTED (1<<0) |
| | | #define FLAG_SOCK_CONNECTED (1<<1) |
| | | /* USER CODE END PV */ |
| | | |
| | | /* Private function prototypes -----------------------------------------------*/ |
| | | void SystemClock_Config(void); |
| | | /* USER CODE BEGIN PFP */ |
| | | |
| | | /* USER CODE END PFP */ |
| | | |
| | | /* Private user code ---------------------------------------------------------*/ |
| | | /* USER CODE BEGIN 0 */ |
| | | static int report_tempRH_json(void); |
| | | static int parser_led_json(char *json_string, int bytes); |
| | | static void proc_uart1_recv(void); |
| | | /* USER CODE END 0 */ |
| | | |
| | | /** |
| | | * @brief The application entry point. |
| | | * @retval int |
| | | */ |
| | | int main(void) |
| | | { |
| | | /* USER CODE BEGIN 1 */ |
| | | uint32_t last_time = 0; |
| | | unsigned char buf[256]; |
| | | int rv; |
| | | char ipaddr[16]; |
| | | char gateway[16]; |
| | | unsigned char wifi_flag = 0; |
| | | /* 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_TIM6_Init(); |
| | | MX_TIM2_Init(); |
| | | MX_USART1_UART_Init(); |
| | | MX_ADC1_Init(); |
| | | MX_I2C2_Init(); |
| | | MX_USART2_UART_Init(); |
| | | /* USER CODE BEGIN 2 */ |
| | | |
| | | /* USER CODE END 2 */ |
| | | |
| | | /* Infinite loop */ |
| | | /* USER CODE BEGIN WHILE */ |
| | | |
| | | sysled_hearbeat(); |
| | | beep_start(2, 300); |
| | | printf("Start BearKE1 5G NB-IoT Board Example Program v3.0\r\n"); |
| | | |
| | | OLED_Init(); |
| | | OLED_ShowBanner(TIME_1S*2); |
| | | |
| | | esp8266_module_init(); |
| | | |
| | | while (1) |
| | | { |
| | | if( ! (wifi_flag&FLAG_WIFI_CONNECTED) ) |
| | | { |
| | | if( esp8266_join_network("Router_Home2G", "password") ) |
| | | { |
| | | esp8266_module_init(); |
| | | HAL_Delay(2000); |
| | | continue; |
| | | } |
| | | |
| | | if( esp8266_get_ipaddr(ipaddr, gateway, sizeof(ipaddr) ) ) |
| | | { |
| | | HAL_Delay(1000); |
| | | continue; |
| | | } |
| | | |
| | | if( esp8266_ping_test(gateway) ) |
| | | { |
| | | HAL_Delay(1000); |
| | | continue; |
| | | } |
| | | |
| | | wifi_flag |= FLAG_WIFI_CONNECTED; /* set wifi connected flag */ |
| | | } |
| | | |
| | | if( ! (wifi_flag&FLAG_SOCK_CONNECTED) ) |
| | | { |
| | | if( esp8266_sock_connect("192.168.2.103", 12345) ) |
| | | { |
| | | HAL_Delay(1000); |
| | | continue; |
| | | } |
| | | |
| | | wifi_flag |= FLAG_SOCK_CONNECTED; /* set socket connected flag */ |
| | | } |
| | | |
| | | if( (rv=esp8266_sock_recv(buf, sizeof(buf))) > 0 ) |
| | | { |
| | | printf("ESP8266 socket receive %d bytes data: %s\n", rv, buf); |
| | | parser_led_json((char *)buf, rv); |
| | | } |
| | | |
| | | if( time_after(HAL_GetTick(), last_time+3000) ) |
| | | { |
| | | rv = report_tempRH_json(); |
| | | if( 0 == rv ) |
| | | { |
| | | printf("ESP8266 socket send message ok\n"); |
| | | } |
| | | else |
| | | { |
| | | printf("ESP8266 socket send message failure, rv=%d\n", rv); |
| | | |
| | | wifi_flag &= ~FLAG_SOCK_CONNECTED; /* clear socket connected flag */ |
| | | |
| | | if( esp8266_ping_test(gateway) ) |
| | | { |
| | | wifi_flag &= ~FLAG_WIFI_CONNECTED; /* clear wifi connected flag */ |
| | | } |
| | | } |
| | | |
| | | last_time = HAL_GetTick(); /*update last report time */ |
| | | } |
| | | |
| | | /* USER CODE END WHILE */ |
| | | |
| | | /* USER CODE BEGIN 3 */ |
| | | } |
| | | /* USER CODE END 3 */ |
| | | } |
| | | |
| | | /** |
| | | * @brief System Clock Configuration |
| | | * @retval None |
| | | */ |
| | | void SystemClock_Config(void) |
| | | { |
| | | RCC_OscInitTypeDef RCC_OscInitStruct = {0}; |
| | | RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; |
| | | |
| | | /** Configure the main internal regulator output voltage |
| | | */ |
| | | if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | /** Initializes the RCC Oscillators according to the specified parameters |
| | | * in the RCC_OscInitTypeDef structure. |
| | | */ |
| | | RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; |
| | | RCC_OscInitStruct.HSEState = RCC_HSE_ON; |
| | | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; |
| | | RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; |
| | | RCC_OscInitStruct.PLL.PLLM = 1; |
| | | RCC_OscInitStruct.PLL.PLLN = 20; |
| | | RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; |
| | | RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; |
| | | RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; |
| | | if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | /** Initializes the CPU, AHB and APB buses clocks |
| | | */ |
| | | RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |
| | | |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; |
| | | RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; |
| | | RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; |
| | | RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; |
| | | RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; |
| | | |
| | | if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | } |
| | | |
| | | /* USER CODE BEGIN 4 */ |
| | | int report_tempRH_json(void) |
| | | { |
| | | char buf[128]; |
| | | float temperature, humidity=0.0; |
| | | uint32_t temp, humd; |
| | | int rv; |
| | | |
| | | if ( SHT30_SampleData(&temperature, &humidity) < 0 ) |
| | | { |
| | | printf("ERROR: SHT30 Sample data failure\n"); |
| | | return -1; |
| | | } |
| | | |
| | | memset(buf, 0, sizeof(buf)); |
| | | snprintf(buf, sizeof(buf), "{\"Temperature\":\"%.2f\", \"Humidity\":\"%.2f\"}", temperature, humidity); |
| | | |
| | | temp = (int)(temperature*100); |
| | | humd = (int)(humidity*100); |
| | | OLED_ShowTempHumdity(temp, humd, TIME_1S*2); |
| | | |
| | | rv = esp8266_sock_send((uint8_t *)buf, strlen(buf)); |
| | | |
| | | return rv>0 ? 0 : -2; |
| | | } |
| | | |
| | | int parser_led_json(char *json_string, int bytes) |
| | | { |
| | | JSONStatus_t result; |
| | | char save; |
| | | char *value; |
| | | size_t valen; |
| | | int i; |
| | | |
| | | printf("DBUG: Start parser JSON string: %s\r\n", json_string); |
| | | |
| | | result = JSON_Validate(json_string, bytes); |
| | | |
| | | /* JSON document is valid so far but incomplete */ |
| | | if( JSONPartial == result ) |
| | | { |
| | | printf("WARN: JSON document is valid so far but incomplete!\r\n"); |
| | | return 0; |
| | | } |
| | | |
| | | /* JSON document is not valid JSON */ |
| | | if( JSONSuccess != result ) |
| | | { |
| | | printf("ERROR: JSON document is not valid JSON!\r\n"); |
| | | return -1; |
| | | } |
| | | |
| | | /* Parser and set LED status */ |
| | | for(i=0; i<LedMax; i++) |
| | | { |
| | | result = JSON_Search( json_string, bytes, leds[i].name, strlen(leds[i].name), &value, &valen); |
| | | if( JSONSuccess == result ) |
| | | { |
| | | save = value[valen]; |
| | | value[valen] = '\0'; |
| | | |
| | | if( !strncasecmp(value, "on", 2) ) |
| | | { |
| | | printf("DBUG: turn %s on\r\n", leds[i].name); |
| | | turn_led(i, ON); |
| | | } |
| | | else if( !strncasecmp(value, "off", 3) ) |
| | | { |
| | | printf("DBUG: turn %s off\r\n", leds[i].name); |
| | | turn_led(i, OFF); |
| | | } |
| | | |
| | | value[valen] = save; |
| | | } |
| | | } |
| | | |
| | | return 1; |
| | | } |
| | | |
| | | void proc_uart1_recv(void) |
| | | { |
| | | if( g_uart1_bytes > 0 ) |
| | | { |
| | | HAL_Delay(200); |
| | | if( 0 != parser_led_json(g_uart1_rxbuf, g_uart1_bytes) ) |
| | | { |
| | | clear_uart1_rxbuf(); |
| | | } |
| | | } |
| | | } |
| | | /* 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****/ |
New file |
| | |
| | | #ifndef __FONT_ASCII_H |
| | | #define __FONT_ASCII_H |
| | | |
| | | #include <stdint.h> |
| | | |
| | | /************************************ ASCII font size 6x8 ************************************/ |
| | | static const uint8_t F6x8[][6] = |
| | | { |
| | | {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},// sp |
| | | {0x00, 0x00, 0x00, 0x2f, 0x00, 0x00},// ! |
| | | {0x00, 0x00, 0x07, 0x00, 0x07, 0x00},// " |
| | | {0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14},// # |
| | | {0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12},// $ |
| | | {0x00, 0x62, 0x64, 0x08, 0x13, 0x23},// % |
| | | {0x00, 0x36, 0x49, 0x55, 0x22, 0x50},// & |
| | | {0x00, 0x00, 0x05, 0x03, 0x00, 0x00},// ' |
| | | {0x00, 0x00, 0x1c, 0x22, 0x41, 0x00},// ( |
| | | {0x00, 0x00, 0x41, 0x22, 0x1c, 0x00},// ) |
| | | {0x00, 0x14, 0x08, 0x3E, 0x08, 0x14},// * |
| | | {0x00, 0x08, 0x08, 0x3E, 0x08, 0x08},// + |
| | | {0x00, 0x00, 0x00, 0xA0, 0x60, 0x00},// , |
| | | {0x00, 0x08, 0x08, 0x08, 0x08, 0x08},// - |
| | | {0x00, 0x00, 0x60, 0x60, 0x00, 0x00},// . |
| | | {0x00, 0x20, 0x10, 0x08, 0x04, 0x02},// / |
| | | {0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E},// 0 |
| | | {0x00, 0x00, 0x42, 0x7F, 0x40, 0x00},// 1 |
| | | {0x00, 0x42, 0x61, 0x51, 0x49, 0x46},// 2 |
| | | {0x00, 0x21, 0x41, 0x45, 0x4B, 0x31},// 3 |
| | | {0x00, 0x18, 0x14, 0x12, 0x7F, 0x10},// 4 |
| | | {0x00, 0x27, 0x45, 0x45, 0x45, 0x39},// 5 |
| | | {0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30},// 6 |
| | | {0x00, 0x01, 0x71, 0x09, 0x05, 0x03},// 7 |
| | | {0x00, 0x36, 0x49, 0x49, 0x49, 0x36},// 8 |
| | | {0x00, 0x06, 0x49, 0x49, 0x29, 0x1E},// 9 |
| | | {0x00, 0x00, 0x36, 0x36, 0x00, 0x00},// : |
| | | {0x00, 0x00, 0x56, 0x36, 0x00, 0x00},// ; |
| | | {0x00, 0x08, 0x14, 0x22, 0x41, 0x00},// < |
| | | {0x00, 0x14, 0x14, 0x14, 0x14, 0x14},// = |
| | | {0x00, 0x00, 0x41, 0x22, 0x14, 0x08},// > |
| | | {0x00, 0x02, 0x01, 0x51, 0x09, 0x06},// ? |
| | | {0x00, 0x32, 0x49, 0x59, 0x51, 0x3E},// @ |
| | | {0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C},// A |
| | | {0x00, 0x7F, 0x49, 0x49, 0x49, 0x36},// B |
| | | {0x00, 0x3E, 0x41, 0x41, 0x41, 0x22},// C |
| | | {0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C},// D |
| | | {0x00, 0x7F, 0x49, 0x49, 0x49, 0x41},// E |
| | | {0x00, 0x7F, 0x09, 0x09, 0x09, 0x01},// F |
| | | {0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A},// G |
| | | {0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F},// H |
| | | {0x00, 0x00, 0x41, 0x7F, 0x41, 0x00},// I |
| | | {0x00, 0x20, 0x40, 0x41, 0x3F, 0x01},// J |
| | | {0x00, 0x7F, 0x08, 0x14, 0x22, 0x41},// K |
| | | {0x00, 0x7F, 0x40, 0x40, 0x40, 0x40},// L |
| | | {0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F},// M |
| | | {0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F},// N |
| | | {0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E},// O |
| | | {0x00, 0x7F, 0x09, 0x09, 0x09, 0x06},// P |
| | | {0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E},// Q |
| | | {0x00, 0x7F, 0x09, 0x19, 0x29, 0x46},// R |
| | | {0x00, 0x46, 0x49, 0x49, 0x49, 0x31},// S |
| | | {0x00, 0x01, 0x01, 0x7F, 0x01, 0x01},// T |
| | | {0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F},// U |
| | | {0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F},// V |
| | | {0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F},// W |
| | | {0x00, 0x63, 0x14, 0x08, 0x14, 0x63},// X |
| | | {0x00, 0x07, 0x08, 0x70, 0x08, 0x07},// Y |
| | | {0x00, 0x61, 0x51, 0x49, 0x45, 0x43},// Z |
| | | {0x00, 0x00, 0x7F, 0x41, 0x41, 0x00},// [ |
| | | {0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55},// 55 |
| | | {0x00, 0x00, 0x41, 0x41, 0x7F, 0x00},// ] |
| | | {0x00, 0x04, 0x02, 0x01, 0x02, 0x04},// ^ |
| | | {0x00, 0x40, 0x40, 0x40, 0x40, 0x40},// _ |
| | | {0x00, 0x00, 0x01, 0x02, 0x04, 0x00},// ' |
| | | {0x00, 0x20, 0x54, 0x54, 0x54, 0x78},// a |
| | | {0x00, 0x7F, 0x48, 0x44, 0x44, 0x38},// b |
| | | {0x00, 0x38, 0x44, 0x44, 0x44, 0x20},// c |
| | | {0x00, 0x38, 0x44, 0x44, 0x48, 0x7F},// d |
| | | {0x00, 0x38, 0x54, 0x54, 0x54, 0x18},// e |
| | | {0x00, 0x08, 0x7E, 0x09, 0x01, 0x02},// f |
| | | {0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C},// g |
| | | {0x00, 0x7F, 0x08, 0x04, 0x04, 0x78},// h |
| | | {0x00, 0x00, 0x44, 0x7D, 0x40, 0x00},// i |
| | | {0x00, 0x40, 0x80, 0x84, 0x7D, 0x00},// j |
| | | {0x00, 0x7F, 0x10, 0x28, 0x44, 0x00},// k |
| | | {0x00, 0x00, 0x41, 0x7F, 0x40, 0x00},// l |
| | | {0x00, 0x7C, 0x04, 0x18, 0x04, 0x78},// m |
| | | {0x00, 0x7C, 0x08, 0x04, 0x04, 0x78},// n |
| | | {0x00, 0x38, 0x44, 0x44, 0x44, 0x38},// o |
| | | {0x00, 0xFC, 0x24, 0x24, 0x24, 0x18},// p |
| | | {0x00, 0x18, 0x24, 0x24, 0x18, 0xFC},// q |
| | | {0x00, 0x7C, 0x08, 0x04, 0x04, 0x08},// r |
| | | {0x00, 0x48, 0x54, 0x54, 0x54, 0x20},// s |
| | | {0x00, 0x04, 0x3F, 0x44, 0x40, 0x20},// t |
| | | {0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C},// u |
| | | {0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C},// v |
| | | {0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C},// w |
| | | {0x00, 0x44, 0x28, 0x10, 0x28, 0x44},// x |
| | | {0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C},// y |
| | | {0x00, 0x44, 0x64, 0x54, 0x4C, 0x44},// z |
| | | {0x14, 0x14, 0x14, 0x14, 0x14, 0x14},// horiz lines |
| | | }; |
| | | |
| | | /************************************ ASCII font size 8x16 ************************************/ |
| | | static const uint8_t F8X16[]= |
| | | { |
| | | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0 |
| | | 0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1 |
| | | 0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2 |
| | | 0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3 |
| | | 0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4 |
| | | 0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5 |
| | | 0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6 |
| | | 0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7 |
| | | 0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8 |
| | | 0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9 |
| | | 0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10 |
| | | 0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11 |
| | | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12 |
| | | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13 |
| | | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14 |
| | | 0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15 |
| | | 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16 |
| | | 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17 |
| | | 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18 |
| | | 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19 |
| | | 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20 |
| | | 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21 |
| | | 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22 |
| | | 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23 |
| | | 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24 |
| | | 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25 |
| | | 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26 |
| | | 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27 |
| | | 0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28 |
| | | 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29 |
| | | 0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30 |
| | | 0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31 |
| | | 0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32 |
| | | 0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33 |
| | | 0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34 |
| | | 0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35 |
| | | 0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36 |
| | | 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37 |
| | | 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38 |
| | | 0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39 |
| | | 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40 |
| | | 0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41 |
| | | 0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42 |
| | | 0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43 |
| | | 0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44 |
| | | 0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45 |
| | | 0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46 |
| | | 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47 |
| | | 0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48 |
| | | 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49 |
| | | 0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50 |
| | | 0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51 |
| | | 0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52 |
| | | 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53 |
| | | 0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54 |
| | | 0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55 |
| | | 0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56 |
| | | 0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57 |
| | | 0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58 |
| | | 0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59 |
| | | 0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60 |
| | | 0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61 |
| | | 0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62 |
| | | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63 |
| | | 0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64 |
| | | 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65 |
| | | 0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66 |
| | | 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67 |
| | | 0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68 |
| | | 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69 |
| | | 0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70 |
| | | 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71 |
| | | 0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72 |
| | | 0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73 |
| | | 0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74 |
| | | 0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75 |
| | | 0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76 |
| | | 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77 |
| | | 0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78 |
| | | 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79 |
| | | 0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80 |
| | | 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81 |
| | | 0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82 |
| | | 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83 |
| | | 0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84 |
| | | 0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85 |
| | | 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86 |
| | | 0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87 |
| | | 0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88 |
| | | 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89 |
| | | 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90 |
| | | 0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91 |
| | | 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92 |
| | | 0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93 |
| | | 0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94 |
| | | }; |
| | | |
| | | #endif |
| | | |
| | | |
New file |
| | |
| | | #ifndef __FONT_BMP_H |
| | | #define __FONT_BMP_H |
| | | |
| | | #include <stdint.h> |
| | | |
| | | /* lingyun logo-128x32.bmp */ |
| | | static uint8_t LOGO_BMP[][16] = |
| | | { |
| | | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF0,0x30,0x30}, |
| | | {0x30,0x30,0x30,0x70,0x70,0xFC,0xEC,0xCE,0x0E,0x06,0x00,0x00,0x00,0x00,0x00,0x00}, |
| | | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, |
| | | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, |
| | | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, |
| | | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, |
| | | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0xFF,0xFF,0x03,0x03,0x00,0x00}, |
| | | {0x00,0xF8,0xF8,0x90,0x3E,0x3E,0x10,0xF8,0xF8,0x00,0x03,0x03,0xFF,0xFF,0x03,0x03}, |
| | | {0x00,0x18,0xF8,0xF8,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x1E,0x1C,0x1C}, |
| | | {0xFC,0xFC,0xFC,0xFE,0x0E,0x07,0x07,0x83,0xC0,0xE0,0xF0,0xF8,0xF8,0x78,0x78,0x78}, |
| | | {0xF8,0xF8,0xF8,0xF0,0xC0,0x80,0x00,0x00,0x00,0x80,0x80,0xE0,0xE0,0xF0,0xF0,0x70}, |
| | | {0x78,0x78,0x78,0x78,0x78,0xF0,0xF0,0xE0,0xE0,0xC0,0x00,0x00,0x00,0xF0,0xF0,0xF0}, |
| | | {0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0xF0,0x00,0x00,0xF0,0xF0}, |
| | | {0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00}, |
| | | {0xC0,0xE0,0xF0,0xF8,0xF8,0xF8,0xF8,0xF8,0xFB,0xFB,0xF3,0xF3,0xE3,0xC3,0x04,0x03}, |
| | | {0x03,0x00,0x01,0x03,0x03,0x03,0x03,0x01,0x00,0x03,0x03,0x00,0x03,0x03,0x00,0x00}, |
| | | {0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, |
| | | {0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00}, |
| | | {0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x47,0x03,0x00,0x00}, |
| | | {0x00,0x40,0xE0,0xE0,0xE0,0xE0,0xE1,0xE3,0xE3,0xE3,0xE3,0xE0,0x00,0x1F,0x3F,0x7F}, |
| | | {0xFF,0xFC,0xF0,0xE0,0xF0,0xF0,0xF8,0xFF,0xFF,0xFF,0x3F,0x1F,0x00,0x00,0xFF,0xFF}, |
| | | {0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00}, |
| | | {0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00}, |
| | | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, |
| | | {0x00,0x00,0x3F,0x7F,0x7F,0x7F,0xFC,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x00,0x00}, |
| | | {0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00}, |
| | | {0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x03,0x0F,0x1F,0x3F,0x3E,0x7C,0x78,0x70}, |
| | | {0x70,0x60,0x61,0x71,0x71,0x7B,0x7F,0x3F,0x3F,0x1F,0x07,0x03,0x00,0x00,0x00,0x00}, |
| | | {0x00,0x01,0x7F,0x7F,0x7F,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F}, |
| | | {0x3F,0x7F,0x7F,0x78,0x70,0x70,0x70,0x70,0x78,0x7F,0x3F,0x1F,0x0F,0x00,0x00,0x00}, |
| | | {0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x7F,0x7F,0x7F,0x00,0x00}, |
| | | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, |
| | | }; |
| | | |
| | | |
| | | #endif |
New file |
| | |
| | | #ifndef __FONT_HZK_H |
| | | #define __FONT_HZK_H |
| | | |
| | | #include <stdint.h> |
| | | |
| | | /* 宋体 16X16: 凌云实验室 */ |
| | | |
| | | #define HZK_LEN_LINGYUN 5 |
| | | static uint8_t Hzk_LingYun[][32]= |
| | | { |
| | | {0x00,0x02,0x0C,0xC0,0x00,0x20,0xA4,0x64,0xA4,0x3F,0x24,0x64,0xA4,0x20,0x20,0x00}, |
| | | {0x02,0x02,0x7F,0x00,0x80,0x89,0x44,0x46,0x2B,0x12,0x2A,0x46,0x80,0x81,0x00,0x00},/*"凌",0*/ |
| | | |
| | | {0x40,0x40,0x42,0x42,0x42,0x42,0xC2,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x40,0x00}, |
| | | {0x00,0x20,0x70,0x28,0x24,0x23,0x20,0x20,0x20,0x24,0x28,0x30,0xE0,0x00,0x00,0x00},/*"云",1*/ |
| | | |
| | | {0x10,0x0C,0x04,0x84,0x14,0x64,0x05,0x06,0xF4,0x04,0x04,0x04,0x04,0x14,0x0C,0x00}, |
| | | {0x04,0x84,0x84,0x44,0x47,0x24,0x14,0x0C,0x07,0x0C,0x14,0x24,0x44,0x84,0x04,0x00},/*"实",2*/ |
| | | |
| | | {0x02,0xFA,0x82,0x82,0xFE,0x80,0x40,0x20,0x50,0x4C,0x43,0x4C,0x50,0x20,0x40,0x00}, |
| | | {0x08,0x18,0x48,0x84,0x44,0x3F,0x40,0x44,0x58,0x41,0x4E,0x60,0x58,0x47,0x40,0x00},/*"验",3*/ |
| | | |
| | | {0x10,0x0C,0x24,0x24,0xA4,0x64,0x25,0x26,0x24,0x24,0xA4,0x24,0x24,0x14,0x0C,0x00}, |
| | | {0x40,0x40,0x48,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x4B,0x48,0x40,0x40,0x00},/*"室",4*/ |
| | | }; |
| | | |
| | | /* 宋体 16x16: 温度 */ |
| | | #define HZK_LEN_TEMP 2 |
| | | static uint8_t Hzk_Temp[][32]= |
| | | { |
| | | {0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00}, |
| | | {0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00},/*"温",0*/ |
| | | |
| | | {0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00}, |
| | | {0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00},/*"度",1*/ |
| | | }; |
| | | |
| | | /* 宋体 16x16: 湿度 */ |
| | | #define HZK_LEN_HUMD 2 |
| | | static uint8_t Hzk_Humd[][32]= |
| | | { |
| | | {0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00}, |
| | | {0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00},/*"湿",0*/ |
| | | |
| | | {0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00}, |
| | | {0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00},/*"度",1*/ |
| | | }; |
| | | |
| | | /* 宋体 16X16: 光强 */ |
| | | #define HZK_LEN_LIGHT 2 |
| | | static uint8_t Hzk_Light[][32]= |
| | | { |
| | | {0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F,0x40,0xC0,0x50,0x48,0x46,0x40,0x40,0x00}, |
| | | {0x80,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00},/*"光",0*/ |
| | | |
| | | {0x02,0xE2,0x22,0x22,0x3E,0x00,0x80,0x9E,0x92,0x92,0xF2,0x92,0x92,0x9E,0x80,0x00}, |
| | | {0x00,0x43,0x82,0x42,0x3E,0x40,0x47,0x44,0x44,0x44,0x7F,0x44,0x44,0x54,0xE7,0x00},/*"强",1*/ |
| | | }; |
| | | |
| | | |
| | | /* 宋体 16X16: 声音 */ |
| | | #define HZK_LEN_NOISY 2 |
| | | static uint8_t Hzk_Noisy[][32]= |
| | | { |
| | | {0x04,0x14,0xD4,0x54,0x54,0x54,0x54,0xDF,0x54,0x54,0x54,0x54,0xD4,0x14,0x04,0x00}, |
| | | {0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x03,0x00,0x00,0x00},/*"声",0*/ |
| | | |
| | | {0x40,0x40,0x44,0x44,0x54,0x64,0x45,0x46,0x44,0x64,0x54,0x44,0x44,0x40,0x40,0x00}, |
| | | {0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00},/*"音",1*/ |
| | | }; |
| | | |
| | | #endif |
| | | |
| | | |
New file |
| | |
| | | /********************************************************************** |
| | | * Copyright: (C)2021 LingYun IoT System Studio <www.weike-iot.com> |
| | | * Author: GuoWenxue<guowenxue@gmail.com> QQ: 281143292 |
| | | * Description: BearKE1 NB-IoT Board OLED Hardware Abstract Layer source code |
| | | * |
| | | * ChangeLog: |
| | | * Version Date Author Description |
| | | * V1.0.0 2021.08.10 GuoWenxue Release initial version |
| | | ***********************************************************************/ |
| | | |
| | | #include "hal_oled.h" |
| | | #include "font_ascii.h" |
| | | |
| | | enum |
| | | { |
| | | OLED_CMD = 0, |
| | | OLED_DATA, |
| | | }; |
| | | |
| | | /* |
| | | *+-------------------------------------------------+ |
| | | *| GPIO simulate I2C for OLED function API | |
| | | *+-------------------------------------------------+ |
| | | */ |
| | | |
| | | #define CONFIG_OLED_USE_GPIO_I2C /* use GPIO simulate I2C API */ |
| | | |
| | | typedef struct i2c_gpio_s |
| | | { |
| | | GPIO_TypeDef *group; |
| | | uint16_t scl; /* SCL */ |
| | | uint16_t sda; /* SDA */ |
| | | } i2c_gpio_t; |
| | | |
| | | /* OLED I2C interface connected pins */ |
| | | static i2c_gpio_t oled_i2c = |
| | | { |
| | | .group = GPIOB, |
| | | .scl = GPIO_PIN_8, /* SCL Pin: PB8 */ |
| | | .sda = GPIO_PIN_9, /* SDA Pin: PB9 */ |
| | | }; |
| | | |
| | | #define OLED_IIC_GPIO_Init() \ |
| | | { GPIO_InitTypeDef GPIO_InitStruct = {0}; \ |
| | | GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; \ |
| | | GPIO_InitStruct.Pull = GPIO_PULLUP; \ |
| | | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; \ |
| | | GPIO_InitStruct.Pin = oled_i2c.sda; \ |
| | | HAL_GPIO_Init(oled_i2c.group, &GPIO_InitStruct); \ |
| | | GPIO_InitStruct.Pin = oled_i2c.scl; \ |
| | | HAL_GPIO_Init(oled_i2c.group, &GPIO_InitStruct); \ |
| | | } |
| | | |
| | | #define OLED_SCL_H() HAL_GPIO_WritePin(oled_i2c.group, oled_i2c.scl, GPIO_PIN_SET) |
| | | #define OLED_SCL_L() HAL_GPIO_WritePin(oled_i2c.group, oled_i2c.scl, GPIO_PIN_RESET) |
| | | #define OLED_SDA_H() HAL_GPIO_WritePin(oled_i2c.group, oled_i2c.sda, GPIO_PIN_SET) |
| | | #define OLED_SDA_L() HAL_GPIO_WritePin(oled_i2c.group, oled_i2c.sda, GPIO_PIN_RESET) |
| | | |
| | | |
| | | /* StartCondition(S) */ |
| | | void IIC_Start(void) |
| | | { |
| | | /* StartCondition(S): A high to low transition on the SDA line while SCL is high. |
| | | _______ |
| | | SCL: |___ |
| | | _____ |
| | | SDA: |_____ |
| | | */ |
| | | OLED_SCL_H(); |
| | | OLED_SDA_H(); |
| | | OLED_SDA_L(); |
| | | OLED_SCL_L(); |
| | | } |
| | | |
| | | /* StopCondition(P) */ |
| | | void IIC_Stop(void) |
| | | { |
| | | /* StopCondition(P): A low to high transition on the SDA line while SCL is high. |
| | | _____ |
| | | SCL: ___| |
| | | _____ |
| | | SDA: _____| |
| | | */ |
| | | OLED_SCL_H(); |
| | | OLED_SDA_L(); |
| | | OLED_SDA_H(); |
| | | } |
| | | |
| | | void Write_IIC_Byte(uint8_t byte) |
| | | { |
| | | uint8_t i; |
| | | uint8_t dat; |
| | | |
| | | dat=byte; |
| | | |
| | | /* Data line changes must happened when SCL is low */ |
| | | OLED_SCL_L(); |
| | | |
| | | /* 1Byte=8bit, MSB send: bit[7]-->bit[0] */ |
| | | for(i=0; i<8; i++) |
| | | { |
| | | if( dat&0x80 ) |
| | | OLED_SDA_H(); |
| | | else |
| | | OLED_SDA_L(); |
| | | |
| | | OLED_SCL_H(); |
| | | OLED_SCL_L(); |
| | | |
| | | /* prepare for next bit */ |
| | | dat=dat<<1; |
| | | } |
| | | |
| | | /* clk #9 for ACK but don't care it */ |
| | | OLED_SCL_H(); |
| | | OLED_SCL_L(); |
| | | } |
| | | |
| | | static void IIC_Write_Command(uint8_t command) |
| | | { |
| | | /* Send I2C start signal */ |
| | | IIC_Start(); |
| | | |
| | | /* Send OLED I2C slave write address, SA0=0, R/W#=0 */ |
| | | Write_IIC_Byte(OLED_I2CWR_ADDR); |
| | | |
| | | /* send command value */ |
| | | Write_IIC_Byte(0x00); |
| | | Write_IIC_Byte(command); |
| | | |
| | | /* Send I2C stop signal */ |
| | | IIC_Stop(); |
| | | } |
| | | |
| | | static void IIC_Write_Data(uint8_t data) |
| | | { |
| | | /* Send I2C start signal */ |
| | | IIC_Start(); |
| | | |
| | | /* Send OLED I2C slave write address, SA0=0, R/W#=0 */ |
| | | Write_IIC_Byte(OLED_I2CWR_ADDR); |
| | | |
| | | /* send data value */ |
| | | Write_IIC_Byte(0x40); |
| | | Write_IIC_Byte(data); |
| | | |
| | | /* Send I2C stop signal */ |
| | | IIC_Stop(); |
| | | } |
| | | |
| | | |
| | | /* OLED write a byte command data or command */ |
| | | void OLED_WR_Byte(uint8_t data, uint8_t type) |
| | | { |
| | | if( OLED_CMD==type ) |
| | | { |
| | | IIC_Write_Command(data); |
| | | } |
| | | else |
| | | { |
| | | IIC_Write_Data(data); |
| | | } |
| | | } |
| | | |
| | | /* |
| | | *+-------------------------------------------------+ |
| | | *| OLED initial/control function API | |
| | | *+-------------------------------------------------+ |
| | | */ |
| | | |
| | | /* Turn OLED display onʾ */ |
| | | void OLED_Display_On(void) |
| | | { |
| | | OLED_WR_Byte(0X8D, OLED_CMD); //SET DCDC command |
| | | OLED_WR_Byte(0X14, OLED_CMD); //DCDC ON |
| | | OLED_WR_Byte(0XAF, OLED_CMD); //DISPLAY ON |
| | | } |
| | | |
| | | /* Turn OLED display off */ |
| | | void OLED_Display_Off(void) |
| | | { |
| | | OLED_WR_Byte(0X8D, OLED_CMD); //SET DCDC command |
| | | OLED_WR_Byte(0X10, OLED_CMD); //DCDC OFF |
| | | OLED_WR_Byte(0XAE, OLED_CMD); //DISPLAY OFF |
| | | } |
| | | |
| | | /* Clear OLED, it will be black */ |
| | | void OLED_Clear(void) |
| | | { |
| | | uint8_t i, j; |
| | | |
| | | /* update display */ |
| | | for(i=0;i<8;i++) |
| | | { |
| | | OLED_WR_Byte (0xb0+i, OLED_CMD); // set page address: 0~7 |
| | | OLED_WR_Byte (0x00, OLED_CMD); // set display address, column address lower bytes;ַ |
| | | OLED_WR_Byte (0x10, OLED_CMD); // set display address, column address higher bytes; |
| | | |
| | | for(j=0; j<128; j++) |
| | | OLED_WR_Byte(0, OLED_DATA); |
| | | } |
| | | |
| | | OLED_Set_Pos(0, 0); |
| | | } |
| | | |
| | | void OLED_On(void) |
| | | { |
| | | uint8_t i, j; |
| | | |
| | | /* update display */ |
| | | for(i=0; i<8; i++) |
| | | { |
| | | OLED_WR_Byte (0xb0+i, OLED_CMD); // set page address: 0~7 |
| | | OLED_WR_Byte (0x00, OLED_CMD); // set display address, row address lower bytes;ַ |
| | | OLED_WR_Byte (0x10, OLED_CMD); // set display address, row address higher bytes; |
| | | |
| | | for(j=0; j<128; j++) |
| | | OLED_WR_Byte(1, OLED_DATA); |
| | | } |
| | | } |
| | | |
| | | void OLED_Init(void) |
| | | { |
| | | #ifdef CONFIG_OLED_USE_GPIO_I2C |
| | | OLED_IIC_GPIO_Init(); /* initial GPIO status for I2C pins */ |
| | | #endif |
| | | |
| | | HAL_Delay(200); |
| | | |
| | | OLED_WR_Byte(0xAE,OLED_CMD); // Disable |
| | | |
| | | OLED_WR_Byte(0x40,OLED_CMD); //---set low column address |
| | | OLED_WR_Byte(0xB0,OLED_CMD); //---set high column address |
| | | |
| | | OLED_WR_Byte(0xC8,OLED_CMD); |
| | | |
| | | OLED_WR_Byte(0x81,OLED_CMD); |
| | | OLED_WR_Byte(0xff,OLED_CMD); |
| | | |
| | | OLED_WR_Byte(0xa1,OLED_CMD); |
| | | |
| | | OLED_WR_Byte(0xa6,OLED_CMD); |
| | | |
| | | OLED_WR_Byte(0xa8,OLED_CMD); |
| | | OLED_WR_Byte(0x1f,OLED_CMD); |
| | | |
| | | OLED_WR_Byte(0xd3,OLED_CMD); |
| | | OLED_WR_Byte(0x00,OLED_CMD); |
| | | |
| | | OLED_WR_Byte(0xd5,OLED_CMD); |
| | | OLED_WR_Byte(0xf0,OLED_CMD); |
| | | |
| | | OLED_WR_Byte(0xd9,OLED_CMD); |
| | | OLED_WR_Byte(0x22,OLED_CMD); |
| | | |
| | | OLED_WR_Byte(0xda,OLED_CMD); |
| | | OLED_WR_Byte(0x02,OLED_CMD); |
| | | |
| | | OLED_WR_Byte(0xdb,OLED_CMD); |
| | | OLED_WR_Byte(0x49,OLED_CMD); |
| | | |
| | | OLED_WR_Byte(0x8d,OLED_CMD); |
| | | OLED_WR_Byte(0x14,OLED_CMD); |
| | | |
| | | OLED_WR_Byte(0xaf,OLED_CMD); |
| | | |
| | | OLED_Clear(); |
| | | } |
| | | |
| | | /* |
| | | *+-------------------------------------------------+ |
| | | *| OLED display function API | |
| | | *+-------------------------------------------------+ |
| | | */ |
| | | |
| | | /* set OLED display position */ |
| | | void OLED_Set_Pos(uint8_t x, uint8_t y) |
| | | { |
| | | OLED_WR_Byte(0xb0+y, OLED_CMD); |
| | | OLED_WR_Byte(((x&0xf0)>>4)|0x10, OLED_CMD); |
| | | OLED_WR_Byte((x&0x0f), OLED_CMD); |
| | | } |
| | | |
| | | /* show a character on OLED as $Char_Size */ |
| | | void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t char_Size) |
| | | { |
| | | uint8_t c=0,i=0; |
| | | |
| | | c=chr-' '; // get offset value |
| | | |
| | | if( x>X_WIDTH-1 ) |
| | | { |
| | | x=0; |
| | | y=y+2; |
| | | } |
| | | |
| | | if(char_Size ==16) |
| | | { |
| | | OLED_Set_Pos(x,y); |
| | | |
| | | for(i=0; i<8; i++) |
| | | OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); |
| | | |
| | | OLED_Set_Pos(x,y+1); |
| | | |
| | | for(i=0;i<8;i++) |
| | | OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); |
| | | } |
| | | else |
| | | { |
| | | OLED_Set_Pos(x,y); |
| | | for(i=0;i<6;i++) |
| | | OLED_WR_Byte(F6x8[c][i],OLED_DATA); |
| | | } |
| | | } |
| | | |
| | | /* show a string on OLED */ |
| | | void OLED_ShowString(uint8_t x, uint8_t y, char *chr, uint8_t font_size) |
| | | { |
| | | uint8_t j=0; |
| | | |
| | | while( chr[j]!='\0' ) |
| | | { |
| | | OLED_ShowChar(x, y, chr[j], font_size); |
| | | |
| | | x+=8; |
| | | |
| | | if(x>120) |
| | | { |
| | | x=0; |
| | | y+=2; |
| | | } |
| | | |
| | | j++; |
| | | } |
| | | } |
| | | |
| | | /* Show Chinese on OLED */ |
| | | void OLED_ShowChinese(uint8_t (*Hzk)[32], uint8_t x, uint8_t y, uint8_t no) |
| | | { |
| | | uint8_t t,adder=0; |
| | | |
| | | OLED_Set_Pos(x, y); |
| | | for(t=0;t<16;t++) |
| | | { |
| | | OLED_WR_Byte(Hzk[2*no][t],OLED_DATA); |
| | | adder+=1; |
| | | } |
| | | |
| | | OLED_Set_Pos(x,y+1); |
| | | for(t=0;t<16;t++) |
| | | { |
| | | OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA); |
| | | adder+=1; |
| | | } |
| | | } |
| | | |
| | | /* Show BMP images(128x64) on OLED, x: 0~127 y:0~7 */ |
| | | void OLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t *BMP) |
| | | { |
| | | uint32_t j=0; |
| | | uint8_t x,y; |
| | | |
| | | if( y1%8==0 ) |
| | | y = y1/8; |
| | | else |
| | | y = y1/8+1; |
| | | |
| | | for(y=y0; y<y1; y++) |
| | | { |
| | | OLED_Set_Pos(x0, y); |
| | | for(x=x0;x<x1;x++) |
| | | { |
| | | OLED_WR_Byte(BMP[j++],OLED_DATA); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
New file |
| | |
| | | /********************************************************************** |
| | | * Copyright: (C)2021 LingYun IoT System Studio <www.weike-iot.com> |
| | | * Author: GuoWenxue<guowenxue@gmail.com> QQ: 281143292 |
| | | * Description: BearKE1 NB-IoT Board OLED Hardware Abstract Layer source code |
| | | * |
| | | * ChangeLog: |
| | | * Version Date Author Description |
| | | * V1.0.0 2021.08.10 GuoWenxue Release initial version |
| | | ***********************************************************************/ |
| | | #ifndef __HAL_OLED_H_ |
| | | #define __HAL_OLED_H_ |
| | | |
| | | #include "stm32l4xx_hal.h" |
| | | |
| | | #define OLED_I2CWR_ADDR 0x78 /* OLED chip write address D/C#=0(SA=0); R/W#=0(Write) */ |
| | | |
| | | #define X_WIDTH 128 |
| | | #define Y_WIDTH 64 |
| | | |
| | | #define OLED_FONT16 16 |
| | | #define OLED_FONT8 8 |
| | | |
| | | /* |
| | | *+-------------------------------------------------+ |
| | | *| OLED initial/control function API | |
| | | *+-------------------------------------------------+ |
| | | */ |
| | | void OLED_Init(void); |
| | | void OLED_On(void); |
| | | void OLED_Clear(void); |
| | | void OLED_Display_On(void); |
| | | void OLED_Display_Off(void); |
| | | |
| | | /* |
| | | *+-------------------------------------------------+ |
| | | *| OLED display function API | |
| | | *+-------------------------------------------------+ |
| | | */ |
| | | void OLED_Set_Pos(uint8_t x, uint8_t y); |
| | | void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size); |
| | | void OLED_ShowString(uint8_t x,uint8_t y, char *p,uint8_t font_size); |
| | | void OLED_ShowChinese(uint8_t (*Hzk)[32], uint8_t x,uint8_t y,uint8_t no); |
| | | void OLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t *BMP); |
| | | |
| | | |
| | | #endif /* endof __HAL_OLED_H_*/ |
New file |
| | |
| | | /********************************************************************** |
| | | * Copyright: (C)2021 LingYun IoT System Studio <www.weike-iot.com> |
| | | * Author: GuoWenxue<guowenxue@gmail.com> QQ: 281143292 |
| | | * Description: BearKE1 NB-IoT Board OLED display test source code |
| | | * |
| | | * Notice: Must implement delay_us() by timer in tim.h first. |
| | | * |
| | | * ChangeLog: |
| | | * Version Date Author Description |
| | | * V1.0.0 2021.08.10 GuoWenxue Release initial version |
| | | ***********************************************************************/ |
| | | #include <stdio.h> |
| | | #include "oled.h" |
| | | #include "hal_oled.h" |
| | | #include "font_bmp.h" |
| | | #include "font_hzk.h" |
| | | |
| | | /* |
| | | *+-------------------------------------------------+ |
| | | *| OLED Board display API | |
| | | *+-------------------------------------------------+ |
| | | */ |
| | | |
| | | void OLED_ShowBanner(int showtime) |
| | | { |
| | | uint8_t i; |
| | | uint8_t pos_x = 25; |
| | | uint8_t pos_y = 0; |
| | | |
| | | OLED_Clear(); |
| | | OLED_DrawBMP(0,0,128,7, &LOGO_BMP[0][0]); |
| | | HAL_Delay(showtime); |
| | | |
| | | OLED_Clear(); |
| | | |
| | | for(i=0; i<HZK_LEN_LINGYUN; i++) |
| | | OLED_ShowChinese(Hzk_LingYun, pos_x+i*16, pos_y, i); |
| | | |
| | | pos_x = 5; |
| | | pos_y = 2; |
| | | OLED_ShowString(pos_x, pos_y, "Hello, LingYun!", OLED_FONT16); |
| | | |
| | | HAL_Delay(showtime); |
| | | } |
| | | |
| | | |
| | | void OLED_ShowTempHumdity(uint32_t temp, uint32_t humd, int showtime) |
| | | { |
| | | uint8_t i; |
| | | char temp_str[10] = {0}; /* Tempearute : 28.32'C */ |
| | | char humd_str[16] = {0}; /* Humidity : 58.39% */ |
| | | uint8_t pos_x = 5; |
| | | uint8_t pos_y = 0; |
| | | |
| | | snprintf(temp_str, sizeof(temp_str), ": %02d.%02d\'C", (int)temp/100, (int)temp%100); |
| | | snprintf(humd_str, sizeof(humd_str), ": %02d.%02d%%", (int)humd/100, (int)humd%100); |
| | | |
| | | OLED_Clear(); |
| | | |
| | | for(i=0; i<2*HZK_LEN_TEMP; i++) |
| | | OLED_ShowChinese(Hzk_Temp, pos_x+i*16, pos_y, i); |
| | | |
| | | pos_x += 16*HZK_LEN_TEMP; |
| | | OLED_ShowString(pos_x, pos_y, temp_str, OLED_FONT16); |
| | | |
| | | pos_x = 5; |
| | | pos_y = 2; |
| | | |
| | | for(i=0; i<HZK_LEN_HUMD; i++) |
| | | OLED_ShowChinese(Hzk_Humd, pos_x+i*16, pos_y, i); |
| | | |
| | | pos_x += 16*HZK_LEN_HUMD; |
| | | OLED_ShowString(pos_x, pos_y, humd_str, OLED_FONT16); |
| | | |
| | | HAL_Delay(showtime); |
| | | } |
| | | |
| | | void OLED_ShowLightNoisy(uint32_t light, uint32_t noisy, int showtime) |
| | | { |
| | | uint8_t i; |
| | | char light_str[10] = {0}; |
| | | char noisy_str[16] = {0}; |
| | | uint8_t pos_x = 5; |
| | | uint8_t pos_y = 0; |
| | | |
| | | snprintf(light_str, sizeof(light_str), ": %04d", (int)light); |
| | | snprintf(noisy_str, sizeof(noisy_str), ": %04d", (int)noisy); |
| | | |
| | | OLED_Clear(); |
| | | |
| | | for(i=0; i<2*HZK_LEN_LIGHT; i++) |
| | | OLED_ShowChinese(Hzk_Light, pos_x+i*16, pos_y, i); |
| | | |
| | | pos_x += 16*HZK_LEN_LIGHT; |
| | | OLED_ShowString(pos_x, pos_y, light_str, OLED_FONT16); |
| | | |
| | | pos_x = 5; |
| | | pos_y = 2; |
| | | |
| | | for(i=0; i<HZK_LEN_NOISY; i++) |
| | | OLED_ShowChinese(Hzk_Noisy, pos_x+i*16, pos_y, i); |
| | | |
| | | pos_x += 16*HZK_LEN_NOISY; |
| | | OLED_ShowString(pos_x, pos_y, noisy_str, OLED_FONT16); |
| | | |
| | | HAL_Delay(showtime); |
| | | } |
New file |
| | |
| | | /********************************************************************** |
| | | * Copyright: (C)2021 LingYun IoT System Studio <www.weike-iot.com> |
| | | * Author: GuoWenxue<guowenxue@gmail.com> QQ: 281143292 |
| | | * Description: BearKE1 NB-IoT Board OLED display test source code |
| | | * |
| | | * Notice: Must implement delay_us() by timer in tim.h first. |
| | | * |
| | | * ChangeLog: |
| | | * Version Date Author Description |
| | | * V1.0.0 2021.08.10 GuoWenxue Release initial version |
| | | ***********************************************************************/ |
| | | #ifndef __OLED_H_ |
| | | #define __OLED_H_ |
| | | |
| | | #include "hal_oled.h" |
| | | |
| | | /* |
| | | *+-------------------------------------------------+ |
| | | *| OLED Board display API | |
| | | *+-------------------------------------------------+ |
| | | */ |
| | | #define TIME_500MS 500 |
| | | #define TIME_1S 1000 |
| | | |
| | | void OLED_ShowBanner(int showtime); |
| | | |
| | | void OLED_ShowTempHumdity(uint32_t temp, uint32_t humd, int showtime); |
| | | |
| | | void OLED_ShowLightNoisy(uint32_t light, uint32_t noisy, int showtime); |
| | | |
| | | #endif |
New file |
| | |
| | | /* |
| | | * sht30.c |
| | | * |
| | | * Created on: Aug 9, 2021 |
| | | * Author: Think |
| | | */ |
| | | |
| | | #include <stdio.h> |
| | | #include "stm32l4xx_hal.h" |
| | | #include "sht30.h" |
| | | |
| | | //#define CONFIG_GPIO_I2C |
| | | |
| | | #ifdef CONFIG_GPIO_I2C |
| | | #include "gpio_i2c_sht30.h" |
| | | #else |
| | | #include "i2c.h" |
| | | #endif |
| | | |
| | | //#define CONFIG_SHT30_DEBUG |
| | | |
| | | #ifdef CONFIG_SHT30_DEBUG |
| | | #define sht30_print(format,args...) printf(format, ##args) |
| | | #else |
| | | #define sht30_print(format,args...) do{} while(0) |
| | | #endif |
| | | |
| | | static int sht30_send_cmd(SHT30_CMD cmd) |
| | | { |
| | | uint8_t buf[2]; |
| | | |
| | | buf[0] = cmd >> 8; |
| | | buf[1] = cmd; |
| | | |
| | | #ifdef CONFIG_GPIO_I2C |
| | | return I2C_Master_Transmit(SHT30_ADDR_WR, (uint8_t*)buf, 2); |
| | | #else |
| | | return HAL_I2C_Master_Transmit(&hi2c2, SHT30_ADDR_WR, (uint8_t*)buf, 2, 0xFFFF); |
| | | #endif |
| | | } |
| | | |
| | | |
| | | static void sht30_soft_reset(void) |
| | | { |
| | | sht30_send_cmd(SOFT_RESET_CMD); |
| | | |
| | | HAL_Delay(1); |
| | | } |
| | | |
| | | |
| | | static int sht30_single_shot_measurement(uint8_t *buf, uint8_t buf_size) |
| | | { |
| | | uint16_t cmd = HIGH_ENABLED_CMD; /* High with clock stretching */ |
| | | uint8_t rv; |
| | | |
| | | if( !buf || buf_size<SHT30_DATA_SIZE ) |
| | | { |
| | | sht30_print("%s(): Invalid input arguments\n", __func__); |
| | | return -1; |
| | | } |
| | | |
| | | rv = sht30_send_cmd(cmd); |
| | | if( rv ) |
| | | { |
| | | sht30_print("ERROR: SHT30 send measurement command failure, rv=%d\n", rv); |
| | | sht30_soft_reset(); |
| | | return -2; |
| | | } |
| | | |
| | | #ifdef CONFIG_GPIO_I2C |
| | | rv = I2C_Master_Receive(SHT30_ADDR_RD, buf, SHT30_DATA_SIZE); |
| | | #else |
| | | rv = HAL_I2C_Master_Receive(&hi2c2, SHT30_ADDR_RD, buf, SHT30_DATA_SIZE, 0xFFFF); |
| | | #endif |
| | | if(rv) |
| | | { |
| | | sht30_print("ERROR: SHT30 read measurement result failure, rv=%d\n", rv); |
| | | return -3; |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | |
| | | static uint8_t sht30_crc8(const uint8_t *data, int len) |
| | | { |
| | | const uint8_t POLYNOMIAL = 0x31; /* SHT30 CRC8 Polynomial: 0x31=x8 + x5 + x4 + 1 */ |
| | | uint8_t crc = 0xFF; /* SHT30 CRC8 Initialization: 0xFF */ |
| | | int i, j; |
| | | |
| | | for (i=0; i<len; ++i) |
| | | { |
| | | crc ^= *data++; |
| | | |
| | | for (j=0; j<8; ++j) |
| | | { |
| | | crc = ( crc & 0x80 )? (crc << 1) ^ POLYNOMIAL: (crc << 1); |
| | | } |
| | | } |
| | | |
| | | return crc; |
| | | } |
| | | |
| | | |
| | | int SHT30_SampleData(float *temperature, float *humidity) |
| | | { |
| | | uint8_t buf[SHT30_DATA_SIZE]; |
| | | int rv; |
| | | |
| | | uint16_t temp; |
| | | uint16_t humd; |
| | | uint8_t crc; |
| | | |
| | | if(!temperature || !humidity) |
| | | { |
| | | sht30_print("%s(): Invalid input arguments\n", __func__); |
| | | return -1; |
| | | } |
| | | |
| | | sht30_print("SHT30 start single short measurement\n"); |
| | | rv = sht30_single_shot_measurement(buf, SHT30_DATA_SIZE); |
| | | if( rv ) |
| | | { |
| | | sht30_print("SHT30 Single Short measurement failure, rv=%d\n", rv); |
| | | return -2; |
| | | } |
| | | |
| | | #ifdef CONFIG_SHT30_DEBUG |
| | | { |
| | | int i; |
| | | |
| | | sht30_print("SHT30 get %d bytes sample data: \n", SHT30_DATA_SIZE); |
| | | for(i=0; i<SHT30_DATA_SIZE; i++) |
| | | { |
| | | sht30_print("0x%02x ", buf[i]); |
| | | } |
| | | sht30_print("\n"); |
| | | } |
| | | #endif |
| | | |
| | | /* byte[0-1] is temperature value, and byte[2] is temperature CRC */ |
| | | crc = sht30_crc8(buf, 2); |
| | | sht30_print("SHT30 temperature Cal_CRC: [%02x] EXP_CRC: [%02x]\n", crc, buf[2]); |
| | | if( crc != buf[2]) |
| | | { |
| | | sht30_print("SHT30 measurement temperature got CRC error\n"); |
| | | return -3; |
| | | } |
| | | |
| | | /* byte[3-4] is humidity value, and byte[5] is humidity CRC */ |
| | | crc = sht30_crc8(&buf[3], 2); |
| | | sht30_print("SHT30 humidity Cal_CRC: [%02x] EXP_CRC: [%02x]\n", crc, buf[5]); |
| | | if( crc != buf[5]) |
| | | { |
| | | sht30_print("SHT30 measurement temperature got CRC error\n"); |
| | | return -4; |
| | | } |
| | | |
| | | temp = (buf[0]<<8) | buf[1]; |
| | | humd = (buf[3]<<8) | buf[4]; |
| | | |
| | | *temperature = -45 + 175*((float)temp/65535); |
| | | *humidity = 100 * ((float)humd / 65535); |
| | | |
| | | return 0; |
| | | } |
| | | |
New file |
| | |
| | | /* USER CODE BEGIN Header */ |
| | | /** |
| | | ****************************************************************************** |
| | | * @file stm32l4xx_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(); |
| | | |
| | | /* System interrupt init*/ |
| | | |
| | | /* USER CODE BEGIN MspInit 1 */ |
| | | |
| | | /* USER CODE END MspInit 1 */ |
| | | } |
| | | |
| | | /* USER CODE BEGIN 1 */ |
| | | |
| | | /* USER CODE END 1 */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /* USER CODE BEGIN Header */ |
| | | /** |
| | | ****************************************************************************** |
| | | * @file stm32l4xx_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 "stm32l4xx_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 UART_HandleTypeDef huart1; |
| | | extern UART_HandleTypeDef huart2; |
| | | /* 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 Prefetch 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 */ |
| | | } |
| | | |
| | | /******************************************************************************/ |
| | | /* STM32L4xx 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_stm32l4xx.s). */ |
| | | /******************************************************************************/ |
| | | |
| | | /** |
| | | * @brief This function handles USART1 global interrupt. |
| | | */ |
| | | void USART1_IRQHandler(void) |
| | | { |
| | | /* USER CODE BEGIN USART1_IRQn 0 */ |
| | | |
| | | /* USER CODE END USART1_IRQn 0 */ |
| | | HAL_UART_IRQHandler(&huart1); |
| | | /* USER CODE BEGIN USART1_IRQn 1 */ |
| | | |
| | | /* USER CODE END USART1_IRQn 1 */ |
| | | } |
| | | |
| | | /** |
| | | * @brief This function handles USART2 global interrupt. |
| | | */ |
| | | void USART2_IRQHandler(void) |
| | | { |
| | | /* USER CODE BEGIN USART2_IRQn 0 */ |
| | | |
| | | /* USER CODE END USART2_IRQn 0 */ |
| | | HAL_UART_IRQHandler(&huart2); |
| | | /* USER CODE BEGIN USART2_IRQn 1 */ |
| | | |
| | | /* USER CODE END USART2_IRQn 1 */ |
| | | } |
| | | |
| | | /** |
| | | * @brief This function handles EXTI line[15:10] interrupts. |
| | | */ |
| | | void EXTI15_10_IRQHandler(void) |
| | | { |
| | | /* USER CODE BEGIN EXTI15_10_IRQn 0 */ |
| | | |
| | | /* USER CODE END EXTI15_10_IRQn 0 */ |
| | | HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13); |
| | | HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15); |
| | | /* USER CODE BEGIN EXTI15_10_IRQn 1 */ |
| | | |
| | | /* USER CODE END EXTI15_10_IRQn 1 */ |
| | | } |
| | | |
| | | /* USER CODE BEGIN 1 */ |
| | | |
| | | /* USER CODE END 1 */ |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New 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 */ |
| | | extern int __io_putchar(int ch) __attribute__((weak)); |
| | | extern int __io_getchar(void) __attribute__((weak)); |
| | | |
| | | |
| | | 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; |
| | | } |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @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; |
| | | } |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file system_stm32l4xx.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_stm32l4xx.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. |
| | | * |
| | | * After each device reset the MSI (4 MHz) is used as system clock source. |
| | | * Then SystemInit() function is called, in "startup_stm32l4xx.s" file, to |
| | | * configure the system clock before to branch to main program. |
| | | * |
| | | * This file configures the system clock as follows: |
| | | *============================================================================= |
| | | *----------------------------------------------------------------------------- |
| | | * System Clock source | MSI |
| | | *----------------------------------------------------------------------------- |
| | | * SYSCLK(Hz) | 4000000 |
| | | *----------------------------------------------------------------------------- |
| | | * HCLK(Hz) | 4000000 |
| | | *----------------------------------------------------------------------------- |
| | | * AHB Prescaler | 1 |
| | | *----------------------------------------------------------------------------- |
| | | * APB1 Prescaler | 1 |
| | | *----------------------------------------------------------------------------- |
| | | * APB2 Prescaler | 1 |
| | | *----------------------------------------------------------------------------- |
| | | * PLL_M | 1 |
| | | *----------------------------------------------------------------------------- |
| | | * PLL_N | 8 |
| | | *----------------------------------------------------------------------------- |
| | | * PLL_P | 7 |
| | | *----------------------------------------------------------------------------- |
| | | * PLL_Q | 2 |
| | | *----------------------------------------------------------------------------- |
| | | * PLL_R | 2 |
| | | *----------------------------------------------------------------------------- |
| | | * PLLSAI1_P | NA |
| | | *----------------------------------------------------------------------------- |
| | | * PLLSAI1_Q | NA |
| | | *----------------------------------------------------------------------------- |
| | | * PLLSAI1_R | NA |
| | | *----------------------------------------------------------------------------- |
| | | * PLLSAI2_P | NA |
| | | *----------------------------------------------------------------------------- |
| | | * PLLSAI2_Q | NA |
| | | *----------------------------------------------------------------------------- |
| | | * PLLSAI2_R | NA |
| | | *----------------------------------------------------------------------------- |
| | | * Require 48MHz for USB OTG FS, | Disabled |
| | | * SDIO and RNG clock | |
| | | *----------------------------------------------------------------------------- |
| | | *============================================================================= |
| | | ****************************************************************************** |
| | | * @attention |
| | | * |
| | | * <h2><center>© Copyright (c) 2017 STMicroelectronics. |
| | | * All rights reserved.</center></h2> |
| | | * |
| | | * This software component is licensed by ST under 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: |
| | | * opensource.org/licenses/Apache-2.0 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | |
| | | /** @addtogroup CMSIS |
| | | * @{ |
| | | */ |
| | | |
| | | /** @addtogroup stm32l4xx_system |
| | | * @{ |
| | | */ |
| | | |
| | | /** @addtogroup STM32L4xx_System_Private_Includes |
| | | * @{ |
| | | */ |
| | | |
| | | #include "stm32l4xx.h" |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** @addtogroup STM32L4xx_System_Private_TypesDefinitions |
| | | * @{ |
| | | */ |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** @addtogroup STM32L4xx_System_Private_Defines |
| | | * @{ |
| | | */ |
| | | |
| | | #if !defined (HSE_VALUE) |
| | | #define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ |
| | | #endif /* HSE_VALUE */ |
| | | |
| | | #if !defined (MSI_VALUE) |
| | | #define MSI_VALUE 4000000U /*!< Value of the Internal oscillator in Hz*/ |
| | | #endif /* MSI_VALUE */ |
| | | |
| | | #if !defined (HSI_VALUE) |
| | | #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ |
| | | #endif /* HSI_VALUE */ |
| | | |
| | | /* Note: Following vector table addresses must be defined in line with linker |
| | | configuration. */ |
| | | /*!< Uncomment the following line if you need to relocate the vector table |
| | | anywhere in Flash or Sram, else the vector table is kept at the automatic |
| | | remap of boot address selected */ |
| | | /* #define USER_VECT_TAB_ADDRESS */ |
| | | |
| | | #if defined(USER_VECT_TAB_ADDRESS) |
| | | /*!< Uncomment the following line if you need to relocate your vector Table |
| | | in Sram else user remap will be done in Flash. */ |
| | | /* #define VECT_TAB_SRAM */ |
| | | |
| | | #if defined(VECT_TAB_SRAM) |
| | | #define VECT_TAB_BASE_ADDRESS SRAM1_BASE /*!< Vector Table base address field. |
| | | This value must be a multiple of 0x200. */ |
| | | #define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. |
| | | This value must be a multiple of 0x200. */ |
| | | #else |
| | | #define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. |
| | | This value must be a multiple of 0x200. */ |
| | | #define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. |
| | | This value must be a multiple of 0x200. */ |
| | | #endif /* VECT_TAB_SRAM */ |
| | | #endif /* USER_VECT_TAB_ADDRESS */ |
| | | |
| | | /******************************************************************************/ |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** @addtogroup STM32L4xx_System_Private_Macros |
| | | * @{ |
| | | */ |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** @addtogroup STM32L4xx_System_Private_Variables |
| | | * @{ |
| | | */ |
| | | /* The SystemCoreClock 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 = 4000000U; |
| | | |
| | | 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}; |
| | | const uint32_t MSIRangeTable[12] = {100000U, 200000U, 400000U, 800000U, 1000000U, 2000000U, \ |
| | | 4000000U, 8000000U, 16000000U, 24000000U, 32000000U, 48000000U}; |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** @addtogroup STM32L4xx_System_Private_FunctionPrototypes |
| | | * @{ |
| | | */ |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** @addtogroup STM32L4xx_System_Private_Functions |
| | | * @{ |
| | | */ |
| | | |
| | | /** |
| | | * @brief Setup the microcontroller system. |
| | | * @retval None |
| | | */ |
| | | |
| | | void SystemInit(void) |
| | | { |
| | | #if defined(USER_VECT_TAB_ADDRESS) |
| | | /* Configure the Vector Table location -------------------------------------*/ |
| | | SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; |
| | | #endif |
| | | |
| | | /* FPU settings ------------------------------------------------------------*/ |
| | | #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) |
| | | SCB->CPACR |= ((3UL << 20U)|(3UL << 22U)); /* set CP10 and CP11 Full Access */ |
| | | #endif |
| | | |
| | | /* Reset the RCC clock configuration to the default reset state ------------*/ |
| | | /* Set MSION bit */ |
| | | RCC->CR |= RCC_CR_MSION; |
| | | |
| | | /* Reset CFGR register */ |
| | | RCC->CFGR = 0x00000000U; |
| | | |
| | | /* Reset HSEON, CSSON , HSION, and PLLON bits */ |
| | | RCC->CR &= 0xEAF6FFFFU; |
| | | |
| | | /* Reset PLLCFGR register */ |
| | | RCC->PLLCFGR = 0x00001000U; |
| | | |
| | | /* Reset HSEBYP bit */ |
| | | RCC->CR &= 0xFFFBFFFFU; |
| | | |
| | | /* Disable all interrupts */ |
| | | RCC->CIER = 0x00000000U; |
| | | } |
| | | |
| | | /** |
| | | * @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 MSI, SystemCoreClock will contain the MSI_VALUE(*) |
| | | * |
| | | * - 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(*) or MSI_VALUE(*) multiplied/divided by the PLL factors. |
| | | * |
| | | * (*) MSI_VALUE is a constant defined in stm32l4xx_hal.h file (default value |
| | | * 4 MHz) but the real value may vary depending on the variations |
| | | * in voltage and temperature. |
| | | * |
| | | * (**) HSI_VALUE is a constant defined in stm32l4xx_hal.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 stm32l4xx_hal.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. |
| | | * |
| | | * @retval None |
| | | */ |
| | | void SystemCoreClockUpdate(void) |
| | | { |
| | | uint32_t tmp, msirange, pllvco, pllsource, pllm, pllr; |
| | | |
| | | /* Get MSI Range frequency--------------------------------------------------*/ |
| | | if ((RCC->CR & RCC_CR_MSIRGSEL) == 0U) |
| | | { /* MSISRANGE from RCC_CSR applies */ |
| | | msirange = (RCC->CSR & RCC_CSR_MSISRANGE) >> 8U; |
| | | } |
| | | else |
| | | { /* MSIRANGE from RCC_CR applies */ |
| | | msirange = (RCC->CR & RCC_CR_MSIRANGE) >> 4U; |
| | | } |
| | | /*MSI frequency range in HZ*/ |
| | | msirange = MSIRangeTable[msirange]; |
| | | |
| | | /* Get SYSCLK source -------------------------------------------------------*/ |
| | | switch (RCC->CFGR & RCC_CFGR_SWS) |
| | | { |
| | | case 0x00: /* MSI used as system clock source */ |
| | | SystemCoreClock = msirange; |
| | | break; |
| | | |
| | | case 0x04: /* HSI used as system clock source */ |
| | | SystemCoreClock = HSI_VALUE; |
| | | break; |
| | | |
| | | case 0x08: /* HSE used as system clock source */ |
| | | SystemCoreClock = HSE_VALUE; |
| | | break; |
| | | |
| | | case 0x0C: /* PLL used as system clock source */ |
| | | /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN |
| | | SYSCLK = PLL_VCO / PLLR |
| | | */ |
| | | pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); |
| | | pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4U) + 1U ; |
| | | |
| | | switch (pllsource) |
| | | { |
| | | case 0x02: /* HSI used as PLL clock source */ |
| | | pllvco = (HSI_VALUE / pllm); |
| | | break; |
| | | |
| | | case 0x03: /* HSE used as PLL clock source */ |
| | | pllvco = (HSE_VALUE / pllm); |
| | | break; |
| | | |
| | | default: /* MSI used as PLL clock source */ |
| | | pllvco = (msirange / pllm); |
| | | break; |
| | | } |
| | | pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8U); |
| | | pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25U) + 1U) * 2U; |
| | | SystemCoreClock = pllvco/pllr; |
| | | break; |
| | | |
| | | default: |
| | | SystemCoreClock = msirange; |
| | | break; |
| | | } |
| | | /* Compute HCLK clock frequency --------------------------------------------*/ |
| | | /* Get HCLK prescaler */ |
| | | tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)]; |
| | | /* HCLK clock frequency */ |
| | | SystemCoreClock >>= tmp; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file tim.c |
| | | * @brief This file provides code for the configuration |
| | | * of the TIM instances. |
| | | ****************************************************************************** |
| | | * @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 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | |
| | | /* Includes ------------------------------------------------------------------*/ |
| | | #include "tim.h" |
| | | |
| | | /* USER CODE BEGIN 0 */ |
| | | |
| | | /* USER CODE END 0 */ |
| | | |
| | | TIM_HandleTypeDef htim2; |
| | | TIM_HandleTypeDef htim6; |
| | | |
| | | /* TIM2 init function */ |
| | | void MX_TIM2_Init(void) |
| | | { |
| | | |
| | | /* USER CODE BEGIN TIM2_Init 0 */ |
| | | |
| | | /* USER CODE END TIM2_Init 0 */ |
| | | |
| | | TIM_MasterConfigTypeDef sMasterConfig = {0}; |
| | | TIM_OC_InitTypeDef sConfigOC = {0}; |
| | | |
| | | /* USER CODE BEGIN TIM2_Init 1 */ |
| | | |
| | | /* USER CODE END TIM2_Init 1 */ |
| | | htim2.Instance = TIM2; |
| | | htim2.Init.Prescaler = 80-1; |
| | | htim2.Init.CounterMode = TIM_COUNTERMODE_UP; |
| | | htim2.Init.Period = 370-1; |
| | | htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; |
| | | htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; |
| | | if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; |
| | | sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; |
| | | if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | sConfigOC.OCMode = TIM_OCMODE_PWM1; |
| | | sConfigOC.Pulse = 185; |
| | | sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; |
| | | sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; |
| | | if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | /* USER CODE BEGIN TIM2_Init 2 */ |
| | | |
| | | /* USER CODE END TIM2_Init 2 */ |
| | | HAL_TIM_MspPostInit(&htim2); |
| | | |
| | | } |
| | | /* TIM6 init function */ |
| | | void MX_TIM6_Init(void) |
| | | { |
| | | |
| | | /* USER CODE BEGIN TIM6_Init 0 */ |
| | | |
| | | /* USER CODE END TIM6_Init 0 */ |
| | | |
| | | TIM_MasterConfigTypeDef sMasterConfig = {0}; |
| | | |
| | | /* USER CODE BEGIN TIM6_Init 1 */ |
| | | |
| | | /* USER CODE END TIM6_Init 1 */ |
| | | htim6.Instance = TIM6; |
| | | htim6.Init.Prescaler = 80-1; |
| | | htim6.Init.CounterMode = TIM_COUNTERMODE_UP; |
| | | htim6.Init.Period = 1; |
| | | htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; |
| | | if (HAL_TIM_Base_Init(&htim6) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; |
| | | sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; |
| | | if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | /* USER CODE BEGIN TIM6_Init 2 */ |
| | | |
| | | /* USER CODE END TIM6_Init 2 */ |
| | | |
| | | } |
| | | |
| | | void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle) |
| | | { |
| | | |
| | | if(tim_pwmHandle->Instance==TIM2) |
| | | { |
| | | /* USER CODE BEGIN TIM2_MspInit 0 */ |
| | | |
| | | /* USER CODE END TIM2_MspInit 0 */ |
| | | /* TIM2 clock enable */ |
| | | __HAL_RCC_TIM2_CLK_ENABLE(); |
| | | /* USER CODE BEGIN TIM2_MspInit 1 */ |
| | | |
| | | /* USER CODE END TIM2_MspInit 1 */ |
| | | } |
| | | } |
| | | |
| | | void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) |
| | | { |
| | | |
| | | if(tim_baseHandle->Instance==TIM6) |
| | | { |
| | | /* USER CODE BEGIN TIM6_MspInit 0 */ |
| | | |
| | | /* USER CODE END TIM6_MspInit 0 */ |
| | | /* TIM6 clock enable */ |
| | | __HAL_RCC_TIM6_CLK_ENABLE(); |
| | | /* USER CODE BEGIN TIM6_MspInit 1 */ |
| | | |
| | | /* USER CODE END TIM6_MspInit 1 */ |
| | | } |
| | | } |
| | | void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) |
| | | { |
| | | |
| | | GPIO_InitTypeDef GPIO_InitStruct = {0}; |
| | | if(timHandle->Instance==TIM2) |
| | | { |
| | | /* USER CODE BEGIN TIM2_MspPostInit 0 */ |
| | | |
| | | /* USER CODE END TIM2_MspPostInit 0 */ |
| | | |
| | | __HAL_RCC_GPIOA_CLK_ENABLE(); |
| | | /**TIM2 GPIO Configuration |
| | | PA1 ------> TIM2_CH2 |
| | | */ |
| | | GPIO_InitStruct.Pin = Beep_Pin; |
| | | GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; |
| | | GPIO_InitStruct.Pull = GPIO_PULLDOWN; |
| | | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
| | | GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; |
| | | HAL_GPIO_Init(Beep_GPIO_Port, &GPIO_InitStruct); |
| | | |
| | | /* USER CODE BEGIN TIM2_MspPostInit 1 */ |
| | | |
| | | /* USER CODE END TIM2_MspPostInit 1 */ |
| | | } |
| | | |
| | | } |
| | | |
| | | void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* tim_pwmHandle) |
| | | { |
| | | |
| | | if(tim_pwmHandle->Instance==TIM2) |
| | | { |
| | | /* USER CODE BEGIN TIM2_MspDeInit 0 */ |
| | | |
| | | /* USER CODE END TIM2_MspDeInit 0 */ |
| | | /* Peripheral clock disable */ |
| | | __HAL_RCC_TIM2_CLK_DISABLE(); |
| | | /* USER CODE BEGIN TIM2_MspDeInit 1 */ |
| | | |
| | | /* USER CODE END TIM2_MspDeInit 1 */ |
| | | } |
| | | } |
| | | |
| | | void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) |
| | | { |
| | | |
| | | if(tim_baseHandle->Instance==TIM6) |
| | | { |
| | | /* USER CODE BEGIN TIM6_MspDeInit 0 */ |
| | | |
| | | /* USER CODE END TIM6_MspDeInit 0 */ |
| | | /* Peripheral clock disable */ |
| | | __HAL_RCC_TIM6_CLK_DISABLE(); |
| | | /* USER CODE BEGIN TIM6_MspDeInit 1 */ |
| | | |
| | | /* USER CODE END TIM6_MspDeInit 1 */ |
| | | } |
| | | } |
| | | |
| | | /* USER CODE BEGIN 1 */ |
| | | /* TIM6ï¿??16ä½ç计æ°ï¿??(2^16=65535)ï¼è¿éæä»¬usçº§å»¶æ¶æå¤§å°60000 */ |
| | | void delay_us(uint16_t us) |
| | | { |
| | | /* 䏿伿æå¾®ç§å»¶æ¶å½æ°ä½è®¡æ°å¨è®¡æ°ä¸ä¼å,鲿¢è®¡æ°å¨å¢å å°ï¿??大计æ°ä¹åéæ°å¼å§è®¡ï¿?? */ |
| | | uint16_t differ = 60000-us; |
| | | |
| | | HAL_TIM_Base_Start(&htim6); |
| | | |
| | | __HAL_TIM_SET_COUNTER(&htim6, differ); |
| | | |
| | | while( differ < 60000 ) |
| | | { |
| | | differ=__HAL_TIM_GET_COUNTER(&htim6); |
| | | } |
| | | |
| | | HAL_TIM_Base_Stop(&htim6); |
| | | } |
| | | |
| | | void beep_start(uint8_t times, uint16_t interval) |
| | | { |
| | | while( times-- ) |
| | | { |
| | | /* Start buzzer */ |
| | | if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2) != HAL_OK) |
| | | { |
| | | /* Starting Error */ |
| | | Error_Handler(); |
| | | } |
| | | |
| | | HAL_Delay(interval); |
| | | |
| | | /* Stop buzzer */ |
| | | if (HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_2) != HAL_OK) |
| | | { |
| | | /* Starting Error */ |
| | | Error_Handler(); |
| | | } |
| | | |
| | | HAL_Delay(interval); |
| | | } |
| | | } |
| | | |
| | | /* USER CODE END 1 */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file usart.c |
| | | * @brief This file provides code for the configuration |
| | | * of the USART instances. |
| | | ****************************************************************************** |
| | | * @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 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | |
| | | /* Includes ------------------------------------------------------------------*/ |
| | | #include "usart.h" |
| | | |
| | | /* USER CODE BEGIN 0 */ |
| | | static uint8_t s_uart1_rxch; |
| | | char g_uart1_rxbuf[256]; |
| | | uint8_t g_uart1_bytes; |
| | | |
| | | static uint8_t s_uart2_rxch; |
| | | char g_uart2_rxbuf[256]; |
| | | uint8_t g_uart2_bytes; |
| | | /* USER CODE END 0 */ |
| | | |
| | | UART_HandleTypeDef huart1; |
| | | UART_HandleTypeDef huart2; |
| | | |
| | | /* USART1 init function */ |
| | | |
| | | void MX_USART1_UART_Init(void) |
| | | { |
| | | |
| | | /* USER CODE BEGIN USART1_Init 0 */ |
| | | |
| | | /* USER CODE END USART1_Init 0 */ |
| | | |
| | | /* USER CODE BEGIN USART1_Init 1 */ |
| | | |
| | | /* USER CODE END USART1_Init 1 */ |
| | | huart1.Instance = USART1; |
| | | huart1.Init.BaudRate = 115200; |
| | | huart1.Init.WordLength = UART_WORDLENGTH_8B; |
| | | huart1.Init.StopBits = UART_STOPBITS_1; |
| | | huart1.Init.Parity = UART_PARITY_NONE; |
| | | huart1.Init.Mode = UART_MODE_TX_RX; |
| | | huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; |
| | | huart1.Init.OverSampling = UART_OVERSAMPLING_16; |
| | | huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; |
| | | huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; |
| | | if (HAL_UART_Init(&huart1) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | /* USER CODE BEGIN USART1_Init 2 */ |
| | | HAL_UART_Receive_IT(&huart1 , &s_uart1_rxch, 1); |
| | | /* USER CODE END USART1_Init 2 */ |
| | | |
| | | } |
| | | /* USART2 init function */ |
| | | |
| | | 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; |
| | | huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; |
| | | huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; |
| | | if (HAL_UART_Init(&huart2) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | /* USER CODE BEGIN USART2_Init 2 */ |
| | | HAL_UART_Receive_IT(&huart2 , &s_uart2_rxch, 1); |
| | | /* USER CODE END USART2_Init 2 */ |
| | | |
| | | } |
| | | |
| | | void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) |
| | | { |
| | | |
| | | GPIO_InitTypeDef GPIO_InitStruct = {0}; |
| | | RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; |
| | | if(uartHandle->Instance==USART1) |
| | | { |
| | | /* USER CODE BEGIN USART1_MspInit 0 */ |
| | | |
| | | /* USER CODE END USART1_MspInit 0 */ |
| | | /** Initializes the peripherals clock |
| | | */ |
| | | PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; |
| | | PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; |
| | | if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | |
| | | /* USART1 clock enable */ |
| | | __HAL_RCC_USART1_CLK_ENABLE(); |
| | | |
| | | __HAL_RCC_GPIOA_CLK_ENABLE(); |
| | | /**USART1 GPIO Configuration |
| | | PA9 ------> USART1_TX |
| | | PA10 ------> USART1_RX |
| | | */ |
| | | GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; |
| | | 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_USART1; |
| | | HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |
| | | |
| | | /* USART1 interrupt Init */ |
| | | HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); |
| | | HAL_NVIC_EnableIRQ(USART1_IRQn); |
| | | /* USER CODE BEGIN USART1_MspInit 1 */ |
| | | |
| | | /* USER CODE END USART1_MspInit 1 */ |
| | | } |
| | | else if(uartHandle->Instance==USART2) |
| | | { |
| | | /* USER CODE BEGIN USART2_MspInit 0 */ |
| | | |
| | | /* USER CODE END USART2_MspInit 0 */ |
| | | |
| | | /** Initializes the peripherals clock |
| | | */ |
| | | PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; |
| | | PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; |
| | | if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) |
| | | { |
| | | Error_Handler(); |
| | | } |
| | | |
| | | /* USART2 clock enable */ |
| | | __HAL_RCC_USART2_CLK_ENABLE(); |
| | | |
| | | __HAL_RCC_GPIOA_CLK_ENABLE(); |
| | | /**USART2 GPIO Configuration |
| | | PA2 ------> USART2_TX |
| | | PA3 ------> USART2_RX |
| | | */ |
| | | GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; |
| | | 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); |
| | | |
| | | /* USART2 interrupt Init */ |
| | | HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); |
| | | HAL_NVIC_EnableIRQ(USART2_IRQn); |
| | | /* USER CODE BEGIN USART2_MspInit 1 */ |
| | | |
| | | /* USER CODE END USART2_MspInit 1 */ |
| | | } |
| | | } |
| | | |
| | | void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) |
| | | { |
| | | |
| | | if(uartHandle->Instance==USART1) |
| | | { |
| | | /* USER CODE BEGIN USART1_MspDeInit 0 */ |
| | | |
| | | /* USER CODE END USART1_MspDeInit 0 */ |
| | | /* Peripheral clock disable */ |
| | | __HAL_RCC_USART1_CLK_DISABLE(); |
| | | |
| | | /**USART1 GPIO Configuration |
| | | PA9 ------> USART1_TX |
| | | PA10 ------> USART1_RX |
| | | */ |
| | | HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); |
| | | |
| | | /* USART1 interrupt Deinit */ |
| | | HAL_NVIC_DisableIRQ(USART1_IRQn); |
| | | /* USER CODE BEGIN USART1_MspDeInit 1 */ |
| | | |
| | | /* USER CODE END USART1_MspDeInit 1 */ |
| | | } |
| | | else if(uartHandle->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, GPIO_PIN_2|GPIO_PIN_3); |
| | | |
| | | /* USART2 interrupt Deinit */ |
| | | HAL_NVIC_DisableIRQ(USART2_IRQn); |
| | | /* USER CODE BEGIN USART2_MspDeInit 1 */ |
| | | |
| | | /* USER CODE END USART2_MspDeInit 1 */ |
| | | } |
| | | } |
| | | |
| | | /* USER CODE BEGIN 1 */ |
| | | |
| | | #ifdef __GNUC__ |
| | | #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) |
| | | #else |
| | | #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) |
| | | #endif |
| | | PUTCHAR_PROTOTYPE |
| | | { |
| | | HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF); |
| | | return ch; |
| | | } |
| | | |
| | | void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) |
| | | { |
| | | if (huart->Instance == USART1) |
| | | { |
| | | if( g_uart1_bytes< sizeof(g_uart1_rxbuf) ) |
| | | { |
| | | g_uart1_rxbuf[g_uart1_bytes++] = s_uart1_rxch; |
| | | } |
| | | HAL_UART_Receive_IT(&huart1 , &s_uart1_rxch, 1); |
| | | } |
| | | |
| | | if (huart->Instance == USART2) |
| | | { |
| | | if( g_uart2_bytes< sizeof(g_uart2_rxbuf) ) |
| | | { |
| | | g_uart2_rxbuf[g_uart2_bytes++] = s_uart2_rxch; |
| | | } |
| | | HAL_UART_Receive_IT(&huart2 , &s_uart2_rxch, 1); |
| | | } |
| | | } |
| | | |
| | | void uart_forward(void) |
| | | { |
| | | if( strstr(g_uart1_rxbuf, "\r\n")) |
| | | { |
| | | HAL_UART_Transmit(&huart2 , (uint8_t *)g_uart1_rxbuf, g_uart1_bytes, 0xFF); |
| | | clear_uart1_rxbuf(); |
| | | } |
| | | |
| | | if (g_uart2_bytes > 0) |
| | | { |
| | | HAL_Delay(100); /* Wait AT command reply receive over */ |
| | | HAL_UART_Transmit(&huart1 , (uint8_t *)g_uart2_rxbuf, g_uart2_bytes, 0xFF); |
| | | clear_uart2_rxbuf(); |
| | | } |
| | | } |
| | | /* USER CODE END 1 */ |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file startup_stm32l433xx.s |
| | | * @author MCD Application Team |
| | | * @brief STM32L433xx 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-M4 processor is in Thread mode, |
| | | * priority is Privileged, and the Stack is set to Main. |
| | | ****************************************************************************** |
| | | * @attention |
| | | * |
| | | * <h2><center>© Copyright (c) 2017 STMicroelectronics. |
| | | * All rights reserved.</center></h2> |
| | | * |
| | | * This software component is licensed by ST under 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: |
| | | * opensource.org/licenses/Apache-2.0 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | |
| | | .syntax unified |
| | | .cpu cortex-m4 |
| | | .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, 0xF1E0F85F |
| | | /** |
| | | * @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: |
| | | ldr sp, =_estack /* Set stack pointer */ |
| | | |
| | | /* Call the clock system initialization function.*/ |
| | | bl SystemInit |
| | | |
| | | /* 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 static constructors */ |
| | | bl __libc_init_array |
| | | /* Call the application's entry point.*/ |
| | | bl main |
| | | |
| | | LoopForever: |
| | | b LoopForever |
| | | |
| | | .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-M4. 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_PVM_IRQHandler |
| | | .word TAMP_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 CAN1_TX_IRQHandler |
| | | .word CAN1_RX0_IRQHandler |
| | | .word CAN1_RX1_IRQHandler |
| | | .word CAN1_SCE_IRQHandler |
| | | .word EXTI9_5_IRQHandler |
| | | .word TIM1_BRK_TIM15_IRQHandler |
| | | .word TIM1_UP_TIM16_IRQHandler |
| | | .word TIM1_TRG_COM_IRQHandler |
| | | .word TIM1_CC_IRQHandler |
| | | .word TIM2_IRQHandler |
| | | .word 0 |
| | | .word 0 |
| | | .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 0 |
| | | .word 0 |
| | | .word 0 |
| | | .word 0 |
| | | .word 0 |
| | | .word 0 |
| | | .word 0 |
| | | .word SDMMC1_IRQHandler |
| | | .word 0 |
| | | .word SPI3_IRQHandler |
| | | .word 0 |
| | | .word 0 |
| | | .word TIM6_DAC_IRQHandler |
| | | .word TIM7_IRQHandler |
| | | .word DMA2_Channel1_IRQHandler |
| | | .word DMA2_Channel2_IRQHandler |
| | | .word DMA2_Channel3_IRQHandler |
| | | .word DMA2_Channel4_IRQHandler |
| | | .word DMA2_Channel5_IRQHandler |
| | | .word 0 |
| | | .word 0 |
| | | .word 0 |
| | | .word COMP_IRQHandler |
| | | .word LPTIM1_IRQHandler |
| | | .word LPTIM2_IRQHandler |
| | | .word USB_IRQHandler |
| | | .word DMA2_Channel6_IRQHandler |
| | | .word DMA2_Channel7_IRQHandler |
| | | .word LPUART1_IRQHandler |
| | | .word QUADSPI_IRQHandler |
| | | .word I2C3_EV_IRQHandler |
| | | .word I2C3_ER_IRQHandler |
| | | .word SAI1_IRQHandler |
| | | .word 0 |
| | | .word SWPMI1_IRQHandler |
| | | .word TSC_IRQHandler |
| | | .word LCD_IRQHandler |
| | | .word 0 |
| | | .word RNG_IRQHandler |
| | | .word FPU_IRQHandler |
| | | .word CRS_IRQHandler |
| | | |
| | | |
| | | /******************************************************************************* |
| | | * |
| | | * 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_PVM_IRQHandler |
| | | .thumb_set PVD_PVM_IRQHandler,Default_Handler |
| | | |
| | | .weak TAMP_STAMP_IRQHandler |
| | | .thumb_set TAMP_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 CAN1_TX_IRQHandler |
| | | .thumb_set CAN1_TX_IRQHandler,Default_Handler |
| | | |
| | | .weak CAN1_RX0_IRQHandler |
| | | .thumb_set CAN1_RX0_IRQHandler,Default_Handler |
| | | |
| | | .weak CAN1_RX1_IRQHandler |
| | | .thumb_set CAN1_RX1_IRQHandler,Default_Handler |
| | | |
| | | .weak CAN1_SCE_IRQHandler |
| | | .thumb_set CAN1_SCE_IRQHandler,Default_Handler |
| | | |
| | | .weak EXTI9_5_IRQHandler |
| | | .thumb_set EXTI9_5_IRQHandler,Default_Handler |
| | | |
| | | .weak TIM1_BRK_TIM15_IRQHandler |
| | | .thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler |
| | | |
| | | .weak TIM1_UP_TIM16_IRQHandler |
| | | .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler |
| | | |
| | | .weak TIM1_TRG_COM_IRQHandler |
| | | .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler |
| | | |
| | | .weak TIM1_CC_IRQHandler |
| | | .thumb_set TIM1_CC_IRQHandler,Default_Handler |
| | | |
| | | .weak TIM2_IRQHandler |
| | | .thumb_set TIM2_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 SDMMC1_IRQHandler |
| | | .thumb_set SDMMC1_IRQHandler,Default_Handler |
| | | |
| | | .weak SPI3_IRQHandler |
| | | .thumb_set SPI3_IRQHandler,Default_Handler |
| | | |
| | | .weak TIM6_DAC_IRQHandler |
| | | .thumb_set TIM6_DAC_IRQHandler,Default_Handler |
| | | |
| | | .weak TIM7_IRQHandler |
| | | .thumb_set TIM7_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_IRQHandler |
| | | .thumb_set COMP_IRQHandler,Default_Handler |
| | | |
| | | .weak LPTIM1_IRQHandler |
| | | .thumb_set LPTIM1_IRQHandler,Default_Handler |
| | | |
| | | .weak LPTIM2_IRQHandler |
| | | .thumb_set LPTIM2_IRQHandler,Default_Handler |
| | | |
| | | .weak USB_IRQHandler |
| | | .thumb_set USB_IRQHandler,Default_Handler |
| | | |
| | | .weak DMA2_Channel6_IRQHandler |
| | | .thumb_set DMA2_Channel6_IRQHandler,Default_Handler |
| | | |
| | | .weak DMA2_Channel7_IRQHandler |
| | | .thumb_set DMA2_Channel7_IRQHandler,Default_Handler |
| | | |
| | | .weak LPUART1_IRQHandler |
| | | .thumb_set LPUART1_IRQHandler,Default_Handler |
| | | |
| | | .weak QUADSPI_IRQHandler |
| | | .thumb_set QUADSPI_IRQHandler,Default_Handler |
| | | |
| | | .weak I2C3_EV_IRQHandler |
| | | .thumb_set I2C3_EV_IRQHandler,Default_Handler |
| | | |
| | | .weak I2C3_ER_IRQHandler |
| | | .thumb_set I2C3_ER_IRQHandler,Default_Handler |
| | | |
| | | .weak SAI1_IRQHandler |
| | | .thumb_set SAI1_IRQHandler,Default_Handler |
| | | |
| | | .weak SWPMI1_IRQHandler |
| | | .thumb_set SWPMI1_IRQHandler,Default_Handler |
| | | |
| | | .weak TSC_IRQHandler |
| | | .thumb_set TSC_IRQHandler,Default_Handler |
| | | |
| | | .weak LCD_IRQHandler |
| | | .thumb_set LCD_IRQHandler,Default_Handler |
| | | |
| | | .weak RNG_IRQHandler |
| | | .thumb_set RNG_IRQHandler,Default_Handler |
| | | |
| | | .weak FPU_IRQHandler |
| | | .thumb_set FPU_IRQHandler,Default_Handler |
| | | |
| | | .weak CRS_IRQHandler |
| | | .thumb_set CRS_IRQHandler,Default_Handler |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file stm32l4xx.h |
| | | * @author MCD Application Team |
| | | * @brief CMSIS STM32L4xx 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 STM32L4xx device used in the target application |
| | | * - To use or not the peripherals drivers in application code(i.e. |
| | | * code will be based on direct access to peripherals 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 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: |
| | | * opensource.org/licenses/Apache-2.0 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | |
| | | /** @addtogroup CMSIS |
| | | * @{ |
| | | */ |
| | | |
| | | /** @addtogroup stm32l4xx |
| | | * @{ |
| | | */ |
| | | |
| | | #ifndef __STM32L4xx_H |
| | | #define __STM32L4xx_H |
| | | |
| | | #ifdef __cplusplus |
| | | extern "C" { |
| | | #endif /* __cplusplus */ |
| | | |
| | | /** @addtogroup Library_configuration_section |
| | | * @{ |
| | | */ |
| | | |
| | | /** |
| | | * @brief STM32 Family |
| | | */ |
| | | #if !defined (STM32L4) |
| | | #define STM32L4 |
| | | #endif /* STM32L4 */ |
| | | |
| | | /* Uncomment the line below according to the target STM32L4 device used in your |
| | | application |
| | | */ |
| | | |
| | | #if !defined (STM32L412xx) && !defined (STM32L422xx) && \ |
| | | !defined (STM32L431xx) && !defined (STM32L432xx) && !defined (STM32L433xx) && !defined (STM32L442xx) && !defined (STM32L443xx) && \ |
| | | !defined (STM32L451xx) && !defined (STM32L452xx) && !defined (STM32L462xx) && \ |
| | | !defined (STM32L471xx) && !defined (STM32L475xx) && !defined (STM32L476xx) && !defined (STM32L485xx) && !defined (STM32L486xx) && \ |
| | | !defined (STM32L496xx) && !defined (STM32L4A6xx) && \ |
| | | !defined (STM32L4P5xx) && !defined (STM32L4Q5xx) && \ |
| | | !defined (STM32L4R5xx) && !defined (STM32L4R7xx) && !defined (STM32L4R9xx) && !defined (STM32L4S5xx) && !defined (STM32L4S7xx) && !defined (STM32L4S9xx) |
| | | /* #define STM32L412xx */ /*!< STM32L412xx Devices */ |
| | | /* #define STM32L422xx */ /*!< STM32L422xx Devices */ |
| | | /* #define STM32L431xx */ /*!< STM32L431xx Devices */ |
| | | /* #define STM32L432xx */ /*!< STM32L432xx Devices */ |
| | | /* #define STM32L433xx */ /*!< STM32L433xx Devices */ |
| | | /* #define STM32L442xx */ /*!< STM32L442xx Devices */ |
| | | /* #define STM32L443xx */ /*!< STM32L443xx Devices */ |
| | | /* #define STM32L451xx */ /*!< STM32L451xx Devices */ |
| | | /* #define STM32L452xx */ /*!< STM32L452xx Devices */ |
| | | /* #define STM32L462xx */ /*!< STM32L462xx Devices */ |
| | | /* #define STM32L471xx */ /*!< STM32L471xx Devices */ |
| | | /* #define STM32L475xx */ /*!< STM32L475xx Devices */ |
| | | /* #define STM32L476xx */ /*!< STM32L476xx Devices */ |
| | | /* #define STM32L485xx */ /*!< STM32L485xx Devices */ |
| | | /* #define STM32L486xx */ /*!< STM32L486xx Devices */ |
| | | /* #define STM32L496xx */ /*!< STM32L496xx Devices */ |
| | | /* #define STM32L4A6xx */ /*!< STM32L4A6xx Devices */ |
| | | /* #define STM32L4P5xx */ /*!< STM32L4Q5xx Devices */ |
| | | /* #define STM32L4R5xx */ /*!< STM32L4R5xx Devices */ |
| | | /* #define STM32L4R7xx */ /*!< STM32L4R7xx Devices */ |
| | | /* #define STM32L4R9xx */ /*!< STM32L4R9xx Devices */ |
| | | /* #define STM32L4S5xx */ /*!< STM32L4S5xx Devices */ |
| | | /* #define STM32L4S7xx */ /*!< STM32L4S7xx Devices */ |
| | | /* #define STM32L4S9xx */ /*!< STM32L4S9xx 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 Device version number |
| | | */ |
| | | #define __STM32L4_CMSIS_VERSION_MAIN (0x01) /*!< [31:24] main version */ |
| | | #define __STM32L4_CMSIS_VERSION_SUB1 (0x07) /*!< [23:16] sub1 version */ |
| | | #define __STM32L4_CMSIS_VERSION_SUB2 (0x01) /*!< [15:8] sub2 version */ |
| | | #define __STM32L4_CMSIS_VERSION_RC (0x00) /*!< [7:0] release candidate */ |
| | | #define __STM32L4_CMSIS_VERSION ((__STM32L4_CMSIS_VERSION_MAIN << 24)\ |
| | | |(__STM32L4_CMSIS_VERSION_SUB1 << 16)\ |
| | | |(__STM32L4_CMSIS_VERSION_SUB2 << 8 )\ |
| | | |(__STM32L4_CMSIS_VERSION_RC)) |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** @addtogroup Device_Included |
| | | * @{ |
| | | */ |
| | | |
| | | #if defined(STM32L412xx) |
| | | #include "stm32l412xx.h" |
| | | #elif defined(STM32L422xx) |
| | | #include "stm32l422xx.h" |
| | | #elif defined(STM32L431xx) |
| | | #include "stm32l431xx.h" |
| | | #elif defined(STM32L432xx) |
| | | #include "stm32l432xx.h" |
| | | #elif defined(STM32L433xx) |
| | | #include "stm32l433xx.h" |
| | | #elif defined(STM32L442xx) |
| | | #include "stm32l442xx.h" |
| | | #elif defined(STM32L443xx) |
| | | #include "stm32l443xx.h" |
| | | #elif defined(STM32L451xx) |
| | | #include "stm32l451xx.h" |
| | | #elif defined(STM32L452xx) |
| | | #include "stm32l452xx.h" |
| | | #elif defined(STM32L462xx) |
| | | #include "stm32l462xx.h" |
| | | #elif defined(STM32L471xx) |
| | | #include "stm32l471xx.h" |
| | | #elif defined(STM32L475xx) |
| | | #include "stm32l475xx.h" |
| | | #elif defined(STM32L476xx) |
| | | #include "stm32l476xx.h" |
| | | #elif defined(STM32L485xx) |
| | | #include "stm32l485xx.h" |
| | | #elif defined(STM32L486xx) |
| | | #include "stm32l486xx.h" |
| | | #elif defined(STM32L496xx) |
| | | #include "stm32l496xx.h" |
| | | #elif defined(STM32L4A6xx) |
| | | #include "stm32l4a6xx.h" |
| | | #elif defined(STM32L4P5xx) |
| | | #include "stm32l4p5xx.h" |
| | | #elif defined(STM32L4Q5xx) |
| | | #include "stm32l4q5xx.h" |
| | | #elif defined(STM32L4R5xx) |
| | | #include "stm32l4r5xx.h" |
| | | #elif defined(STM32L4R7xx) |
| | | #include "stm32l4r7xx.h" |
| | | #elif defined(STM32L4R9xx) |
| | | #include "stm32l4r9xx.h" |
| | | #elif defined(STM32L4S5xx) |
| | | #include "stm32l4s5xx.h" |
| | | #elif defined(STM32L4S7xx) |
| | | #include "stm32l4s7xx.h" |
| | | #elif defined(STM32L4S9xx) |
| | | #include "stm32l4s9xx.h" |
| | | #else |
| | | #error "Please select first the target STM32L4xx device used in your application (in stm32l4xx.h file)" |
| | | #endif |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** @addtogroup Exported_types |
| | | * @{ |
| | | */ |
| | | typedef enum |
| | | { |
| | | RESET = 0, |
| | | SET = !RESET |
| | | } FlagStatus, ITStatus; |
| | | |
| | | typedef enum |
| | | { |
| | | DISABLE = 0, |
| | | ENABLE = !DISABLE |
| | | } FunctionalState; |
| | | #define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) |
| | | |
| | | typedef enum |
| | | { |
| | | SUCCESS = 0, |
| | | ERROR = !SUCCESS |
| | | } ErrorStatus; |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | |
| | | /** @addtogroup Exported_macros |
| | | * @{ |
| | | */ |
| | | #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 "stm32l4xx_hal.h" |
| | | #endif /* USE_HAL_DRIVER */ |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif /* __cplusplus */ |
| | | |
| | | #endif /* __STM32L4xx_H */ |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | |
| | | |
| | | |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /** |
| | | ****************************************************************************** |
| | | * @file system_stm32l4xx.h |
| | | * @author MCD Application Team |
| | | * @brief CMSIS Cortex-M4 Device System Source File for STM32L4xx devices. |
| | | ****************************************************************************** |
| | | * @attention |
| | | * |
| | | * <h2><center>© Copyright (c) 2017 STMicroelectronics. |
| | | * All rights reserved.</center></h2> |
| | | * |
| | | * This software component is licensed by ST under 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: |
| | | * opensource.org/licenses/Apache-2.0 |
| | | * |
| | | ****************************************************************************** |
| | | */ |
| | | |
| | | /** @addtogroup CMSIS |
| | | * @{ |
| | | */ |
| | | |
| | | /** @addtogroup stm32l4xx_system |
| | | * @{ |
| | | */ |
| | | |
| | | /** |
| | | * @brief Define to prevent recursive inclusion |
| | | */ |
| | | #ifndef __SYSTEM_STM32L4XX_H |
| | | #define __SYSTEM_STM32L4XX_H |
| | | |
| | | #ifdef __cplusplus |
| | | extern "C" { |
| | | #endif |
| | | |
| | | /** @addtogroup STM32L4xx_System_Includes |
| | | * @{ |
| | | */ |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | |
| | | /** @addtogroup STM32L4xx_System_Exported_Variables |
| | | * @{ |
| | | */ |
| | | /* The SystemCoreClock 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 */ |
| | | extern const uint32_t MSIRangeTable[12]; /*!< MSI ranges table values */ |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** @addtogroup STM32L4xx_System_Exported_Constants |
| | | * @{ |
| | | */ |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** @addtogroup STM32L4xx_System_Exported_Macros |
| | | * @{ |
| | | */ |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** @addtogroup STM32L4xx_System_Exported_Functions |
| | | * @{ |
| | | */ |
| | | |
| | | extern void SystemInit(void); |
| | | extern void SystemCoreClockUpdate(void); |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | | |
| | | #endif /*__SYSTEM_STM32L4XX_H */ |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |
New file |
| | |
| | | /**************************************************************************//** |
| | | * @file cmsis_armcc.h |
| | | * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file |
| | | * @version V5.1.0 |
| | | * @date 08. May 2019 |
| | | ******************************************************************************/ |
| | | /* |
| | | * Copyright (c) 2009-2019 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 control DSP macros */ |
| | | #if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) |
| | | #define __ARM_FEATURE_DSP 1 |
| | | #endif |
| | | |
| | | /* 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 |
| | | #ifndef __COMPILER_BARRIER |
| | | #define __COMPILER_BARRIER() __memory_changed() |
| | | #endif |
| | | |
| | | /* ######################### Startup and Lowlevel Init ######################## */ |
| | | |
| | | #ifndef __PROGRAM_START |
| | | #define __PROGRAM_START __main |
| | | #endif |
| | | |
| | | #ifndef __INITIAL_SP |
| | | #define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit |
| | | #endif |
| | | |
| | | #ifndef __STACK_LIMIT |
| | | #define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base |
| | | #endif |
| | | |
| | | #ifndef __VECTOR_TABLE |
| | | #define __VECTOR_TABLE __Vectors |
| | | #endif |
| | | |
| | | #ifndef __VECTOR_TABLE_ATTRIBUTE |
| | | #define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) |
| | | #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 */ |
New file |
| | |
| | | /**************************************************************************//** |
| | | * @file cmsis_armclang.h |
| | | * @brief CMSIS compiler armclang (Arm Compiler 6) header file |
| | | * @version V5.2.0 |
| | | * @date 08. May 2019 |
| | | ******************************************************************************/ |
| | | /* |
| | | * Copyright (c) 2009-2019 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. |
| | | */ |
| | | |
| | | /*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ |
| | | |
| | | #ifndef __CMSIS_ARMCLANG_H |
| | | #define __CMSIS_ARMCLANG_H |
| | | |
| | | #pragma clang system_header /* treat file as system include file */ |
| | | |
| | | #ifndef __ARM_COMPAT_H |
| | | #include <arm_compat.h> /* Compatibility header for Arm Compiler 5 intrinsics */ |
| | | #endif |
| | | |
| | | /* 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 __attribute__((always_inline)) 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, aligned(1))) |
| | | #endif |
| | | #ifndef __PACKED_STRUCT |
| | | #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) |
| | | #endif |
| | | #ifndef __PACKED_UNION |
| | | #define __PACKED_UNION union __attribute__((packed, aligned(1))) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT32 /* deprecated */ |
| | | #pragma clang diagnostic push |
| | | #pragma clang diagnostic ignored "-Wpacked" |
| | | /*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ |
| | | struct __attribute__((packed)) T_UINT32 { uint32_t v; }; |
| | | #pragma clang diagnostic pop |
| | | #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT16_WRITE |
| | | #pragma clang diagnostic push |
| | | #pragma clang diagnostic ignored "-Wpacked" |
| | | /*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ |
| | | __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; |
| | | #pragma clang diagnostic pop |
| | | #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT16_READ |
| | | #pragma clang diagnostic push |
| | | #pragma clang diagnostic ignored "-Wpacked" |
| | | /*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ |
| | | __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; |
| | | #pragma clang diagnostic pop |
| | | #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT32_WRITE |
| | | #pragma clang diagnostic push |
| | | #pragma clang diagnostic ignored "-Wpacked" |
| | | /*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ |
| | | __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; |
| | | #pragma clang diagnostic pop |
| | | #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT32_READ |
| | | #pragma clang diagnostic push |
| | | #pragma clang diagnostic ignored "-Wpacked" |
| | | /*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ |
| | | __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; |
| | | #pragma clang diagnostic pop |
| | | #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 |
| | | #define __RESTRICT __restrict |
| | | #endif |
| | | #ifndef __COMPILER_BARRIER |
| | | #define __COMPILER_BARRIER() __ASM volatile("":::"memory") |
| | | #endif |
| | | |
| | | /* ######################### Startup and Lowlevel Init ######################## */ |
| | | |
| | | #ifndef __PROGRAM_START |
| | | #define __PROGRAM_START __main |
| | | #endif |
| | | |
| | | #ifndef __INITIAL_SP |
| | | #define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit |
| | | #endif |
| | | |
| | | #ifndef __STACK_LIMIT |
| | | #define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base |
| | | #endif |
| | | |
| | | #ifndef __VECTOR_TABLE |
| | | #define __VECTOR_TABLE __Vectors |
| | | #endif |
| | | |
| | | #ifndef __VECTOR_TABLE_ATTRIBUTE |
| | | #define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) |
| | | #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(); see arm_compat.h */ |
| | | |
| | | |
| | | /** |
| | | \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(); see arm_compat.h */ |
| | | |
| | | |
| | | /** |
| | | \brief Get Control Register |
| | | \details Returns the content of the Control Register. |
| | | \return Control Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_CONTROL(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, control" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Control Register (non-secure) |
| | | \details Returns the content of the non-secure Control Register when in secure mode. |
| | | \return non-secure Control Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Control Register |
| | | \details Writes the given value to the Control Register. |
| | | \param [in] control Control Register value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) |
| | | { |
| | | __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Control Register (non-secure) |
| | | \details Writes the given value to the non-secure Control Register when in secure state. |
| | | \param [in] control Control Register value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) |
| | | { |
| | | __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Get IPSR Register |
| | | \details Returns the content of the IPSR Register. |
| | | \return IPSR Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_IPSR(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get APSR Register |
| | | \details Returns the content of the APSR Register. |
| | | \return APSR Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_APSR(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, apsr" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get xPSR Register |
| | | \details Returns the content of the xPSR Register. |
| | | \return xPSR Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_xPSR(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Process Stack Pointer |
| | | \details Returns the current value of the Process Stack Pointer (PSP). |
| | | \return PSP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_PSP(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, psp" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Process Stack Pointer (non-secure) |
| | | \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. |
| | | \return PSP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \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_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) |
| | | { |
| | | __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Process Stack Pointer (non-secure) |
| | | \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. |
| | | \param [in] topOfProcStack Process Stack Pointer value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) |
| | | { |
| | | __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Get Main Stack Pointer |
| | | \details Returns the current value of the Main Stack Pointer (MSP). |
| | | \return MSP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_MSP(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, msp" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Main Stack Pointer (non-secure) |
| | | \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. |
| | | \return MSP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \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_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) |
| | | { |
| | | __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Main Stack Pointer (non-secure) |
| | | \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. |
| | | \param [in] topOfMainStack Main Stack Pointer value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) |
| | | { |
| | | __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Stack Pointer (non-secure) |
| | | \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. |
| | | \return SP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Set Stack Pointer (non-secure) |
| | | \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. |
| | | \param [in] topOfStack Stack Pointer value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) |
| | | { |
| | | __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Get Priority Mask |
| | | \details Returns the current state of the priority mask bit from the Priority Mask Register. |
| | | \return Priority Mask value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, primask" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Priority Mask (non-secure) |
| | | \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. |
| | | \return Priority Mask value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Priority Mask |
| | | \details Assigns the given value to the Priority Mask Register. |
| | | \param [in] priMask Priority Mask |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) |
| | | { |
| | | __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Priority Mask (non-secure) |
| | | \details Assigns the given value to the non-secure Priority Mask Register when in secure state. |
| | | \param [in] priMask Priority Mask |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) |
| | | { |
| | | __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 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 /* see arm_compat.h */ |
| | | |
| | | |
| | | /** |
| | | \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 /* see arm_compat.h */ |
| | | |
| | | |
| | | /** |
| | | \brief Get Base Priority |
| | | \details Returns the current value of the Base Priority register. |
| | | \return Base Priority register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, basepri" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Base Priority (non-secure) |
| | | \details Returns the current value of the non-secure Base Priority register when in secure state. |
| | | \return Base Priority register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Base Priority |
| | | \details Assigns the given value to the Base Priority register. |
| | | \param [in] basePri Base Priority value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) |
| | | { |
| | | __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Base Priority (non-secure) |
| | | \details Assigns the given value to the non-secure Base Priority register when in secure state. |
| | | \param [in] basePri Base Priority value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) |
| | | { |
| | | __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \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_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) |
| | | { |
| | | __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Fault Mask |
| | | \details Returns the current value of the Fault Mask register. |
| | | \return Fault Mask register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Fault Mask (non-secure) |
| | | \details Returns the current value of the non-secure Fault Mask register when in secure state. |
| | | \return Fault Mask register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Fault Mask |
| | | \details Assigns the given value to the Fault Mask register. |
| | | \param [in] faultMask Fault Mask value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) |
| | | { |
| | | __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Fault Mask (non-secure) |
| | | \details Assigns the given value to the non-secure Fault Mask register when in secure state. |
| | | \param [in] faultMask Fault Mask value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) |
| | | { |
| | | __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); |
| | | } |
| | | #endif |
| | | |
| | | #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) |
| | | |
| | | /** |
| | | \brief Get Process Stack Pointer Limit |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence zero is returned always in non-secure |
| | | mode. |
| | | |
| | | \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). |
| | | \return PSPLIM Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) |
| | | { |
| | | #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 |
| | | return 0U; |
| | | #else |
| | | uint32_t result; |
| | | __ASM volatile ("MRS %0, psplim" : "=r" (result) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Process Stack Pointer Limit (non-secure) |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence zero is returned always in non-secure |
| | | mode. |
| | | |
| | | \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. |
| | | \return PSPLIM Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) |
| | | { |
| | | #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) |
| | | // without main extensions, the non-secure PSPLIM is RAZ/WI |
| | | return 0U; |
| | | #else |
| | | uint32_t result; |
| | | __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Process Stack Pointer Limit |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence the write is silently ignored in non-secure |
| | | mode. |
| | | |
| | | \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). |
| | | \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) |
| | | { |
| | | #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)ProcStackPtrLimit; |
| | | #else |
| | | __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); |
| | | #endif |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Process Stack Pointer (non-secure) |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence the write is silently ignored in non-secure |
| | | mode. |
| | | |
| | | \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. |
| | | \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) |
| | | { |
| | | #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) |
| | | // without main extensions, the non-secure PSPLIM is RAZ/WI |
| | | (void)ProcStackPtrLimit; |
| | | #else |
| | | __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Get Main Stack Pointer Limit |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence zero is returned always. |
| | | |
| | | \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). |
| | | \return MSPLIM Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) |
| | | { |
| | | #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 |
| | | return 0U; |
| | | #else |
| | | uint32_t result; |
| | | __ASM volatile ("MRS %0, msplim" : "=r" (result) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Main Stack Pointer Limit (non-secure) |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence zero is returned always. |
| | | |
| | | \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. |
| | | \return MSPLIM Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) |
| | | { |
| | | #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) |
| | | // without main extensions, the non-secure MSPLIM is RAZ/WI |
| | | return 0U; |
| | | #else |
| | | uint32_t result; |
| | | __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Main Stack Pointer Limit |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence the write is silently ignored. |
| | | |
| | | \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). |
| | | \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) |
| | | { |
| | | #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)MainStackPtrLimit; |
| | | #else |
| | | __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); |
| | | #endif |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Main Stack Pointer Limit (non-secure) |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence the write is silently ignored. |
| | | |
| | | \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. |
| | | \param [in] MainStackPtrLimit Main Stack Pointer value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) |
| | | { |
| | | #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) |
| | | // without main extensions, the non-secure MSPLIM is RAZ/WI |
| | | (void)MainStackPtrLimit; |
| | | #else |
| | | __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | #endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ |
| | | |
| | | /** |
| | | \brief Get FPSCR |
| | | \details Returns the current value of the Floating Point Status/Control register. |
| | | \return Floating Point Status/Control register value |
| | | */ |
| | | #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ |
| | | (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) |
| | | #define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr |
| | | #else |
| | | #define __get_FPSCR() ((uint32_t)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 |
| | | */ |
| | | #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ |
| | | (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) |
| | | #define __set_FPSCR __builtin_arm_set_fpscr |
| | | #else |
| | | #define __set_FPSCR(x) ((void)(x)) |
| | | #endif |
| | | |
| | | |
| | | /*@} end of CMSIS_Core_RegAccFunctions */ |
| | | |
| | | |
| | | /* ########################## Core Instruction Access ######################### */ |
| | | /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface |
| | | Access to dedicated instructions |
| | | @{ |
| | | */ |
| | | |
| | | /* Define macros for porting to both thumb1 and thumb2. |
| | | * For thumb1, use low register (r0-r7), specified by constraint "l" |
| | | * Otherwise, use general registers, specified by constraint "r" */ |
| | | #if defined (__thumb__) && !defined (__thumb2__) |
| | | #define __CMSIS_GCC_OUT_REG(r) "=l" (r) |
| | | #define __CMSIS_GCC_RW_REG(r) "+l" (r) |
| | | #define __CMSIS_GCC_USE_REG(r) "l" (r) |
| | | #else |
| | | #define __CMSIS_GCC_OUT_REG(r) "=r" (r) |
| | | #define __CMSIS_GCC_RW_REG(r) "+r" (r) |
| | | #define __CMSIS_GCC_USE_REG(r) "r" (r) |
| | | #endif |
| | | |
| | | /** |
| | | \brief No Operation |
| | | \details No Operation does nothing. This instruction can be used for code alignment purposes. |
| | | */ |
| | | #define __NOP __builtin_arm_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 __builtin_arm_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 __builtin_arm_wfe |
| | | |
| | | |
| | | /** |
| | | \brief Send Event |
| | | \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. |
| | | */ |
| | | #define __SEV __builtin_arm_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() __builtin_arm_isb(0xF) |
| | | |
| | | /** |
| | | \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() __builtin_arm_dsb(0xF) |
| | | |
| | | |
| | | /** |
| | | \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() __builtin_arm_dmb(0xF) |
| | | |
| | | |
| | | /** |
| | | \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(value) __builtin_bswap32(value) |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | #define __REV16(value) __ROR(__REV(value), 16) |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | #define __REVSH(value) (int16_t)__builtin_bswap16(value) |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) |
| | | { |
| | | op2 %= 32U; |
| | | if (op2 == 0U) |
| | | { |
| | | return op1; |
| | | } |
| | | return (op1 >> op2) | (op1 << (32U - op2)); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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) __ASM volatile ("bkpt "#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 |
| | | */ |
| | | #define __RBIT __builtin_arm_rbit |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) |
| | | { |
| | | /* Even though __builtin_clz produces a CLZ instruction on ARM, formally |
| | | __builtin_clz(0) is undefined behaviour, so handle this case specially. |
| | | This guarantees ARM-compatible results if happening to compile on a non-ARM |
| | | target, and ensures the compiler doesn't decide to activate any |
| | | optimisations using the logic "value was passed to __builtin_clz, so it |
| | | is non-zero". |
| | | ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a |
| | | single CLZ instruction. |
| | | */ |
| | | if (value == 0U) |
| | | { |
| | | return 32U; |
| | | } |
| | | return __builtin_clz(value); |
| | | } |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 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) |
| | | */ |
| | | #define __LDREXB (uint8_t)__builtin_arm_ldrex |
| | | |
| | | |
| | | /** |
| | | \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) |
| | | */ |
| | | #define __LDREXH (uint16_t)__builtin_arm_ldrex |
| | | |
| | | |
| | | /** |
| | | \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) |
| | | */ |
| | | #define __LDREXW (uint32_t)__builtin_arm_ldrex |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | #define __STREXB (uint32_t)__builtin_arm_strex |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | #define __STREXH (uint32_t)__builtin_arm_strex |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | #define __STREXW (uint32_t)__builtin_arm_strex |
| | | |
| | | |
| | | /** |
| | | \brief Remove the exclusive lock |
| | | \details Removes the exclusive lock which is created by LDREX. |
| | | */ |
| | | #define __CLREX __builtin_arm_clrex |
| | | |
| | | #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 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 |
| | | */ |
| | | #define __SSAT __builtin_arm_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 __builtin_arm_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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief LDRT Unprivileged (8 bit) |
| | | \details Executes a Unprivileged LDRT instruction for 8 bit value. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint8_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return ((uint8_t) result); /* Add explicit type cast here */ |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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) |
| | | */ |
| | | __STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return ((uint16_t) result); /* Add explicit type cast here */ |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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) |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) |
| | | { |
| | | __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) |
| | | { |
| | | __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) |
| | | { |
| | | __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); |
| | | } |
| | | |
| | | #else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 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 |
| | | */ |
| | | __STATIC_FORCEINLINE 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 |
| | | */ |
| | | __STATIC_FORCEINLINE 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)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) |
| | | /** |
| | | \brief Load-Acquire (8 bit) |
| | | \details Executes a LDAB instruction for 8 bit value. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint8_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return ((uint8_t) result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire (16 bit) |
| | | \details Executes a LDAH instruction for 16 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint16_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return ((uint16_t) result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire (32 bit) |
| | | \details Executes a LDA instruction for 32 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint32_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release (8 bit) |
| | | \details Executes a STLB instruction for 8 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | */ |
| | | __STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) |
| | | { |
| | | __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release (16 bit) |
| | | \details Executes a STLH instruction for 16 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | */ |
| | | __STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) |
| | | { |
| | | __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release (32 bit) |
| | | \details Executes a STL instruction for 32 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | */ |
| | | __STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) |
| | | { |
| | | __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire Exclusive (8 bit) |
| | | \details Executes a LDAB exclusive instruction for 8 bit value. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint8_t at (*ptr) |
| | | */ |
| | | #define __LDAEXB (uint8_t)__builtin_arm_ldaex |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire Exclusive (16 bit) |
| | | \details Executes a LDAH exclusive instruction for 16 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint16_t at (*ptr) |
| | | */ |
| | | #define __LDAEXH (uint16_t)__builtin_arm_ldaex |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire Exclusive (32 bit) |
| | | \details Executes a LDA exclusive instruction for 32 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint32_t at (*ptr) |
| | | */ |
| | | #define __LDAEX (uint32_t)__builtin_arm_ldaex |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release Exclusive (8 bit) |
| | | \details Executes a STLB exclusive instruction for 8 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | \return 0 Function succeeded |
| | | \return 1 Function failed |
| | | */ |
| | | #define __STLEXB (uint32_t)__builtin_arm_stlex |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release Exclusive (16 bit) |
| | | \details Executes a STLH exclusive instruction for 16 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | \return 0 Function succeeded |
| | | \return 1 Function failed |
| | | */ |
| | | #define __STLEXH (uint32_t)__builtin_arm_stlex |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release Exclusive (32 bit) |
| | | \details Executes a STL exclusive instruction for 32 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | \return 0 Function succeeded |
| | | \return 1 Function failed |
| | | */ |
| | | #define __STLEX (uint32_t)__builtin_arm_stlex |
| | | |
| | | #endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 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_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) |
| | | |
| | | #define __SADD8 __builtin_arm_sadd8 |
| | | #define __QADD8 __builtin_arm_qadd8 |
| | | #define __SHADD8 __builtin_arm_shadd8 |
| | | #define __UADD8 __builtin_arm_uadd8 |
| | | #define __UQADD8 __builtin_arm_uqadd8 |
| | | #define __UHADD8 __builtin_arm_uhadd8 |
| | | #define __SSUB8 __builtin_arm_ssub8 |
| | | #define __QSUB8 __builtin_arm_qsub8 |
| | | #define __SHSUB8 __builtin_arm_shsub8 |
| | | #define __USUB8 __builtin_arm_usub8 |
| | | #define __UQSUB8 __builtin_arm_uqsub8 |
| | | #define __UHSUB8 __builtin_arm_uhsub8 |
| | | #define __SADD16 __builtin_arm_sadd16 |
| | | #define __QADD16 __builtin_arm_qadd16 |
| | | #define __SHADD16 __builtin_arm_shadd16 |
| | | #define __UADD16 __builtin_arm_uadd16 |
| | | #define __UQADD16 __builtin_arm_uqadd16 |
| | | #define __UHADD16 __builtin_arm_uhadd16 |
| | | #define __SSUB16 __builtin_arm_ssub16 |
| | | #define __QSUB16 __builtin_arm_qsub16 |
| | | #define __SHSUB16 __builtin_arm_shsub16 |
| | | #define __USUB16 __builtin_arm_usub16 |
| | | #define __UQSUB16 __builtin_arm_uqsub16 |
| | | #define __UHSUB16 __builtin_arm_uhsub16 |
| | | #define __SASX __builtin_arm_sasx |
| | | #define __QASX __builtin_arm_qasx |
| | | #define __SHASX __builtin_arm_shasx |
| | | #define __UASX __builtin_arm_uasx |
| | | #define __UQASX __builtin_arm_uqasx |
| | | #define __UHASX __builtin_arm_uhasx |
| | | #define __SSAX __builtin_arm_ssax |
| | | #define __QSAX __builtin_arm_qsax |
| | | #define __SHSAX __builtin_arm_shsax |
| | | #define __USAX __builtin_arm_usax |
| | | #define __UQSAX __builtin_arm_uqsax |
| | | #define __UHSAX __builtin_arm_uhsax |
| | | #define __USAD8 __builtin_arm_usad8 |
| | | #define __USADA8 __builtin_arm_usada8 |
| | | #define __SSAT16 __builtin_arm_ssat16 |
| | | #define __USAT16 __builtin_arm_usat16 |
| | | #define __UXTB16 __builtin_arm_uxtb16 |
| | | #define __UXTAB16 __builtin_arm_uxtab16 |
| | | #define __SXTB16 __builtin_arm_sxtb16 |
| | | #define __SXTAB16 __builtin_arm_sxtab16 |
| | | #define __SMUAD __builtin_arm_smuad |
| | | #define __SMUADX __builtin_arm_smuadx |
| | | #define __SMLAD __builtin_arm_smlad |
| | | #define __SMLADX __builtin_arm_smladx |
| | | #define __SMLALD __builtin_arm_smlald |
| | | #define __SMLALDX __builtin_arm_smlaldx |
| | | #define __SMUSD __builtin_arm_smusd |
| | | #define __SMUSDX __builtin_arm_smusdx |
| | | #define __SMLSD __builtin_arm_smlsd |
| | | #define __SMLSDX __builtin_arm_smlsdx |
| | | #define __SMLSLD __builtin_arm_smlsld |
| | | #define __SMLSLDX __builtin_arm_smlsldx |
| | | #define __SEL __builtin_arm_sel |
| | | #define __QADD __builtin_arm_qadd |
| | | #define __QSUB __builtin_arm_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) ) |
| | | |
| | | __STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) |
| | | { |
| | | int32_t result; |
| | | |
| | | __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | #endif /* (__ARM_FEATURE_DSP == 1) */ |
| | | /*@} end of group CMSIS_SIMD_intrinsics */ |
| | | |
| | | |
| | | #endif /* __CMSIS_ARMCLANG_H */ |
New file |
| | |
| | | /**************************************************************************//** |
| | | * @file cmsis_armclang_ltm.h |
| | | * @brief CMSIS compiler armclang (Arm Compiler 6) header file |
| | | * @version V1.2.0 |
| | | * @date 08. May 2019 |
| | | ******************************************************************************/ |
| | | /* |
| | | * Copyright (c) 2018-2019 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. |
| | | */ |
| | | |
| | | /*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ |
| | | |
| | | #ifndef __CMSIS_ARMCLANG_H |
| | | #define __CMSIS_ARMCLANG_H |
| | | |
| | | #pragma clang system_header /* treat file as system include file */ |
| | | |
| | | #ifndef __ARM_COMPAT_H |
| | | #include <arm_compat.h> /* Compatibility header for Arm Compiler 5 intrinsics */ |
| | | #endif |
| | | |
| | | /* 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 __attribute__((always_inline)) 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, aligned(1))) |
| | | #endif |
| | | #ifndef __PACKED_STRUCT |
| | | #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) |
| | | #endif |
| | | #ifndef __PACKED_UNION |
| | | #define __PACKED_UNION union __attribute__((packed, aligned(1))) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT32 /* deprecated */ |
| | | #pragma clang diagnostic push |
| | | #pragma clang diagnostic ignored "-Wpacked" |
| | | /*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ |
| | | struct __attribute__((packed)) T_UINT32 { uint32_t v; }; |
| | | #pragma clang diagnostic pop |
| | | #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT16_WRITE |
| | | #pragma clang diagnostic push |
| | | #pragma clang diagnostic ignored "-Wpacked" |
| | | /*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ |
| | | __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; |
| | | #pragma clang diagnostic pop |
| | | #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT16_READ |
| | | #pragma clang diagnostic push |
| | | #pragma clang diagnostic ignored "-Wpacked" |
| | | /*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ |
| | | __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; |
| | | #pragma clang diagnostic pop |
| | | #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT32_WRITE |
| | | #pragma clang diagnostic push |
| | | #pragma clang diagnostic ignored "-Wpacked" |
| | | /*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ |
| | | __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; |
| | | #pragma clang diagnostic pop |
| | | #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT32_READ |
| | | #pragma clang diagnostic push |
| | | #pragma clang diagnostic ignored "-Wpacked" |
| | | /*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ |
| | | __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; |
| | | #pragma clang diagnostic pop |
| | | #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 |
| | | #define __RESTRICT __restrict |
| | | #endif |
| | | #ifndef __COMPILER_BARRIER |
| | | #define __COMPILER_BARRIER() __ASM volatile("":::"memory") |
| | | #endif |
| | | |
| | | /* ######################### Startup and Lowlevel Init ######################## */ |
| | | |
| | | #ifndef __PROGRAM_START |
| | | #define __PROGRAM_START __main |
| | | #endif |
| | | |
| | | #ifndef __INITIAL_SP |
| | | #define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit |
| | | #endif |
| | | |
| | | #ifndef __STACK_LIMIT |
| | | #define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base |
| | | #endif |
| | | |
| | | #ifndef __VECTOR_TABLE |
| | | #define __VECTOR_TABLE __Vectors |
| | | #endif |
| | | |
| | | #ifndef __VECTOR_TABLE_ATTRIBUTE |
| | | #define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) |
| | | #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(); see arm_compat.h */ |
| | | |
| | | |
| | | /** |
| | | \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(); see arm_compat.h */ |
| | | |
| | | |
| | | /** |
| | | \brief Get Control Register |
| | | \details Returns the content of the Control Register. |
| | | \return Control Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_CONTROL(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, control" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Control Register (non-secure) |
| | | \details Returns the content of the non-secure Control Register when in secure mode. |
| | | \return non-secure Control Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Control Register |
| | | \details Writes the given value to the Control Register. |
| | | \param [in] control Control Register value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) |
| | | { |
| | | __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Control Register (non-secure) |
| | | \details Writes the given value to the non-secure Control Register when in secure state. |
| | | \param [in] control Control Register value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) |
| | | { |
| | | __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Get IPSR Register |
| | | \details Returns the content of the IPSR Register. |
| | | \return IPSR Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_IPSR(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get APSR Register |
| | | \details Returns the content of the APSR Register. |
| | | \return APSR Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_APSR(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, apsr" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get xPSR Register |
| | | \details Returns the content of the xPSR Register. |
| | | \return xPSR Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_xPSR(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Process Stack Pointer |
| | | \details Returns the current value of the Process Stack Pointer (PSP). |
| | | \return PSP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_PSP(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, psp" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Process Stack Pointer (non-secure) |
| | | \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. |
| | | \return PSP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \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_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) |
| | | { |
| | | __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Process Stack Pointer (non-secure) |
| | | \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. |
| | | \param [in] topOfProcStack Process Stack Pointer value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) |
| | | { |
| | | __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Get Main Stack Pointer |
| | | \details Returns the current value of the Main Stack Pointer (MSP). |
| | | \return MSP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_MSP(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, msp" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Main Stack Pointer (non-secure) |
| | | \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. |
| | | \return MSP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \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_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) |
| | | { |
| | | __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Main Stack Pointer (non-secure) |
| | | \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. |
| | | \param [in] topOfMainStack Main Stack Pointer value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) |
| | | { |
| | | __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Stack Pointer (non-secure) |
| | | \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. |
| | | \return SP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Set Stack Pointer (non-secure) |
| | | \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. |
| | | \param [in] topOfStack Stack Pointer value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) |
| | | { |
| | | __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Get Priority Mask |
| | | \details Returns the current state of the priority mask bit from the Priority Mask Register. |
| | | \return Priority Mask value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, primask" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Priority Mask (non-secure) |
| | | \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. |
| | | \return Priority Mask value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Priority Mask |
| | | \details Assigns the given value to the Priority Mask Register. |
| | | \param [in] priMask Priority Mask |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) |
| | | { |
| | | __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Priority Mask (non-secure) |
| | | \details Assigns the given value to the non-secure Priority Mask Register when in secure state. |
| | | \param [in] priMask Priority Mask |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) |
| | | { |
| | | __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 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 /* see arm_compat.h */ |
| | | |
| | | |
| | | /** |
| | | \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 /* see arm_compat.h */ |
| | | |
| | | |
| | | /** |
| | | \brief Get Base Priority |
| | | \details Returns the current value of the Base Priority register. |
| | | \return Base Priority register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, basepri" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Base Priority (non-secure) |
| | | \details Returns the current value of the non-secure Base Priority register when in secure state. |
| | | \return Base Priority register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Base Priority |
| | | \details Assigns the given value to the Base Priority register. |
| | | \param [in] basePri Base Priority value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) |
| | | { |
| | | __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Base Priority (non-secure) |
| | | \details Assigns the given value to the non-secure Base Priority register when in secure state. |
| | | \param [in] basePri Base Priority value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) |
| | | { |
| | | __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \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_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) |
| | | { |
| | | __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Fault Mask |
| | | \details Returns the current value of the Fault Mask register. |
| | | \return Fault Mask register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Fault Mask (non-secure) |
| | | \details Returns the current value of the non-secure Fault Mask register when in secure state. |
| | | \return Fault Mask register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Fault Mask |
| | | \details Assigns the given value to the Fault Mask register. |
| | | \param [in] faultMask Fault Mask value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) |
| | | { |
| | | __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Fault Mask (non-secure) |
| | | \details Assigns the given value to the non-secure Fault Mask register when in secure state. |
| | | \param [in] faultMask Fault Mask value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) |
| | | { |
| | | __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); |
| | | } |
| | | #endif |
| | | |
| | | #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) |
| | | |
| | | /** |
| | | \brief Get Process Stack Pointer Limit |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence zero is returned always in non-secure |
| | | mode. |
| | | |
| | | \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). |
| | | \return PSPLIM Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) |
| | | { |
| | | #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 |
| | | return 0U; |
| | | #else |
| | | uint32_t result; |
| | | __ASM volatile ("MRS %0, psplim" : "=r" (result) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Process Stack Pointer Limit (non-secure) |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence zero is returned always in non-secure |
| | | mode. |
| | | |
| | | \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. |
| | | \return PSPLIM Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) |
| | | { |
| | | #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) |
| | | // without main extensions, the non-secure PSPLIM is RAZ/WI |
| | | return 0U; |
| | | #else |
| | | uint32_t result; |
| | | __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Process Stack Pointer Limit |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence the write is silently ignored in non-secure |
| | | mode. |
| | | |
| | | \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). |
| | | \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) |
| | | { |
| | | #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)ProcStackPtrLimit; |
| | | #else |
| | | __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); |
| | | #endif |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Process Stack Pointer (non-secure) |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence the write is silently ignored in non-secure |
| | | mode. |
| | | |
| | | \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. |
| | | \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) |
| | | { |
| | | #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) |
| | | // without main extensions, the non-secure PSPLIM is RAZ/WI |
| | | (void)ProcStackPtrLimit; |
| | | #else |
| | | __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Get Main Stack Pointer Limit |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence zero is returned always. |
| | | |
| | | \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). |
| | | \return MSPLIM Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) |
| | | { |
| | | #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 |
| | | return 0U; |
| | | #else |
| | | uint32_t result; |
| | | __ASM volatile ("MRS %0, msplim" : "=r" (result) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Main Stack Pointer Limit (non-secure) |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence zero is returned always. |
| | | |
| | | \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. |
| | | \return MSPLIM Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) |
| | | { |
| | | #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) |
| | | // without main extensions, the non-secure MSPLIM is RAZ/WI |
| | | return 0U; |
| | | #else |
| | | uint32_t result; |
| | | __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Main Stack Pointer Limit |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence the write is silently ignored. |
| | | |
| | | \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). |
| | | \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) |
| | | { |
| | | #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)MainStackPtrLimit; |
| | | #else |
| | | __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); |
| | | #endif |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Main Stack Pointer Limit (non-secure) |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence the write is silently ignored. |
| | | |
| | | \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. |
| | | \param [in] MainStackPtrLimit Main Stack Pointer value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) |
| | | { |
| | | #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) |
| | | // without main extensions, the non-secure MSPLIM is RAZ/WI |
| | | (void)MainStackPtrLimit; |
| | | #else |
| | | __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | #endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ |
| | | |
| | | /** |
| | | \brief Get FPSCR |
| | | \details Returns the current value of the Floating Point Status/Control register. |
| | | \return Floating Point Status/Control register value |
| | | */ |
| | | #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ |
| | | (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) |
| | | #define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr |
| | | #else |
| | | #define __get_FPSCR() ((uint32_t)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 |
| | | */ |
| | | #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ |
| | | (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) |
| | | #define __set_FPSCR __builtin_arm_set_fpscr |
| | | #else |
| | | #define __set_FPSCR(x) ((void)(x)) |
| | | #endif |
| | | |
| | | |
| | | /*@} end of CMSIS_Core_RegAccFunctions */ |
| | | |
| | | |
| | | /* ########################## Core Instruction Access ######################### */ |
| | | /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface |
| | | Access to dedicated instructions |
| | | @{ |
| | | */ |
| | | |
| | | /* Define macros for porting to both thumb1 and thumb2. |
| | | * For thumb1, use low register (r0-r7), specified by constraint "l" |
| | | * Otherwise, use general registers, specified by constraint "r" */ |
| | | #if defined (__thumb__) && !defined (__thumb2__) |
| | | #define __CMSIS_GCC_OUT_REG(r) "=l" (r) |
| | | #define __CMSIS_GCC_USE_REG(r) "l" (r) |
| | | #else |
| | | #define __CMSIS_GCC_OUT_REG(r) "=r" (r) |
| | | #define __CMSIS_GCC_USE_REG(r) "r" (r) |
| | | #endif |
| | | |
| | | /** |
| | | \brief No Operation |
| | | \details No Operation does nothing. This instruction can be used for code alignment purposes. |
| | | */ |
| | | #define __NOP __builtin_arm_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 __builtin_arm_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 __builtin_arm_wfe |
| | | |
| | | |
| | | /** |
| | | \brief Send Event |
| | | \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. |
| | | */ |
| | | #define __SEV __builtin_arm_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() __builtin_arm_isb(0xF) |
| | | |
| | | /** |
| | | \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() __builtin_arm_dsb(0xF) |
| | | |
| | | |
| | | /** |
| | | \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() __builtin_arm_dmb(0xF) |
| | | |
| | | |
| | | /** |
| | | \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(value) __builtin_bswap32(value) |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | #define __REV16(value) __ROR(__REV(value), 16) |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | #define __REVSH(value) (int16_t)__builtin_bswap16(value) |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) |
| | | { |
| | | op2 %= 32U; |
| | | if (op2 == 0U) |
| | | { |
| | | return op1; |
| | | } |
| | | return (op1 >> op2) | (op1 << (32U - op2)); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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) __ASM volatile ("bkpt "#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 |
| | | */ |
| | | #define __RBIT __builtin_arm_rbit |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) |
| | | { |
| | | /* Even though __builtin_clz produces a CLZ instruction on ARM, formally |
| | | __builtin_clz(0) is undefined behaviour, so handle this case specially. |
| | | This guarantees ARM-compatible results if happening to compile on a non-ARM |
| | | target, and ensures the compiler doesn't decide to activate any |
| | | optimisations using the logic "value was passed to __builtin_clz, so it |
| | | is non-zero". |
| | | ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a |
| | | single CLZ instruction. |
| | | */ |
| | | if (value == 0U) |
| | | { |
| | | return 32U; |
| | | } |
| | | return __builtin_clz(value); |
| | | } |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 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) |
| | | */ |
| | | #define __LDREXB (uint8_t)__builtin_arm_ldrex |
| | | |
| | | |
| | | /** |
| | | \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) |
| | | */ |
| | | #define __LDREXH (uint16_t)__builtin_arm_ldrex |
| | | |
| | | |
| | | /** |
| | | \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) |
| | | */ |
| | | #define __LDREXW (uint32_t)__builtin_arm_ldrex |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | #define __STREXB (uint32_t)__builtin_arm_strex |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | #define __STREXH (uint32_t)__builtin_arm_strex |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | #define __STREXW (uint32_t)__builtin_arm_strex |
| | | |
| | | |
| | | /** |
| | | \brief Remove the exclusive lock |
| | | \details Removes the exclusive lock which is created by LDREX. |
| | | */ |
| | | #define __CLREX __builtin_arm_clrex |
| | | |
| | | #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 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 |
| | | */ |
| | | #define __SSAT __builtin_arm_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 __builtin_arm_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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief LDRT Unprivileged (8 bit) |
| | | \details Executes a Unprivileged LDRT instruction for 8 bit value. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint8_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return ((uint8_t) result); /* Add explicit type cast here */ |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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) |
| | | */ |
| | | __STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return ((uint16_t) result); /* Add explicit type cast here */ |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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) |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) |
| | | { |
| | | __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) |
| | | { |
| | | __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) |
| | | { |
| | | __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); |
| | | } |
| | | |
| | | #else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 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 |
| | | */ |
| | | __STATIC_FORCEINLINE 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 |
| | | */ |
| | | __STATIC_FORCEINLINE 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)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) |
| | | /** |
| | | \brief Load-Acquire (8 bit) |
| | | \details Executes a LDAB instruction for 8 bit value. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint8_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return ((uint8_t) result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire (16 bit) |
| | | \details Executes a LDAH instruction for 16 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint16_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return ((uint16_t) result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire (32 bit) |
| | | \details Executes a LDA instruction for 32 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint32_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release (8 bit) |
| | | \details Executes a STLB instruction for 8 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | */ |
| | | __STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) |
| | | { |
| | | __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release (16 bit) |
| | | \details Executes a STLH instruction for 16 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | */ |
| | | __STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) |
| | | { |
| | | __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release (32 bit) |
| | | \details Executes a STL instruction for 32 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | */ |
| | | __STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) |
| | | { |
| | | __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire Exclusive (8 bit) |
| | | \details Executes a LDAB exclusive instruction for 8 bit value. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint8_t at (*ptr) |
| | | */ |
| | | #define __LDAEXB (uint8_t)__builtin_arm_ldaex |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire Exclusive (16 bit) |
| | | \details Executes a LDAH exclusive instruction for 16 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint16_t at (*ptr) |
| | | */ |
| | | #define __LDAEXH (uint16_t)__builtin_arm_ldaex |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire Exclusive (32 bit) |
| | | \details Executes a LDA exclusive instruction for 32 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint32_t at (*ptr) |
| | | */ |
| | | #define __LDAEX (uint32_t)__builtin_arm_ldaex |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release Exclusive (8 bit) |
| | | \details Executes a STLB exclusive instruction for 8 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | \return 0 Function succeeded |
| | | \return 1 Function failed |
| | | */ |
| | | #define __STLEXB (uint32_t)__builtin_arm_stlex |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release Exclusive (16 bit) |
| | | \details Executes a STLH exclusive instruction for 16 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | \return 0 Function succeeded |
| | | \return 1 Function failed |
| | | */ |
| | | #define __STLEXH (uint32_t)__builtin_arm_stlex |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release Exclusive (32 bit) |
| | | \details Executes a STL exclusive instruction for 32 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | \return 0 Function succeeded |
| | | \return 1 Function failed |
| | | */ |
| | | #define __STLEX (uint32_t)__builtin_arm_stlex |
| | | |
| | | #endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 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_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | #define __SSAT16(ARG1,ARG2) \ |
| | | ({ \ |
| | | int32_t __RES, __ARG1 = (ARG1); \ |
| | | __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ |
| | | __RES; \ |
| | | }) |
| | | |
| | | #define __USAT16(ARG1,ARG2) \ |
| | | ({ \ |
| | | uint32_t __RES, __ARG1 = (ARG1); \ |
| | | __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ |
| | | __RES; \ |
| | | }) |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) |
| | | { |
| | | union llreg_u{ |
| | | uint32_t w32[2]; |
| | | uint64_t w64; |
| | | } llr; |
| | | llr.w64 = acc; |
| | | |
| | | #ifndef __ARMEB__ /* Little endian */ |
| | | __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); |
| | | #else /* Big endian */ |
| | | __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); |
| | | #endif |
| | | |
| | | return(llr.w64); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) |
| | | { |
| | | union llreg_u{ |
| | | uint32_t w32[2]; |
| | | uint64_t w64; |
| | | } llr; |
| | | llr.w64 = acc; |
| | | |
| | | #ifndef __ARMEB__ /* Little endian */ |
| | | __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); |
| | | #else /* Big endian */ |
| | | __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); |
| | | #endif |
| | | |
| | | return(llr.w64); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) |
| | | { |
| | | union llreg_u{ |
| | | uint32_t w32[2]; |
| | | uint64_t w64; |
| | | } llr; |
| | | llr.w64 = acc; |
| | | |
| | | #ifndef __ARMEB__ /* Little endian */ |
| | | __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); |
| | | #else /* Big endian */ |
| | | __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); |
| | | #endif |
| | | |
| | | return(llr.w64); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) |
| | | { |
| | | union llreg_u{ |
| | | uint32_t w32[2]; |
| | | uint64_t w64; |
| | | } llr; |
| | | llr.w64 = acc; |
| | | |
| | | #ifndef __ARMEB__ /* Little endian */ |
| | | __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); |
| | | #else /* Big endian */ |
| | | __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); |
| | | #endif |
| | | |
| | | return(llr.w64); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) |
| | | { |
| | | int32_t result; |
| | | |
| | | __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) |
| | | { |
| | | int32_t result; |
| | | |
| | | __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | #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) ) |
| | | |
| | | __STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) |
| | | { |
| | | int32_t result; |
| | | |
| | | __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | #endif /* (__ARM_FEATURE_DSP == 1) */ |
| | | /*@} end of group CMSIS_SIMD_intrinsics */ |
| | | |
| | | |
| | | #endif /* __CMSIS_ARMCLANG_H */ |
New file |
| | |
| | | /**************************************************************************//** |
| | | * @file cmsis_compiler.h |
| | | * @brief CMSIS compiler generic header file |
| | | * @version V5.1.0 |
| | | * @date 09. October 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.6 LTM (armclang) |
| | | */ |
| | | #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) |
| | | #include "cmsis_armclang_ltm.h" |
| | | |
| | | /* |
| | | * Arm Compiler above 6.10.1 (armclang) |
| | | */ |
| | | #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) |
| | | #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 |
| | | #define __RESTRICT __restrict |
| | | #endif |
| | | #ifndef __COMPILER_BARRIER |
| | | #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. |
| | | #define __COMPILER_BARRIER() (void)0 |
| | | #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 |
| | | #ifndef __COMPILER_BARRIER |
| | | #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. |
| | | #define __COMPILER_BARRIER() (void)0 |
| | | #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 |
| | | #ifndef __COMPILER_BARRIER |
| | | #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. |
| | | #define __COMPILER_BARRIER() (void)0 |
| | | #endif |
| | | |
| | | |
| | | #else |
| | | #error Unknown compiler. |
| | | #endif |
| | | |
| | | |
| | | #endif /* __CMSIS_COMPILER_H */ |
| | | |
New file |
| | |
| | | /**************************************************************************//** |
| | | * @file cmsis_gcc.h |
| | | * @brief CMSIS compiler GCC header file |
| | | * @version V5.2.0 |
| | | * @date 08. May 2019 |
| | | ******************************************************************************/ |
| | | /* |
| | | * Copyright (c) 2009-2019 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_GCC_H |
| | | #define __CMSIS_GCC_H |
| | | |
| | | /* ignore some GCC warnings */ |
| | | #pragma GCC diagnostic push |
| | | #pragma GCC diagnostic ignored "-Wsign-conversion" |
| | | #pragma GCC diagnostic ignored "-Wconversion" |
| | | #pragma GCC diagnostic ignored "-Wunused-parameter" |
| | | |
| | | /* Fallback for __has_builtin */ |
| | | #ifndef __has_builtin |
| | | #define __has_builtin(x) (0) |
| | | #endif |
| | | |
| | | /* 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 __attribute__((always_inline)) 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, aligned(1))) |
| | | #endif |
| | | #ifndef __PACKED_STRUCT |
| | | #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) |
| | | #endif |
| | | #ifndef __PACKED_UNION |
| | | #define __PACKED_UNION union __attribute__((packed, aligned(1))) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT32 /* deprecated */ |
| | | #pragma GCC diagnostic push |
| | | #pragma GCC diagnostic ignored "-Wpacked" |
| | | #pragma GCC diagnostic ignored "-Wattributes" |
| | | struct __attribute__((packed)) T_UINT32 { uint32_t v; }; |
| | | #pragma GCC diagnostic pop |
| | | #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT16_WRITE |
| | | #pragma GCC diagnostic push |
| | | #pragma GCC diagnostic ignored "-Wpacked" |
| | | #pragma GCC diagnostic ignored "-Wattributes" |
| | | __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; |
| | | #pragma GCC diagnostic pop |
| | | #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT16_READ |
| | | #pragma GCC diagnostic push |
| | | #pragma GCC diagnostic ignored "-Wpacked" |
| | | #pragma GCC diagnostic ignored "-Wattributes" |
| | | __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; |
| | | #pragma GCC diagnostic pop |
| | | #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT32_WRITE |
| | | #pragma GCC diagnostic push |
| | | #pragma GCC diagnostic ignored "-Wpacked" |
| | | #pragma GCC diagnostic ignored "-Wattributes" |
| | | __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; |
| | | #pragma GCC diagnostic pop |
| | | #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) |
| | | #endif |
| | | #ifndef __UNALIGNED_UINT32_READ |
| | | #pragma GCC diagnostic push |
| | | #pragma GCC diagnostic ignored "-Wpacked" |
| | | #pragma GCC diagnostic ignored "-Wattributes" |
| | | __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; |
| | | #pragma GCC diagnostic pop |
| | | #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 |
| | | #define __RESTRICT __restrict |
| | | #endif |
| | | #ifndef __COMPILER_BARRIER |
| | | #define __COMPILER_BARRIER() __ASM volatile("":::"memory") |
| | | #endif |
| | | |
| | | /* ######################### Startup and Lowlevel Init ######################## */ |
| | | |
| | | #ifndef __PROGRAM_START |
| | | |
| | | /** |
| | | \brief Initializes data and bss sections |
| | | \details This default implementations initialized all data and additional bss |
| | | sections relying on .copy.table and .zero.table specified properly |
| | | in the used linker script. |
| | | |
| | | */ |
| | | __STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void) |
| | | { |
| | | extern void _start(void) __NO_RETURN; |
| | | |
| | | typedef struct { |
| | | uint32_t const* src; |
| | | uint32_t* dest; |
| | | uint32_t wlen; |
| | | } __copy_table_t; |
| | | |
| | | typedef struct { |
| | | uint32_t* dest; |
| | | uint32_t wlen; |
| | | } __zero_table_t; |
| | | |
| | | extern const __copy_table_t __copy_table_start__; |
| | | extern const __copy_table_t __copy_table_end__; |
| | | extern const __zero_table_t __zero_table_start__; |
| | | extern const __zero_table_t __zero_table_end__; |
| | | |
| | | for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) { |
| | | for(uint32_t i=0u; i<pTable->wlen; ++i) { |
| | | pTable->dest[i] = pTable->src[i]; |
| | | } |
| | | } |
| | | |
| | | for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) { |
| | | for(uint32_t i=0u; i<pTable->wlen; ++i) { |
| | | pTable->dest[i] = 0u; |
| | | } |
| | | } |
| | | |
| | | _start(); |
| | | } |
| | | |
| | | #define __PROGRAM_START __cmsis_start |
| | | #endif |
| | | |
| | | #ifndef __INITIAL_SP |
| | | #define __INITIAL_SP __StackTop |
| | | #endif |
| | | |
| | | #ifndef __STACK_LIMIT |
| | | #define __STACK_LIMIT __StackLimit |
| | | #endif |
| | | |
| | | #ifndef __VECTOR_TABLE |
| | | #define __VECTOR_TABLE __Vectors |
| | | #endif |
| | | |
| | | #ifndef __VECTOR_TABLE_ATTRIBUTE |
| | | #define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section(".vectors"))) |
| | | #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. |
| | | */ |
| | | __STATIC_FORCEINLINE void __enable_irq(void) |
| | | { |
| | | __ASM volatile ("cpsie i" : : : "memory"); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Disable IRQ Interrupts |
| | | \details Disables IRQ interrupts by setting the I-bit in the CPSR. |
| | | Can only be executed in Privileged modes. |
| | | */ |
| | | __STATIC_FORCEINLINE void __disable_irq(void) |
| | | { |
| | | __ASM volatile ("cpsid i" : : : "memory"); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Control Register |
| | | \details Returns the content of the Control Register. |
| | | \return Control Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_CONTROL(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, control" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Control Register (non-secure) |
| | | \details Returns the content of the non-secure Control Register when in secure mode. |
| | | \return non-secure Control Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Control Register |
| | | \details Writes the given value to the Control Register. |
| | | \param [in] control Control Register value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) |
| | | { |
| | | __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Control Register (non-secure) |
| | | \details Writes the given value to the non-secure Control Register when in secure state. |
| | | \param [in] control Control Register value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) |
| | | { |
| | | __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Get IPSR Register |
| | | \details Returns the content of the IPSR Register. |
| | | \return IPSR Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_IPSR(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get APSR Register |
| | | \details Returns the content of the APSR Register. |
| | | \return APSR Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_APSR(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, apsr" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get xPSR Register |
| | | \details Returns the content of the xPSR Register. |
| | | \return xPSR Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_xPSR(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Process Stack Pointer |
| | | \details Returns the current value of the Process Stack Pointer (PSP). |
| | | \return PSP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_PSP(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, psp" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Process Stack Pointer (non-secure) |
| | | \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. |
| | | \return PSP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \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_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) |
| | | { |
| | | __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Process Stack Pointer (non-secure) |
| | | \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. |
| | | \param [in] topOfProcStack Process Stack Pointer value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) |
| | | { |
| | | __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Get Main Stack Pointer |
| | | \details Returns the current value of the Main Stack Pointer (MSP). |
| | | \return MSP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_MSP(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, msp" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Main Stack Pointer (non-secure) |
| | | \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. |
| | | \return MSP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \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_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) |
| | | { |
| | | __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Main Stack Pointer (non-secure) |
| | | \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. |
| | | \param [in] topOfMainStack Main Stack Pointer value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) |
| | | { |
| | | __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Stack Pointer (non-secure) |
| | | \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. |
| | | \return SP Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Set Stack Pointer (non-secure) |
| | | \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. |
| | | \param [in] topOfStack Stack Pointer value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) |
| | | { |
| | | __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Get Priority Mask |
| | | \details Returns the current state of the priority mask bit from the Priority Mask Register. |
| | | \return Priority Mask value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Priority Mask (non-secure) |
| | | \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. |
| | | \return Priority Mask value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Priority Mask |
| | | \details Assigns the given value to the Priority Mask Register. |
| | | \param [in] priMask Priority Mask |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) |
| | | { |
| | | __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Priority Mask (non-secure) |
| | | \details Assigns the given value to the non-secure Priority Mask Register when in secure state. |
| | | \param [in] priMask Priority Mask |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) |
| | | { |
| | | __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) |
| | | /** |
| | | \brief Enable FIQ |
| | | \details Enables FIQ interrupts by clearing the F-bit in the CPSR. |
| | | Can only be executed in Privileged modes. |
| | | */ |
| | | __STATIC_FORCEINLINE void __enable_fault_irq(void) |
| | | { |
| | | __ASM volatile ("cpsie f" : : : "memory"); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Disable FIQ |
| | | \details Disables FIQ interrupts by setting the F-bit in the CPSR. |
| | | Can only be executed in Privileged modes. |
| | | */ |
| | | __STATIC_FORCEINLINE void __disable_fault_irq(void) |
| | | { |
| | | __ASM volatile ("cpsid f" : : : "memory"); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Base Priority |
| | | \details Returns the current value of the Base Priority register. |
| | | \return Base Priority register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, basepri" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Base Priority (non-secure) |
| | | \details Returns the current value of the non-secure Base Priority register when in secure state. |
| | | \return Base Priority register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Base Priority |
| | | \details Assigns the given value to the Base Priority register. |
| | | \param [in] basePri Base Priority value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) |
| | | { |
| | | __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Base Priority (non-secure) |
| | | \details Assigns the given value to the non-secure Base Priority register when in secure state. |
| | | \param [in] basePri Base Priority value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) |
| | | { |
| | | __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \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_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) |
| | | { |
| | | __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Fault Mask |
| | | \details Returns the current value of the Fault Mask register. |
| | | \return Fault Mask register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Fault Mask (non-secure) |
| | | \details Returns the current value of the non-secure Fault Mask register when in secure state. |
| | | \return Fault Mask register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); |
| | | return(result); |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Fault Mask |
| | | \details Assigns the given value to the Fault Mask register. |
| | | \param [in] faultMask Fault Mask value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) |
| | | { |
| | | __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Fault Mask (non-secure) |
| | | \details Assigns the given value to the non-secure Fault Mask register when in secure state. |
| | | \param [in] faultMask Fault Mask value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) |
| | | { |
| | | __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); |
| | | } |
| | | #endif |
| | | |
| | | #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) |
| | | |
| | | /** |
| | | \brief Get Process Stack Pointer Limit |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence zero is returned always in non-secure |
| | | mode. |
| | | |
| | | \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). |
| | | \return PSPLIM Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) |
| | | { |
| | | #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 |
| | | return 0U; |
| | | #else |
| | | uint32_t result; |
| | | __ASM volatile ("MRS %0, psplim" : "=r" (result) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Process Stack Pointer Limit (non-secure) |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence zero is returned always. |
| | | |
| | | \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. |
| | | \return PSPLIM Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) |
| | | { |
| | | #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) |
| | | // without main extensions, the non-secure PSPLIM is RAZ/WI |
| | | return 0U; |
| | | #else |
| | | uint32_t result; |
| | | __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Process Stack Pointer Limit |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence the write is silently ignored in non-secure |
| | | mode. |
| | | |
| | | \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). |
| | | \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) |
| | | { |
| | | #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)ProcStackPtrLimit; |
| | | #else |
| | | __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); |
| | | #endif |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Process Stack Pointer (non-secure) |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence the write is silently ignored. |
| | | |
| | | \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. |
| | | \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) |
| | | { |
| | | #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) |
| | | // without main extensions, the non-secure PSPLIM is RAZ/WI |
| | | (void)ProcStackPtrLimit; |
| | | #else |
| | | __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Get Main Stack Pointer Limit |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence zero is returned always in non-secure |
| | | mode. |
| | | |
| | | \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). |
| | | \return MSPLIM Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) |
| | | { |
| | | #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 |
| | | return 0U; |
| | | #else |
| | | uint32_t result; |
| | | __ASM volatile ("MRS %0, msplim" : "=r" (result) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Get Main Stack Pointer Limit (non-secure) |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence zero is returned always. |
| | | |
| | | \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. |
| | | \return MSPLIM Register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) |
| | | { |
| | | #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) |
| | | // without main extensions, the non-secure MSPLIM is RAZ/WI |
| | | return 0U; |
| | | #else |
| | | uint32_t result; |
| | | __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | |
| | | /** |
| | | \brief Set Main Stack Pointer Limit |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence the write is silently ignored in non-secure |
| | | mode. |
| | | |
| | | \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). |
| | | \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) |
| | | { |
| | | #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)MainStackPtrLimit; |
| | | #else |
| | | __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); |
| | | #endif |
| | | } |
| | | |
| | | |
| | | #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) |
| | | /** |
| | | \brief Set Main Stack Pointer Limit (non-secure) |
| | | Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure |
| | | Stack Pointer Limit register hence the write is silently ignored. |
| | | |
| | | \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. |
| | | \param [in] MainStackPtrLimit Main Stack Pointer value to set |
| | | */ |
| | | __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) |
| | | { |
| | | #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) |
| | | // without main extensions, the non-secure MSPLIM is RAZ/WI |
| | | (void)MainStackPtrLimit; |
| | | #else |
| | | __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | #endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ |
| | | |
| | | |
| | | /** |
| | | \brief Get FPSCR |
| | | \details Returns the current value of the Floating Point Status/Control register. |
| | | \return Floating Point Status/Control register value |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __get_FPSCR(void) |
| | | { |
| | | #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ |
| | | (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) |
| | | #if __has_builtin(__builtin_arm_get_fpscr) |
| | | // Re-enable using built-in when GCC has been fixed |
| | | // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) |
| | | /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ |
| | | return __builtin_arm_get_fpscr(); |
| | | #else |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); |
| | | return(result); |
| | | #endif |
| | | #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_FORCEINLINE void __set_FPSCR(uint32_t fpscr) |
| | | { |
| | | #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ |
| | | (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) |
| | | #if __has_builtin(__builtin_arm_set_fpscr) |
| | | // Re-enable using built-in when GCC has been fixed |
| | | // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) |
| | | /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ |
| | | __builtin_arm_set_fpscr(fpscr); |
| | | #else |
| | | __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); |
| | | #endif |
| | | #else |
| | | (void)fpscr; |
| | | #endif |
| | | } |
| | | |
| | | |
| | | /*@} end of CMSIS_Core_RegAccFunctions */ |
| | | |
| | | |
| | | /* ########################## Core Instruction Access ######################### */ |
| | | /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface |
| | | Access to dedicated instructions |
| | | @{ |
| | | */ |
| | | |
| | | /* Define macros for porting to both thumb1 and thumb2. |
| | | * For thumb1, use low register (r0-r7), specified by constraint "l" |
| | | * Otherwise, use general registers, specified by constraint "r" */ |
| | | #if defined (__thumb__) && !defined (__thumb2__) |
| | | #define __CMSIS_GCC_OUT_REG(r) "=l" (r) |
| | | #define __CMSIS_GCC_RW_REG(r) "+l" (r) |
| | | #define __CMSIS_GCC_USE_REG(r) "l" (r) |
| | | #else |
| | | #define __CMSIS_GCC_OUT_REG(r) "=r" (r) |
| | | #define __CMSIS_GCC_RW_REG(r) "+r" (r) |
| | | #define __CMSIS_GCC_USE_REG(r) "r" (r) |
| | | #endif |
| | | |
| | | /** |
| | | \brief No Operation |
| | | \details No Operation does nothing. This instruction can be used for code alignment purposes. |
| | | */ |
| | | #define __NOP() __ASM volatile ("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() __ASM volatile ("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() __ASM volatile ("wfe") |
| | | |
| | | |
| | | /** |
| | | \brief Send Event |
| | | \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. |
| | | */ |
| | | #define __SEV() __ASM volatile ("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. |
| | | */ |
| | | __STATIC_FORCEINLINE void __ISB(void) |
| | | { |
| | | __ASM volatile ("isb 0xF":::"memory"); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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. |
| | | */ |
| | | __STATIC_FORCEINLINE void __DSB(void) |
| | | { |
| | | __ASM volatile ("dsb 0xF":::"memory"); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Data Memory Barrier |
| | | \details Ensures the apparent order of the explicit memory operations before |
| | | and after the instruction, without ensuring their completion. |
| | | */ |
| | | __STATIC_FORCEINLINE void __DMB(void) |
| | | { |
| | | __ASM volatile ("dmb 0xF":::"memory"); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __REV(uint32_t value) |
| | | { |
| | | #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) |
| | | return __builtin_bswap32(value); |
| | | #else |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Reverse byte order (16 bit) |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); |
| | | return result; |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Reverse byte order (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 |
| | | */ |
| | | __STATIC_FORCEINLINE int16_t __REVSH(int16_t value) |
| | | { |
| | | #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) |
| | | return (int16_t)__builtin_bswap16(value); |
| | | #else |
| | | int16_t result; |
| | | |
| | | __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); |
| | | return result; |
| | | #endif |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Rotate Right in unsigned value (32 bit) |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) |
| | | { |
| | | op2 %= 32U; |
| | | if (op2 == 0U) |
| | | { |
| | | return op1; |
| | | } |
| | | return (op1 >> op2) | (op1 << (32U - op2)); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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) __ASM volatile ("bkpt "#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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) |
| | | { |
| | | uint32_t result; |
| | | |
| | | #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) |
| | | __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); |
| | | #else |
| | | 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 */ |
| | | #endif |
| | | return result; |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) |
| | | { |
| | | /* Even though __builtin_clz produces a CLZ instruction on ARM, formally |
| | | __builtin_clz(0) is undefined behaviour, so handle this case specially. |
| | | This guarantees ARM-compatible results if happening to compile on a non-ARM |
| | | target, and ensures the compiler doesn't decide to activate any |
| | | optimisations using the logic "value was passed to __builtin_clz, so it |
| | | is non-zero". |
| | | ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a |
| | | single CLZ instruction. |
| | | */ |
| | | if (value == 0U) |
| | | { |
| | | return 32U; |
| | | } |
| | | return __builtin_clz(value); |
| | | } |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 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) |
| | | */ |
| | | __STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) |
| | | __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); |
| | | #else |
| | | /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not |
| | | accepted by assembler. So has to use following less efficient pattern. |
| | | */ |
| | | __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); |
| | | #endif |
| | | return ((uint8_t) result); /* Add explicit type cast here */ |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief LDR Exclusive (16 bit) |
| | | \details Executes a exclusive LDR instruction for 16 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint16_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) |
| | | __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); |
| | | #else |
| | | /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not |
| | | accepted by assembler. So has to use following less efficient pattern. |
| | | */ |
| | | __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); |
| | | #endif |
| | | return ((uint16_t) result); /* Add explicit type cast here */ |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief LDR Exclusive (32 bit) |
| | | \details Executes a exclusive LDR instruction for 32 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint32_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief STR Exclusive (8 bit) |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief STR Exclusive (16 bit) |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief STR Exclusive (32 bit) |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Remove the exclusive lock |
| | | \details Removes the exclusive lock which is created by LDREX. |
| | | */ |
| | | __STATIC_FORCEINLINE void __CLREX(void) |
| | | { |
| | | __ASM volatile ("clrex" ::: "memory"); |
| | | } |
| | | |
| | | #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) |
| | | /** |
| | | \brief Signed Saturate |
| | | \details Saturates a signed value. |
| | | \param [in] ARG1 Value to be saturated |
| | | \param [in] ARG2 Bit position to saturate to (1..32) |
| | | \return Saturated value |
| | | */ |
| | | #define __SSAT(ARG1,ARG2) \ |
| | | __extension__ \ |
| | | ({ \ |
| | | int32_t __RES, __ARG1 = (ARG1); \ |
| | | __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ |
| | | __RES; \ |
| | | }) |
| | | |
| | | |
| | | /** |
| | | \brief Unsigned Saturate |
| | | \details Saturates an unsigned value. |
| | | \param [in] ARG1 Value to be saturated |
| | | \param [in] ARG2 Bit position to saturate to (0..31) |
| | | \return Saturated value |
| | | */ |
| | | #define __USAT(ARG1,ARG2) \ |
| | | __extension__ \ |
| | | ({ \ |
| | | uint32_t __RES, __ARG1 = (ARG1); \ |
| | | __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ |
| | | __RES; \ |
| | | }) |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief LDRT Unprivileged (8 bit) |
| | | \details Executes a Unprivileged LDRT instruction for 8 bit value. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint8_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) |
| | | __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | #else |
| | | /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not |
| | | accepted by assembler. So has to use following less efficient pattern. |
| | | */ |
| | | __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); |
| | | #endif |
| | | return ((uint8_t) result); /* Add explicit type cast here */ |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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) |
| | | */ |
| | | __STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) |
| | | __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | #else |
| | | /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not |
| | | accepted by assembler. So has to use following less efficient pattern. |
| | | */ |
| | | __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); |
| | | #endif |
| | | return ((uint16_t) result); /* Add explicit type cast here */ |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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) |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) |
| | | { |
| | | __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) |
| | | { |
| | | __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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 |
| | | */ |
| | | __STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) |
| | | { |
| | | __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); |
| | | } |
| | | |
| | | #else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ |
| | | (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 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 |
| | | */ |
| | | __STATIC_FORCEINLINE 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 |
| | | */ |
| | | __STATIC_FORCEINLINE 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)) || \ |
| | | (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ |
| | | |
| | | |
| | | #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) |
| | | /** |
| | | \brief Load-Acquire (8 bit) |
| | | \details Executes a LDAB instruction for 8 bit value. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint8_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return ((uint8_t) result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire (16 bit) |
| | | \details Executes a LDAH instruction for 16 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint16_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return ((uint16_t) result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire (32 bit) |
| | | \details Executes a LDA instruction for 32 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint32_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release (8 bit) |
| | | \details Executes a STLB instruction for 8 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | */ |
| | | __STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) |
| | | { |
| | | __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release (16 bit) |
| | | \details Executes a STLH instruction for 16 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | */ |
| | | __STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) |
| | | { |
| | | __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release (32 bit) |
| | | \details Executes a STL instruction for 32 bit values. |
| | | \param [in] value Value to store |
| | | \param [in] ptr Pointer to location |
| | | */ |
| | | __STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) |
| | | { |
| | | __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire Exclusive (8 bit) |
| | | \details Executes a LDAB exclusive instruction for 8 bit value. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint8_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return ((uint8_t) result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire Exclusive (16 bit) |
| | | \details Executes a LDAH exclusive instruction for 16 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint16_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return ((uint16_t) result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Load-Acquire Exclusive (32 bit) |
| | | \details Executes a LDA exclusive instruction for 32 bit values. |
| | | \param [in] ptr Pointer to data |
| | | \return value of type uint32_t at (*ptr) |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release Exclusive (8 bit) |
| | | \details Executes a STLB exclusive 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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release Exclusive (16 bit) |
| | | \details Executes a STLH exclusive 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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Store-Release Exclusive (32 bit) |
| | | \details Executes a STL exclusive 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 |
| | | */ |
| | | __STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); |
| | | return(result); |
| | | } |
| | | |
| | | #endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ |
| | | (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 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_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | #define __SSAT16(ARG1,ARG2) \ |
| | | ({ \ |
| | | int32_t __RES, __ARG1 = (ARG1); \ |
| | | __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ |
| | | __RES; \ |
| | | }) |
| | | |
| | | #define __USAT16(ARG1,ARG2) \ |
| | | ({ \ |
| | | uint32_t __RES, __ARG1 = (ARG1); \ |
| | | __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ |
| | | __RES; \ |
| | | }) |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) |
| | | { |
| | | union llreg_u{ |
| | | uint32_t w32[2]; |
| | | uint64_t w64; |
| | | } llr; |
| | | llr.w64 = acc; |
| | | |
| | | #ifndef __ARMEB__ /* Little endian */ |
| | | __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); |
| | | #else /* Big endian */ |
| | | __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); |
| | | #endif |
| | | |
| | | return(llr.w64); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) |
| | | { |
| | | union llreg_u{ |
| | | uint32_t w32[2]; |
| | | uint64_t w64; |
| | | } llr; |
| | | llr.w64 = acc; |
| | | |
| | | #ifndef __ARMEB__ /* Little endian */ |
| | | __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); |
| | | #else /* Big endian */ |
| | | __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); |
| | | #endif |
| | | |
| | | return(llr.w64); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) |
| | | { |
| | | union llreg_u{ |
| | | uint32_t w32[2]; |
| | | uint64_t w64; |
| | | } llr; |
| | | llr.w64 = acc; |
| | | |
| | | #ifndef __ARMEB__ /* Little endian */ |
| | | __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); |
| | | #else /* Big endian */ |
| | | __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); |
| | | #endif |
| | | |
| | | return(llr.w64); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) |
| | | { |
| | | union llreg_u{ |
| | | uint32_t w32[2]; |
| | | uint64_t w64; |
| | | } llr; |
| | | llr.w64 = acc; |
| | | |
| | | #ifndef __ARMEB__ /* Little endian */ |
| | | __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); |
| | | #else /* Big endian */ |
| | | __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); |
| | | #endif |
| | | |
| | | return(llr.w64); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) |
| | | { |
| | | uint32_t result; |
| | | |
| | | __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) |
| | | { |
| | | int32_t result; |
| | | |
| | | __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) |
| | | { |
| | | int32_t result; |
| | | |
| | | __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); |
| | | return(result); |
| | | } |
| | | |
| | | #if 0 |
| | | #define __PKHBT(ARG1,ARG2,ARG3) \ |
| | | ({ \ |
| | | uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ |
| | | __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ |
| | | __RES; \ |
| | | }) |
| | | |
| | | #define __PKHTB(ARG1,ARG2,ARG3) \ |
| | | ({ \ |
| | | uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ |
| | | if (ARG3 == 0) \ |
| | | __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ |
| | | else \ |
| | | __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ |
| | | __RES; \ |
| | | }) |
| | | #endif |
| | | |
| | | #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) ) |
| | | |
| | | __STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) |
| | | { |
| | | int32_t result; |
| | | |
| | | __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); |
| | | return(result); |
| | | } |
| | | |
| | | #endif /* (__ARM_FEATURE_DSP == 1) */ |
| | | /*@} end of group CMSIS_SIMD_intrinsics */ |
| | | |
| | | |
| | | #pragma GCC diagnostic pop |
| | | |
| | | #endif /* __CMSIS_GCC_H */ |
New file |
| | |
| | | /**************************************************************************//** |
| | | * @file cmsis_iccarm.h |
| | | * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file |
| | | * @version V5.1.0 |
| | | * @date 08. May 2019 |
| | | ******************************************************************************/ |
| | | |
| | | //------------------------------------------------------------------------------ |
| | | // |
| | | // Copyright (c) 2017-2019 IAR Systems |
| | | // Copyright (c) 2017-2019 Arm Limited. All rights reserved. |
| | | // |
| | | // 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 __COMPILER_BARRIER |
| | | #define __COMPILER_BARRIER() __ASM volatile("":::"memory") |
| | | #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 |
| | | #if __ICCARM_V8 |
| | | #define __RESTRICT __restrict |
| | | #else |
| | | /* Needs IAR language extensions */ |
| | | #define __RESTRICT restrict |
| | | #endif |
| | | #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 __PROGRAM_START |
| | | #define __PROGRAM_START __iar_program_start |
| | | #endif |
| | | |
| | | #ifndef __INITIAL_SP |
| | | #define __INITIAL_SP CSTACK$$Limit |
| | | #endif |
| | | |
| | | #ifndef __STACK_LIMIT |
| | | #define __STACK_LIMIT CSTACK$$Base |
| | | #endif |
| | | |
| | | #ifndef __VECTOR_TABLE |
| | | #define __VECTOR_TABLE __vector_table |
| | | #endif |
| | | |
| | | #ifndef __VECTOR_TABLE_ATTRIBUTE |
| | | #define __VECTOR_TABLE_ATTRIBUTE @".intvec" |
| | | #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__ */ |
New file |
| | |
| | | /**************************************************************************//** |
| | | * @file cmsis_version.h |
| | | * @brief CMSIS Core(M) Version definitions |
| | | * @version V5.0.3 |
| | | * @date 24. June 2019 |
| | | ******************************************************************************/ |
| | | /* |
| | | * Copyright (c) 2009-2019 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 ( 3U) /*!< [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 |
New file |
| | |
| | | /**************************************************************************//** |
| | | * @file core_armv81mml.h |
| | | * @brief CMSIS Armv8.1-M Mainline Core Peripheral Access Layer Header File |
| | | * @version V1.0.0 |
| | | * @date 15. March 2019 |
| | | ******************************************************************************/ |
| | | /* |
| | | * Copyright (c) 2018-2019 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_ARMV81MML_H_GENERIC |
| | | #define __CORE_ARMV81MML_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_ARMV81MML |
| | | @{ |
| | | */ |
| | | |
| | | #include "cmsis_version.h" |
| | | |
| | | #define __ARM_ARCH_8M_MAIN__ 1 // patching for now |
| | | /* CMSIS ARMV81MML definitions */ |
| | | #define __ARMv81MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ |
| | | #define __ARMv81MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ |
| | | #define __ARMv81MML_CMSIS_VERSION ((__ARMv81MML_CMSIS_VERSION_MAIN << 16U) | \ |
| | | __ARMv81MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ |
| | | |
| | | #define __CORTEX_M (81U) /*!< Cortex-M Core */ |
| | | |
| | | /** __FPU_USED indicates whether an FPU is used or not. |
| | | For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. |
| | | */ |
| | | #if defined ( __CC_ARM ) |
| | | #if defined __TARGET_FPU_VFP |
| | | #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) |
| | | #define __FPU_USED 1U |
| | | #else |
| | | #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | #else |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | |
| | | #if defined(__ARM_FEATURE_DSP) |
| | | #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) |
| | | #define __DSP_USED 1U |
| | | #else |
| | | #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" |
| | | #define __DSP_USED 0U |
| | | #endif |
| | | #else |
| | | #define __DSP_USED 0U |
| | | #endif |
| | | |
| | | #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) |
| | | #if defined __ARM_FP |
| | | #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) |
| | | #define __FPU_USED 1U |
| | | #else |
| | | #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | #else |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | |
| | | #if defined(__ARM_FEATURE_DSP) |
| | | #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) |
| | | #define __DSP_USED 1U |
| | | #else |
| | | #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" |
| | | #define __DSP_USED 0U |
| | | #endif |
| | | #else |
| | | #define __DSP_USED 0U |
| | | #endif |
| | | |
| | | #elif defined ( __GNUC__ ) |
| | | #if defined (__VFP_FP__) && !defined(__SOFTFP__) |
| | | #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) |
| | | #define __FPU_USED 1U |
| | | #else |
| | | #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | #else |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | |
| | | #if defined(__ARM_FEATURE_DSP) |
| | | #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) |
| | | #define __DSP_USED 1U |
| | | #else |
| | | #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" |
| | | #define __DSP_USED 0U |
| | | #endif |
| | | #else |
| | | #define __DSP_USED 0U |
| | | #endif |
| | | |
| | | #elif defined ( __ICCARM__ ) |
| | | #if defined __ARMVFP__ |
| | | #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) |
| | | #define __FPU_USED 1U |
| | | #else |
| | | #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | #else |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | |
| | | #if defined(__ARM_FEATURE_DSP) |
| | | #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) |
| | | #define __DSP_USED 1U |
| | | #else |
| | | #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" |
| | | #define __DSP_USED 0U |
| | | #endif |
| | | #else |
| | | #define __DSP_USED 0U |
| | | #endif |
| | | |
| | | #elif defined ( __TI_ARM__ ) |
| | | #if defined __TI_VFP_SUPPORT__ |
| | | #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) |
| | | #define __FPU_USED 1U |
| | | #else |
| | | #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | #else |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | |
| | | #elif defined ( __TASKING__ ) |
| | | #if defined __FPU_VFP__ |
| | | #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) |
| | | #define __FPU_USED 1U |
| | | #else |
| | | #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | #else |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | |
| | | #elif defined ( __CSMC__ ) |
| | | #if ( __CSMC__ & 0x400U) |
| | | #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) |
| | | #define __FPU_USED 1U |
| | | #else |
| | | #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | #else |
| | | #define __FPU_USED 0U |
| | | #endif |
| | | |
| | | #endif |
| | | |
| | | #include "cmsis_compiler.h" /* CMSIS compiler specific defines */ |
| | | |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | | |
| | | #endif /* __CORE_ARMV81MML_H_GENERIC */ |
| | | |
| | | #ifndef __CMSIS_GENERIC |
| | | |
| | | #ifndef __CORE_ARMV81MML_H_DEPENDANT |
| | | #define __CORE_ARMV81MML_H_DEPENDANT |
| | | |
| | | #ifdef __cplusplus |
| | | extern "C" { |
| | | #endif |
| | | |
| | | /* check device defines and use defaults */ |
| | | #if defined __CHECK_DEVICE_DEFINES |
| | | #ifndef __ARMv81MML_REV |
| | | #define __ARMv81MML_REV 0x0000U |
| | | #warning "__ARMv81MML_REV not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __FPU_PRESENT |
| | | #define __FPU_PRESENT 0U |
| | | #warning "__FPU_PRESENT not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __MPU_PRESENT |
| | | #define __MPU_PRESENT 0U |
| | | #warning "__MPU_PRESENT not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __SAUREGION_PRESENT |
| | | #define __SAUREGION_PRESENT 0U |
| | | #warning "__SAUREGION_PRESENT not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __DSP_PRESENT |
| | | #define __DSP_PRESENT 0U |
| | | #warning "__DSP_PRESENT not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __NVIC_PRIO_BITS |
| | | #define __NVIC_PRIO_BITS 3U |
| | | #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 ARMv81MML */ |
| | | |
| | | |
| | | |
| | | /******************************************************************************* |
| | | * Register Abstraction |
| | | Core Register contain: |
| | | - Core Register |
| | | - Core NVIC Register |
| | | - Core SCB Register |
| | | - Core SysTick Register |
| | | - Core Debug Register |
| | | - Core MPU Register |
| | | - Core SAU Register |
| | | - Core FPU 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:16; /*!< bit: 0..15 Reserved */ |
| | | uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ |
| | | uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ |
| | | uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ |
| | | 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 */ |
| | | |
| | | #define APSR_Q_Pos 27U /*!< APSR: Q Position */ |
| | | #define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ |
| | | |
| | | #define APSR_GE_Pos 16U /*!< APSR: GE Position */ |
| | | #define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE 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:7; /*!< bit: 9..15 Reserved */ |
| | | uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ |
| | | uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ |
| | | uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ |
| | | uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ |
| | | uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ |
| | | 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_Q_Pos 27U /*!< xPSR: Q Position */ |
| | | #define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ |
| | | |
| | | #define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ |
| | | #define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ |
| | | |
| | | #define xPSR_T_Pos 24U /*!< xPSR: T Position */ |
| | | #define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ |
| | | |
| | | #define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ |
| | | #define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ |
| | | |
| | | #define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ |
| | | #define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ |
| | | |
| | | |
| | | /** |
| | | \brief Union type to access the Control Registers (CONTROL). |
| | | */ |
| | | typedef union |
| | | { |
| | | struct |
| | | { |
| | | uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ |
| | | uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ |
| | | uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ |
| | | uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ |
| | | uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ |
| | | } b; /*!< Structure used for bit access */ |
| | | uint32_t w; /*!< Type used for word access */ |
| | | } CONTROL_Type; |
| | | |
| | | /* CONTROL Register Definitions */ |
| | | #define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ |
| | | #define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ |
| | | |
| | | #define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ |
| | | #define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ |
| | | |
| | | #define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ |
| | | #define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ |
| | | |
| | | #define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ |
| | | #define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ |
| | | |
| | | /*@} end of group CMSIS_CORE */ |
| | | |
| | | |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) |
| | | \brief Type definitions for the NVIC Registers |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ |
| | | uint32_t RESERVED0[16U]; |
| | | __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ |
| | | uint32_t RSERVED1[16U]; |
| | | __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ |
| | | uint32_t RESERVED2[16U]; |
| | | __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ |
| | | uint32_t RESERVED3[16U]; |
| | | __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ |
| | | uint32_t RESERVED4[16U]; |
| | | __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ |
| | | uint32_t RESERVED5[16U]; |
| | | __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ |
| | | uint32_t RESERVED6[580U]; |
| | | __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ |
| | | } NVIC_Type; |
| | | |
| | | /* Software Triggered Interrupt Register Definitions */ |
| | | #define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ |
| | | #define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ |
| | | |
| | | /*@} 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 */ |
| | | __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ |
| | | __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 */ |
| | | __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ |
| | | __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ |
| | | __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ |
| | | __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ |
| | | __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ |
| | | __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ |
| | | __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ |
| | | __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ |
| | | __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ |
| | | __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ |
| | | __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ |
| | | __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ |
| | | __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ |
| | | __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ |
| | | __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ |
| | | __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ |
| | | __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ |
| | | __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ |
| | | __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ |
| | | uint32_t RESERVED3[92U]; |
| | | __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ |
| | | uint32_t RESERVED4[15U]; |
| | | __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ |
| | | __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ |
| | | __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ |
| | | uint32_t RESERVED5[1U]; |
| | | __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ |
| | | uint32_t RESERVED6[1U]; |
| | | __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ |
| | | __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ |
| | | __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ |
| | | __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ |
| | | __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ |
| | | __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ |
| | | __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ |
| | | __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ |
| | | uint32_t RESERVED7[6U]; |
| | | __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ |
| | | __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ |
| | | __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ |
| | | __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ |
| | | __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ |
| | | uint32_t RESERVED8[1U]; |
| | | __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status 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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ |
| | | #define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ |
| | | |
| | | #define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ |
| | | #define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ |
| | | |
| | | #define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ |
| | | #define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ |
| | | #define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ |
| | | |
| | | #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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ |
| | | #define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE 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 Vector Table Offset Register Definitions */ |
| | | #define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ |
| | | #define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF 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_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ |
| | | #define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ |
| | | |
| | | #define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ |
| | | #define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ |
| | | |
| | | #define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ |
| | | #define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ |
| | | |
| | | #define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ |
| | | #define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ |
| | | #define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ |
| | | #define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ |
| | | |
| | | #define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ |
| | | #define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ |
| | | |
| | | #define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ |
| | | #define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ |
| | | |
| | | #define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ |
| | | #define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ |
| | | |
| | | #define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ |
| | | #define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ |
| | | |
| | | #define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ |
| | | #define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ |
| | | |
| | | #define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ |
| | | #define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ |
| | | |
| | | /* SCB System Handler Control and State Register Definitions */ |
| | | #define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ |
| | | #define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ |
| | | |
| | | #define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ |
| | | #define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ |
| | | |
| | | #define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ |
| | | #define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ |
| | | |
| | | #define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ |
| | | #define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ |
| | | |
| | | #define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ |
| | | #define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ |
| | | |
| | | #define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ |
| | | #define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ |
| | | |
| | | #define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ |
| | | #define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ |
| | | |
| | | #define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ |
| | | #define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ |
| | | |
| | | #define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ |
| | | #define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ |
| | | |
| | | #define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ |
| | | #define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ |
| | | |
| | | #define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ |
| | | #define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ |
| | | |
| | | #define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ |
| | | #define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ |
| | | |
| | | #define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ |
| | | #define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ |
| | | |
| | | #define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ |
| | | #define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ |
| | | |
| | | #define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ |
| | | #define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ |
| | | |
| | | #define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ |
| | | #define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ |
| | | |
| | | #define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ |
| | | #define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ |
| | | |
| | | #define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ |
| | | #define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ |
| | | |
| | | #define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ |
| | | #define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ |
| | | |
| | | #define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ |
| | | #define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ |
| | | |
| | | /* SCB Configurable Fault Status Register Definitions */ |
| | | #define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ |
| | | #define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ |
| | | |
| | | #define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ |
| | | #define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ |
| | | |
| | | #define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ |
| | | #define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ |
| | | |
| | | /* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ |
| | | #define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ |
| | | #define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ |
| | | |
| | | #define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ |
| | | #define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ |
| | | |
| | | #define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ |
| | | #define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ |
| | | |
| | | #define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ |
| | | #define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ |
| | | |
| | | #define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ |
| | | #define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ |
| | | |
| | | #define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ |
| | | #define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ |
| | | |
| | | /* BusFault Status Register (part of SCB Configurable Fault Status Register) */ |
| | | #define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ |
| | | #define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ |
| | | |
| | | #define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ |
| | | #define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ |
| | | |
| | | #define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ |
| | | #define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ |
| | | |
| | | #define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ |
| | | #define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ |
| | | |
| | | #define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ |
| | | #define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ |
| | | |
| | | #define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ |
| | | #define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ |
| | | |
| | | #define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ |
| | | #define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ |
| | | |
| | | /* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ |
| | | #define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ |
| | | #define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ |
| | | |
| | | #define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ |
| | | #define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ |
| | | |
| | | #define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ |
| | | #define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ |
| | | |
| | | #define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ |
| | | #define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ |
| | | |
| | | #define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ |
| | | #define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ |
| | | |
| | | #define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ |
| | | #define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ |
| | | |
| | | #define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ |
| | | #define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ |
| | | |
| | | /* SCB Hard Fault Status Register Definitions */ |
| | | #define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ |
| | | #define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ |
| | | |
| | | #define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ |
| | | #define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ |
| | | |
| | | #define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ |
| | | #define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ |
| | | |
| | | /* SCB Debug Fault Status Register Definitions */ |
| | | #define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ |
| | | #define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ |
| | | |
| | | #define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ |
| | | #define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ |
| | | |
| | | #define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ |
| | | #define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ |
| | | |
| | | #define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ |
| | | #define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ |
| | | |
| | | #define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ |
| | | #define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ |
| | | |
| | | /* SCB Non-Secure Access Control Register Definitions */ |
| | | #define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ |
| | | #define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ |
| | | |
| | | #define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ |
| | | #define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ |
| | | |
| | | #define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ |
| | | #define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ |
| | | |
| | | /* SCB Cache Level ID Register Definitions */ |
| | | #define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ |
| | | #define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ |
| | | |
| | | #define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ |
| | | #define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ |
| | | |
| | | /* SCB Cache Type Register Definitions */ |
| | | #define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ |
| | | #define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ |
| | | |
| | | #define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ |
| | | #define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ |
| | | |
| | | #define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ |
| | | #define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ |
| | | |
| | | #define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ |
| | | #define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ |
| | | |
| | | #define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ |
| | | #define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ |
| | | |
| | | /* SCB Cache Size ID Register Definitions */ |
| | | #define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ |
| | | #define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ |
| | | |
| | | #define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ |
| | | #define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ |
| | | |
| | | #define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ |
| | | #define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ |
| | | |
| | | #define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ |
| | | #define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ |
| | | |
| | | #define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ |
| | | #define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ |
| | | |
| | | #define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ |
| | | #define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ |
| | | |
| | | #define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ |
| | | #define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ |
| | | |
| | | /* SCB Cache Size Selection Register Definitions */ |
| | | #define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ |
| | | #define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ |
| | | |
| | | #define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ |
| | | #define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ |
| | | |
| | | /* SCB Software Triggered Interrupt Register Definitions */ |
| | | #define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ |
| | | #define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ |
| | | |
| | | /* SCB D-Cache Invalidate by Set-way Register Definitions */ |
| | | #define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ |
| | | #define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ |
| | | |
| | | #define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ |
| | | #define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ |
| | | |
| | | /* SCB D-Cache Clean by Set-way Register Definitions */ |
| | | #define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ |
| | | #define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ |
| | | |
| | | #define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ |
| | | #define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ |
| | | |
| | | /* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ |
| | | #define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ |
| | | #define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ |
| | | |
| | | #define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ |
| | | #define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ |
| | | |
| | | /* Instruction Tightly-Coupled Memory Control Register Definitions */ |
| | | #define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ |
| | | #define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ |
| | | |
| | | #define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ |
| | | #define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ |
| | | |
| | | #define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ |
| | | #define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ |
| | | |
| | | #define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ |
| | | #define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ |
| | | |
| | | /* Data Tightly-Coupled Memory Control Register Definitions */ |
| | | #define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ |
| | | #define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ |
| | | |
| | | #define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ |
| | | #define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ |
| | | |
| | | #define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ |
| | | #define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ |
| | | |
| | | #define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ |
| | | #define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ |
| | | |
| | | /* AHBP Control Register Definitions */ |
| | | #define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ |
| | | #define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ |
| | | |
| | | #define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ |
| | | #define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ |
| | | |
| | | /* L1 Cache Control Register Definitions */ |
| | | #define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ |
| | | #define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ |
| | | |
| | | #define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ |
| | | #define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ |
| | | |
| | | #define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ |
| | | #define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ |
| | | |
| | | /* AHBS Control Register Definitions */ |
| | | #define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ |
| | | #define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ |
| | | |
| | | #define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ |
| | | #define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ |
| | | |
| | | #define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ |
| | | #define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ |
| | | |
| | | /* Auxiliary Bus Fault Status Register Definitions */ |
| | | #define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ |
| | | #define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ |
| | | |
| | | #define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ |
| | | #define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ |
| | | |
| | | #define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ |
| | | #define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ |
| | | |
| | | #define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ |
| | | #define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ |
| | | |
| | | #define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ |
| | | #define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ |
| | | |
| | | #define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ |
| | | #define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM 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[1U]; |
| | | __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ |
| | | __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ |
| | | __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ |
| | | } SCnSCB_Type; |
| | | |
| | | /* Interrupt Controller Type Register Definitions */ |
| | | #define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ |
| | | #define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM 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_ITM Instrumentation Trace Macrocell (ITM) |
| | | \brief Type definitions for the Instrumentation Trace Macrocell (ITM) |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __OM union |
| | | { |
| | | __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ |
| | | __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ |
| | | __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ |
| | | } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ |
| | | uint32_t RESERVED0[864U]; |
| | | __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ |
| | | uint32_t RESERVED1[15U]; |
| | | __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ |
| | | uint32_t RESERVED2[15U]; |
| | | __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ |
| | | uint32_t RESERVED3[29U]; |
| | | __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ |
| | | __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ |
| | | __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ |
| | | uint32_t RESERVED4[43U]; |
| | | __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ |
| | | __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ |
| | | uint32_t RESERVED5[1U]; |
| | | __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ |
| | | uint32_t RESERVED6[4U]; |
| | | __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ |
| | | __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ |
| | | __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ |
| | | __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ |
| | | __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ |
| | | __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ |
| | | __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ |
| | | __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ |
| | | __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ |
| | | __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ |
| | | __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ |
| | | __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ |
| | | } ITM_Type; |
| | | |
| | | /* ITM Stimulus Port Register Definitions */ |
| | | #define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ |
| | | #define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ |
| | | |
| | | #define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ |
| | | #define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ |
| | | |
| | | /* ITM Trace Privilege Register Definitions */ |
| | | #define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ |
| | | #define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ |
| | | |
| | | /* ITM Trace Control Register Definitions */ |
| | | #define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ |
| | | #define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ |
| | | |
| | | #define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ |
| | | #define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ |
| | | |
| | | #define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ |
| | | #define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ |
| | | |
| | | #define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ |
| | | #define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ |
| | | |
| | | #define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ |
| | | #define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ |
| | | |
| | | #define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ |
| | | #define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ |
| | | |
| | | #define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ |
| | | #define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ |
| | | |
| | | #define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ |
| | | #define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ |
| | | |
| | | #define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ |
| | | #define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ |
| | | |
| | | #define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ |
| | | #define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ |
| | | |
| | | /* ITM Integration Write Register Definitions */ |
| | | #define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ |
| | | #define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ |
| | | |
| | | /* ITM Integration Read Register Definitions */ |
| | | #define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ |
| | | #define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ |
| | | |
| | | /* ITM Integration Mode Control Register Definitions */ |
| | | #define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ |
| | | #define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ |
| | | |
| | | /* ITM Lock Status Register Definitions */ |
| | | #define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ |
| | | #define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ |
| | | |
| | | #define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ |
| | | #define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ |
| | | |
| | | #define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ |
| | | #define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ |
| | | |
| | | /*@}*/ /* end of group CMSIS_ITM */ |
| | | |
| | | |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) |
| | | \brief Type definitions for the Data Watchpoint and Trace (DWT) |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Data Watchpoint and Trace Register (DWT). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ |
| | | __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ |
| | | __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ |
| | | __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ |
| | | __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ |
| | | __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ |
| | | __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ |
| | | __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ |
| | | __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ |
| | | uint32_t RESERVED1[1U]; |
| | | __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ |
| | | uint32_t RESERVED2[1U]; |
| | | __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ |
| | | uint32_t RESERVED3[1U]; |
| | | __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ |
| | | uint32_t RESERVED4[1U]; |
| | | __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ |
| | | uint32_t RESERVED5[1U]; |
| | | __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ |
| | | uint32_t RESERVED6[1U]; |
| | | __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ |
| | | uint32_t RESERVED7[1U]; |
| | | __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ |
| | | uint32_t RESERVED8[1U]; |
| | | __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ |
| | | uint32_t RESERVED9[1U]; |
| | | __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ |
| | | uint32_t RESERVED10[1U]; |
| | | __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ |
| | | uint32_t RESERVED11[1U]; |
| | | __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ |
| | | uint32_t RESERVED12[1U]; |
| | | __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ |
| | | uint32_t RESERVED13[1U]; |
| | | __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ |
| | | uint32_t RESERVED14[1U]; |
| | | __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ |
| | | uint32_t RESERVED15[1U]; |
| | | __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ |
| | | uint32_t RESERVED16[1U]; |
| | | __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ |
| | | uint32_t RESERVED17[1U]; |
| | | __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ |
| | | uint32_t RESERVED18[1U]; |
| | | __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ |
| | | uint32_t RESERVED19[1U]; |
| | | __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ |
| | | uint32_t RESERVED20[1U]; |
| | | __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ |
| | | uint32_t RESERVED21[1U]; |
| | | __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ |
| | | uint32_t RESERVED22[1U]; |
| | | __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ |
| | | uint32_t RESERVED23[1U]; |
| | | __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ |
| | | uint32_t RESERVED24[1U]; |
| | | __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ |
| | | uint32_t RESERVED25[1U]; |
| | | __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ |
| | | uint32_t RESERVED26[1U]; |
| | | __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ |
| | | uint32_t RESERVED27[1U]; |
| | | __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ |
| | | uint32_t RESERVED28[1U]; |
| | | __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ |
| | | uint32_t RESERVED29[1U]; |
| | | __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ |
| | | uint32_t RESERVED30[1U]; |
| | | __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ |
| | | uint32_t RESERVED31[1U]; |
| | | __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ |
| | | uint32_t RESERVED32[934U]; |
| | | __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ |
| | | uint32_t RESERVED33[1U]; |
| | | __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ |
| | | } DWT_Type; |
| | | |
| | | /* DWT Control Register Definitions */ |
| | | #define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ |
| | | #define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ |
| | | |
| | | #define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ |
| | | #define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ |
| | | |
| | | #define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ |
| | | #define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ |
| | | |
| | | #define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ |
| | | #define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ |
| | | |
| | | #define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ |
| | | #define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ |
| | | |
| | | #define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ |
| | | #define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ |
| | | |
| | | #define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ |
| | | #define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ |
| | | |
| | | #define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ |
| | | #define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ |
| | | |
| | | #define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ |
| | | #define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ |
| | | |
| | | #define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ |
| | | #define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ |
| | | |
| | | #define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ |
| | | #define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ |
| | | |
| | | #define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ |
| | | #define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ |
| | | |
| | | #define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ |
| | | #define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ |
| | | |
| | | #define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ |
| | | #define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ |
| | | |
| | | #define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ |
| | | #define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ |
| | | |
| | | #define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ |
| | | #define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ |
| | | |
| | | #define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ |
| | | #define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ |
| | | |
| | | #define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ |
| | | #define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ |
| | | |
| | | #define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ |
| | | #define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ |
| | | |
| | | /* DWT CPI Count Register Definitions */ |
| | | #define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ |
| | | #define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ |
| | | |
| | | /* DWT Exception Overhead Count Register Definitions */ |
| | | #define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ |
| | | #define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ |
| | | |
| | | /* DWT Sleep Count Register Definitions */ |
| | | #define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ |
| | | #define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ |
| | | |
| | | /* DWT LSU Count Register Definitions */ |
| | | #define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ |
| | | #define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ |
| | | |
| | | /* DWT Folded-instruction Count Register Definitions */ |
| | | #define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ |
| | | #define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ |
| | | |
| | | /* DWT Comparator Function Register Definitions */ |
| | | #define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ |
| | | #define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ |
| | | |
| | | #define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ |
| | | #define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ |
| | | |
| | | #define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ |
| | | #define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ |
| | | |
| | | #define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ |
| | | #define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ |
| | | |
| | | #define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ |
| | | #define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ |
| | | |
| | | /*@}*/ /* end of group CMSIS_DWT */ |
| | | |
| | | |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_TPI Trace Port Interface (TPI) |
| | | \brief Type definitions for the Trace Port Interface (TPI) |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Trace Port Interface Register (TPI). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ |
| | | __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ |
| | | uint32_t RESERVED0[2U]; |
| | | __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ |
| | | uint32_t RESERVED1[55U]; |
| | | __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ |
| | | uint32_t RESERVED2[131U]; |
| | | __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ |
| | | __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ |
| | | __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ |
| | | uint32_t RESERVED3[759U]; |
| | | __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ |
| | | __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ |
| | | __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ |
| | | uint32_t RESERVED4[1U]; |
| | | __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ |
| | | __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ |
| | | __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ |
| | | uint32_t RESERVED5[39U]; |
| | | __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ |
| | | __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ |
| | | uint32_t RESERVED7[8U]; |
| | | __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ |
| | | __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ |
| | | } TPI_Type; |
| | | |
| | | /* TPI Asynchronous Clock Prescaler Register Definitions */ |
| | | #define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ |
| | | #define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ |
| | | |
| | | /* TPI Selected Pin Protocol Register Definitions */ |
| | | #define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ |
| | | #define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ |
| | | |
| | | /* TPI Formatter and Flush Status Register Definitions */ |
| | | #define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ |
| | | #define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ |
| | | |
| | | #define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ |
| | | #define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ |
| | | |
| | | #define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ |
| | | #define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ |
| | | |
| | | #define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ |
| | | #define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ |
| | | |
| | | /* TPI Formatter and Flush Control Register Definitions */ |
| | | #define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ |
| | | #define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ |
| | | |
| | | #define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ |
| | | #define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ |
| | | |
| | | /* TPI TRIGGER Register Definitions */ |
| | | #define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ |
| | | #define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ |
| | | |
| | | /* TPI Integration ETM Data Register Definitions (FIFO0) */ |
| | | #define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ |
| | | #define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ |
| | | |
| | | #define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ |
| | | #define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ |
| | | |
| | | #define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ |
| | | #define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ |
| | | |
| | | #define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ |
| | | #define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ |
| | | |
| | | #define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ |
| | | #define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ |
| | | |
| | | #define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ |
| | | #define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ |
| | | |
| | | #define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ |
| | | #define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ |
| | | |
| | | /* TPI ITATBCTR2 Register Definitions */ |
| | | #define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ |
| | | #define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ |
| | | |
| | | /* TPI Integration ITM Data Register Definitions (FIFO1) */ |
| | | #define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ |
| | | #define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ |
| | | |
| | | #define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ |
| | | #define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ |
| | | |
| | | #define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ |
| | | #define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ |
| | | |
| | | #define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ |
| | | #define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ |
| | | |
| | | #define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ |
| | | #define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ |
| | | |
| | | #define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ |
| | | #define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ |
| | | |
| | | #define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ |
| | | #define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ |
| | | |
| | | /* TPI ITATBCTR0 Register Definitions */ |
| | | #define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ |
| | | #define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ |
| | | |
| | | /* TPI Integration Mode Control Register Definitions */ |
| | | #define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ |
| | | #define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ |
| | | |
| | | /* TPI DEVID Register Definitions */ |
| | | #define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ |
| | | #define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ |
| | | |
| | | #define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ |
| | | #define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ |
| | | |
| | | #define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ |
| | | #define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ |
| | | |
| | | #define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ |
| | | #define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ |
| | | |
| | | #define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ |
| | | #define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ |
| | | |
| | | #define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ |
| | | #define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ |
| | | |
| | | /* TPI DEVTYPE Register Definitions */ |
| | | #define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ |
| | | #define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ |
| | | |
| | | #define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ |
| | | #define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ |
| | | |
| | | /*@}*/ /* end of group CMSIS_TPI */ |
| | | |
| | | |
| | | #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_MPU Memory Protection Unit (MPU) |
| | | \brief Type definitions for the Memory Protection Unit (MPU) |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Memory Protection Unit (MPU). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ |
| | | __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ |
| | | __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ |
| | | __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ |
| | | __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ |
| | | __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ |
| | | __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ |
| | | __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ |
| | | __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ |
| | | __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ |
| | | __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ |
| | | uint32_t RESERVED0[1]; |
| | | union { |
| | | __IOM uint32_t MAIR[2]; |
| | | struct { |
| | | __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ |
| | | __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ |
| | | }; |
| | | }; |
| | | } MPU_Type; |
| | | |
| | | #define MPU_TYPE_RALIASES 4U |
| | | |
| | | /* MPU Type Register Definitions */ |
| | | #define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ |
| | | #define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ |
| | | |
| | | #define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ |
| | | #define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ |
| | | |
| | | #define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ |
| | | #define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ |
| | | |
| | | /* MPU Control Register Definitions */ |
| | | #define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ |
| | | #define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ |
| | | |
| | | #define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ |
| | | #define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ |
| | | |
| | | #define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ |
| | | #define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ |
| | | |
| | | /* MPU Region Number Register Definitions */ |
| | | #define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ |
| | | #define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ |
| | | |
| | | /* MPU Region Base Address Register Definitions */ |
| | | #define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ |
| | | #define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ |
| | | |
| | | #define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ |
| | | #define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ |
| | | |
| | | #define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ |
| | | #define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ |
| | | |
| | | #define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ |
| | | #define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ |
| | | |
| | | /* MPU Region Limit Address Register Definitions */ |
| | | #define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ |
| | | #define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ |
| | | |
| | | #define MPU_RLAR_PXN_Pos 4U /*!< MPU RLAR: PXN Position */ |
| | | #define MPU_RLAR_PXN_Msk (0x1UL << MPU_RLAR_PXN_Pos) /*!< MPU RLAR: PXN Mask */ |
| | | |
| | | #define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ |
| | | #define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ |
| | | |
| | | #define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ |
| | | #define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ |
| | | |
| | | /* MPU Memory Attribute Indirection Register 0 Definitions */ |
| | | #define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ |
| | | #define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ |
| | | |
| | | #define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ |
| | | #define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ |
| | | |
| | | #define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ |
| | | #define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ |
| | | |
| | | #define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ |
| | | #define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ |
| | | |
| | | /* MPU Memory Attribute Indirection Register 1 Definitions */ |
| | | #define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ |
| | | #define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ |
| | | |
| | | #define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ |
| | | #define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ |
| | | |
| | | #define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ |
| | | #define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ |
| | | |
| | | #define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ |
| | | #define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ |
| | | |
| | | /*@} end of group CMSIS_MPU */ |
| | | #endif |
| | | |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_SAU Security Attribution Unit (SAU) |
| | | \brief Type definitions for the Security Attribution Unit (SAU) |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Security Attribution Unit (SAU). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ |
| | | __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ |
| | | #if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) |
| | | __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ |
| | | __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ |
| | | __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ |
| | | #else |
| | | uint32_t RESERVED0[3]; |
| | | #endif |
| | | __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ |
| | | __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ |
| | | } SAU_Type; |
| | | |
| | | /* SAU Control Register Definitions */ |
| | | #define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ |
| | | #define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ |
| | | |
| | | #define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ |
| | | #define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ |
| | | |
| | | /* SAU Type Register Definitions */ |
| | | #define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ |
| | | #define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ |
| | | |
| | | #if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) |
| | | /* SAU Region Number Register Definitions */ |
| | | #define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ |
| | | #define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ |
| | | |
| | | /* SAU Region Base Address Register Definitions */ |
| | | #define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ |
| | | #define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ |
| | | |
| | | /* SAU Region Limit Address Register Definitions */ |
| | | #define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ |
| | | #define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ |
| | | |
| | | #define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ |
| | | #define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ |
| | | |
| | | #define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ |
| | | #define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ |
| | | |
| | | #endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ |
| | | |
| | | /* Secure Fault Status Register Definitions */ |
| | | #define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ |
| | | #define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ |
| | | |
| | | #define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ |
| | | #define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ |
| | | |
| | | #define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ |
| | | #define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ |
| | | |
| | | #define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ |
| | | #define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ |
| | | |
| | | #define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ |
| | | #define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ |
| | | |
| | | #define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ |
| | | #define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ |
| | | |
| | | #define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ |
| | | #define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ |
| | | |
| | | #define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ |
| | | #define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ |
| | | |
| | | /*@} end of group CMSIS_SAU */ |
| | | #endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ |
| | | |
| | | |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_FPU Floating Point Unit (FPU) |
| | | \brief Type definitions for the Floating Point Unit (FPU) |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Floating Point Unit (FPU). |
| | | */ |
| | | typedef struct |
| | | { |
| | | uint32_t RESERVED0[1U]; |
| | | __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ |
| | | __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ |
| | | __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ |
| | | __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ |
| | | __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ |
| | | } FPU_Type; |
| | | |
| | | /* Floating-Point Context Control Register Definitions */ |
| | | #define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ |
| | | #define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ |
| | | |
| | | #define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ |
| | | #define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ |
| | | |
| | | #define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ |
| | | #define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ |
| | | |
| | | #define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ |
| | | #define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ |
| | | |
| | | #define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ |
| | | #define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ |
| | | |
| | | #define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ |
| | | #define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ |
| | | |
| | | #define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ |
| | | #define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ |
| | | |
| | | #define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ |
| | | #define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ |
| | | |
| | | #define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ |
| | | #define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ |
| | | |
| | | #define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ |
| | | #define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ |
| | | |
| | | #define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ |
| | | #define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ |
| | | |
| | | #define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ |
| | | #define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ |
| | | |
| | | #define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ |
| | | #define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ |
| | | |
| | | #define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ |
| | | #define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ |
| | | |
| | | #define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ |
| | | #define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ |
| | | |
| | | #define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ |
| | | #define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ |
| | | |
| | | #define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ |
| | | #define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ |
| | | |
| | | /* Floating-Point Context Address Register Definitions */ |
| | | #define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ |
| | | #define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ |
| | | |
| | | /* Floating-Point Default Status Control Register Definitions */ |
| | | #define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ |
| | | #define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ |
| | | |
| | | #define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ |
| | | #define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ |
| | | |
| | | #define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ |
| | | #define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ |
| | | |
| | | #define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ |
| | | #define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ |
| | | |
| | | /* Media and FP Feature Register 0 Definitions */ |
| | | #define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ |
| | | #define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ |
| | | |
| | | #define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ |
| | | #define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ |
| | | |
| | | #define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ |
| | | #define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ |
| | | |
| | | #define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ |
| | | #define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ |
| | | |
| | | #define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ |
| | | #define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ |
| | | |
| | | #define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ |
| | | #define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ |
| | | |
| | | #define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ |
| | | #define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ |
| | | |
| | | #define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ |
| | | #define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ |
| | | |
| | | /* Media and FP Feature Register 1 Definitions */ |
| | | #define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ |
| | | #define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ |
| | | |
| | | #define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ |
| | | #define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ |
| | | |
| | | #define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ |
| | | #define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ |
| | | |
| | | #define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ |
| | | #define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ |
| | | |
| | | /*@} end of group CMSIS_FPU */ |
| | | |
| | | |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) |
| | | \brief Type definitions for the Core Debug Registers |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Core Debug Register (CoreDebug). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ |
| | | __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ |
| | | __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ |
| | | __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ |
| | | uint32_t RESERVED4[1U]; |
| | | __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ |
| | | __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ |
| | | } CoreDebug_Type; |
| | | |
| | | /* Debug Halting Control and Status Register Definitions */ |
| | | #define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ |
| | | #define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ |
| | | #define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ |
| | | #define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ |
| | | #define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ |
| | | #define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ |
| | | #define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ |
| | | #define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ |
| | | #define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ |
| | | #define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ |
| | | #define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ |
| | | #define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ |
| | | #define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ |
| | | #define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ |
| | | |
| | | /* Debug Core Register Selector Register Definitions */ |
| | | #define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ |
| | | #define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ |
| | | |
| | | #define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ |
| | | #define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ |
| | | |
| | | /* Debug Exception and Monitor Control Register Definitions */ |
| | | #define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ |
| | | #define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ |
| | | #define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ |
| | | #define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ |
| | | #define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ |
| | | #define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ |
| | | #define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ |
| | | #define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ |
| | | #define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ |
| | | #define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ |
| | | #define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ |
| | | #define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ |
| | | #define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ |
| | | #define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ |
| | | |
| | | /* Debug Authentication Control Register Definitions */ |
| | | #define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ |
| | | #define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ |
| | | |
| | | #define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ |
| | | #define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ |
| | | |
| | | #define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ |
| | | #define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ |
| | | |
| | | #define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ |
| | | #define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ |
| | | |
| | | /* Debug Security Control and Status Register Definitions */ |
| | | #define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ |
| | | #define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ |
| | | |
| | | #define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ |
| | | #define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ |
| | | |
| | | #define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ |
| | | #define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ |
| | | |
| | | /*@} 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 ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ |
| | | #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ |
| | | #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ |
| | | #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug 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 */ |
| | | #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ |
| | | #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ |
| | | #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ |
| | | #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ |
| | | |
| | | #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) |
| | | #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ |
| | | #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ |
| | | #endif |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ |
| | | #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ |
| | | #endif |
| | | |
| | | #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ |
| | | #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ |
| | | #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ |
| | | #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ |
| | | #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ |
| | | #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ |
| | | |
| | | #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ |
| | | #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ |
| | | #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ |
| | | #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ |
| | | #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ |
| | | |
| | | #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) |
| | | #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ |
| | | #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ |
| | | #endif |
| | | |
| | | #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ |
| | | #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ |
| | | |
| | | #endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ |
| | | /*@} */ |
| | | |
| | | |
| | | |
| | | /******************************************************************************* |
| | | * Hardware Abstraction Layer |
| | | Core Function Interface contains: |
| | | - Core NVIC Functions |
| | | - Core SysTick Functions |
| | | - Core Debug 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 |
| | | #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 |
| | | |
| | | |
| | | |
| | | /** |
| | | \brief Set Priority Grouping |
| | | \details Sets the priority grouping field using the required unlock sequence. |
| | | The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. |
| | | Only values from 0..7 are used. |
| | | 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 Priority grouping field. |
| | | */ |
| | | __STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) |
| | | { |
| | | uint32_t reg_value; |
| | | uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ |
| | | |
| | | reg_value = SCB->AIRCR; /* read old register configuration */ |
| | | reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ |
| | | reg_value = (reg_value | |
| | | ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | |
| | | (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ |
| | | SCB->AIRCR = reg_value; |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Priority Grouping |
| | | \details Reads the priority grouping field from the NVIC Interrupt Controller. |
| | | \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). |
| | | */ |
| | | __STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) |
| | | { |
| | | return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Active Interrupt |
| | | \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \return 0 Interrupt status is not active. |
| | | \return 1 Interrupt status is active. |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | /** |
| | | \brief Get Interrupt Target State |
| | | \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \return 0 if interrupt is assigned to Secure |
| | | \return 1 if interrupt is assigned to Non Secure |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Set Interrupt Target State |
| | | \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \return 0 if interrupt is assigned to Secure |
| | | 1 if interrupt is assigned to Non Secure |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); |
| | | return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Clear Interrupt Target State |
| | | \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \return 0 if interrupt is assigned to Secure |
| | | 1 if interrupt is assigned to Non Secure |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); |
| | | return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | #endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ |
| | | |
| | | |
| | | /** |
| | | \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->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); |
| | | } |
| | | else |
| | | { |
| | | SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); |
| | | } |
| | | else |
| | | { |
| | | return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (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. |
| | | VTOR must been relocated to SRAM before. |
| | | \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 *)SCB->VTOR; |
| | | vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; |
| | | __DSB(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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 *)SCB->VTOR; |
| | | 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 = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | |
| | | (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | |
| | | SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ |
| | | __DSB(); /* Ensure completion of memory access */ |
| | | |
| | | for(;;) /* wait until reset */ |
| | | { |
| | | __NOP(); |
| | | } |
| | | } |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | /** |
| | | \brief Set Priority Grouping (non-secure) |
| | | \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. |
| | | The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. |
| | | Only values from 0..7 are used. |
| | | 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 Priority grouping field. |
| | | */ |
| | | __STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) |
| | | { |
| | | uint32_t reg_value; |
| | | uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ |
| | | |
| | | reg_value = SCB_NS->AIRCR; /* read old register configuration */ |
| | | reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ |
| | | reg_value = (reg_value | |
| | | ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | |
| | | (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ |
| | | SCB_NS->AIRCR = reg_value; |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Priority Grouping (non-secure) |
| | | \details Reads the priority grouping field from the non-secure NVIC when in secure state. |
| | | \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). |
| | | */ |
| | | __STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) |
| | | { |
| | | return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Enable Interrupt (non-secure) |
| | | \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Interrupt Enable status (non-secure) |
| | | \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. |
| | | \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Disable Interrupt (non-secure) |
| | | \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Pending Interrupt (non-secure) |
| | | \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Set Pending Interrupt (non-secure) |
| | | \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Clear Pending Interrupt (non-secure) |
| | | \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Active Interrupt (non-secure) |
| | | \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \return 0 Interrupt status is not active. |
| | | \return 1 Interrupt status is active. |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Set Interrupt Priority (non-secure) |
| | | \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. |
| | | 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 non-secure processor exception. |
| | | */ |
| | | __STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); |
| | | } |
| | | else |
| | | { |
| | | SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Interrupt Priority (non-secure) |
| | | \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. |
| | | 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) |
| | | { |
| | | |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); |
| | | } |
| | | else |
| | | { |
| | | return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); |
| | | } |
| | | } |
| | | #endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ |
| | | |
| | | /*@} end of CMSIS_Core_NVICFunctions */ |
| | | |
| | | /* ########################## MPU functions #################################### */ |
| | | |
| | | #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) |
| | | |
| | | #include "mpu_armv8.h" |
| | | |
| | | #endif |
| | | |
| | | /* ########################## 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) |
| | | { |
| | | uint32_t mvfr0; |
| | | |
| | | mvfr0 = FPU->MVFR0; |
| | | if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) |
| | | { |
| | | return 2U; /* Double + Single precision FPU */ |
| | | } |
| | | else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) |
| | | { |
| | | return 1U; /* Single precision FPU */ |
| | | } |
| | | else |
| | | { |
| | | return 0U; /* No FPU */ |
| | | } |
| | | } |
| | | |
| | | |
| | | /*@} end of CMSIS_Core_FpuFunctions */ |
| | | |
| | | |
| | | |
| | | /* ########################## SAU functions #################################### */ |
| | | /** |
| | | \ingroup CMSIS_Core_FunctionInterface |
| | | \defgroup CMSIS_Core_SAUFunctions SAU Functions |
| | | \brief Functions that configure the SAU. |
| | | @{ |
| | | */ |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | |
| | | /** |
| | | \brief Enable SAU |
| | | \details Enables the Security Attribution Unit (SAU). |
| | | */ |
| | | __STATIC_INLINE void TZ_SAU_Enable(void) |
| | | { |
| | | SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | \brief Disable SAU |
| | | \details Disables the Security Attribution Unit (SAU). |
| | | */ |
| | | __STATIC_INLINE void TZ_SAU_Disable(void) |
| | | { |
| | | SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); |
| | | } |
| | | |
| | | #endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ |
| | | |
| | | /*@} end of CMSIS_Core_SAUFunctions */ |
| | | |
| | | |
| | | |
| | | |
| | | /* ################################## 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 */ |
| | | } |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | /** |
| | | \brief System Tick Configuration (non-secure) |
| | | \details Initializes the non-secure System Timer and its interrupt when in secure state, 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>TZ_SysTick_Config_NS</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 TZ_SysTick_Config_NS(uint32_t ticks) |
| | | { |
| | | if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) |
| | | { |
| | | return (1UL); /* Reload value impossible */ |
| | | } |
| | | |
| | | SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ |
| | | TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ |
| | | SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ |
| | | SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | |
| | | SysTick_CTRL_TICKINT_Msk | |
| | | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ |
| | | return (0UL); /* Function successful */ |
| | | } |
| | | #endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ |
| | | |
| | | #endif |
| | | |
| | | /*@} end of CMSIS_Core_SysTickFunctions */ |
| | | |
| | | |
| | | |
| | | /* ##################################### Debug In/Output function ########################################### */ |
| | | /** |
| | | \ingroup CMSIS_Core_FunctionInterface |
| | | \defgroup CMSIS_core_DebugFunctions ITM Functions |
| | | \brief Functions that access the ITM debug interface. |
| | | @{ |
| | | */ |
| | | |
| | | extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ |
| | | #define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ |
| | | |
| | | |
| | | /** |
| | | \brief ITM Send Character |
| | | \details Transmits a character via the ITM channel 0, and |
| | | \li Just returns when no debugger is connected that has booked the output. |
| | | \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. |
| | | \param [in] ch Character to transmit. |
| | | \returns Character to transmit. |
| | | */ |
| | | __STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) |
| | | { |
| | | if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ |
| | | ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ |
| | | { |
| | | while (ITM->PORT[0U].u32 == 0UL) |
| | | { |
| | | __NOP(); |
| | | } |
| | | ITM->PORT[0U].u8 = (uint8_t)ch; |
| | | } |
| | | return (ch); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief ITM Receive Character |
| | | \details Inputs a character via the external variable \ref ITM_RxBuffer. |
| | | \return Received character. |
| | | \return -1 No character pending. |
| | | */ |
| | | __STATIC_INLINE int32_t ITM_ReceiveChar (void) |
| | | { |
| | | int32_t ch = -1; /* no character available */ |
| | | |
| | | if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) |
| | | { |
| | | ch = ITM_RxBuffer; |
| | | ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ |
| | | } |
| | | |
| | | return (ch); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief ITM Check Character |
| | | \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. |
| | | \return 0 No character available. |
| | | \return 1 Character available. |
| | | */ |
| | | __STATIC_INLINE int32_t ITM_CheckChar (void) |
| | | { |
| | | |
| | | if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) |
| | | { |
| | | return (0); /* no character available */ |
| | | } |
| | | else |
| | | { |
| | | return (1); /* character available */ |
| | | } |
| | | } |
| | | |
| | | /*@} end of CMSIS_core_DebugFunctions */ |
| | | |
| | | |
| | | |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | | |
| | | #endif /* __CORE_ARMV81MML_H_DEPENDANT */ |
| | | |
| | | #endif /* __CMSIS_GENERIC */ |
New file |
| | |
| | | /**************************************************************************//** |
| | | * @file core_armv8mbl.h |
| | | * @brief CMSIS Armv8-M Baseline Core Peripheral Access Layer Header File |
| | | * @version V5.0.8 |
| | | * @date 12. November 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_ARMV8MBL_H_GENERIC |
| | | #define __CORE_ARMV8MBL_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_ARMv8MBL |
| | | @{ |
| | | */ |
| | | |
| | | #include "cmsis_version.h" |
| | | |
| | | /* CMSIS definitions */ |
| | | #define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ |
| | | #define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ |
| | | #define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ |
| | | __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ |
| | | |
| | | #define __CORTEX_M ( 2U) /*!< 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_FP |
| | | #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_ARMV8MBL_H_GENERIC */ |
| | | |
| | | #ifndef __CMSIS_GENERIC |
| | | |
| | | #ifndef __CORE_ARMV8MBL_H_DEPENDANT |
| | | #define __CORE_ARMV8MBL_H_DEPENDANT |
| | | |
| | | #ifdef __cplusplus |
| | | extern "C" { |
| | | #endif |
| | | |
| | | /* check device defines and use defaults */ |
| | | #if defined __CHECK_DEVICE_DEFINES |
| | | #ifndef __ARMv8MBL_REV |
| | | #define __ARMv8MBL_REV 0x0000U |
| | | #warning "__ARMv8MBL_REV not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __FPU_PRESENT |
| | | #define __FPU_PRESENT 0U |
| | | #warning "__FPU_PRESENT not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __MPU_PRESENT |
| | | #define __MPU_PRESENT 0U |
| | | #warning "__MPU_PRESENT not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __SAUREGION_PRESENT |
| | | #define __SAUREGION_PRESENT 0U |
| | | #warning "__SAUREGION_PRESENT not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __VTOR_PRESENT |
| | | #define __VTOR_PRESENT 0U |
| | | #warning "__VTOR_PRESENT not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __NVIC_PRIO_BITS |
| | | #define __NVIC_PRIO_BITS 2U |
| | | #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __Vendor_SysTickConfig |
| | | #define __Vendor_SysTickConfig 0U |
| | | #warning "__Vendor_SysTickConfig not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __ETM_PRESENT |
| | | #define __ETM_PRESENT 0U |
| | | #warning "__ETM_PRESENT not defined in device header file; using default!" |
| | | #endif |
| | | |
| | | #ifndef __MTB_PRESENT |
| | | #define __MTB_PRESENT 0U |
| | | #warning "__MTB_PRESENT 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 ARMv8MBL */ |
| | | |
| | | |
| | | |
| | | /******************************************************************************* |
| | | * Register Abstraction |
| | | Core Register contain: |
| | | - Core Register |
| | | - Core NVIC Register |
| | | - Core SCB Register |
| | | - Core SysTick Register |
| | | - Core Debug Register |
| | | - Core MPU Register |
| | | - Core SAU Register |
| | | ******************************************************************************/ |
| | | /** |
| | | \defgroup CMSIS_core_register Defines and Type Definitions |
| | | \brief Type definitions and defines for Cortex-M processor based devices. |
| | | */ |
| | | |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_CORE Status and Control Registers |
| | | \brief Core Register type definitions. |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Union type to access the Application Program Status Register (APSR). |
| | | */ |
| | | typedef union |
| | | { |
| | | struct |
| | | { |
| | | uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ |
| | | uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ |
| | | uint32_t C:1; /*!< bit: 29 Carry condition code flag */ |
| | | uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ |
| | | uint32_t N:1; /*!< bit: 31 Negative condition code flag */ |
| | | } b; /*!< Structure used for bit access */ |
| | | uint32_t w; /*!< Type used for word access */ |
| | | } APSR_Type; |
| | | |
| | | /* APSR Register Definitions */ |
| | | #define APSR_N_Pos 31U /*!< APSR: N Position */ |
| | | #define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ |
| | | |
| | | #define APSR_Z_Pos 30U /*!< APSR: Z Position */ |
| | | #define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ |
| | | |
| | | #define APSR_C_Pos 29U /*!< APSR: C Position */ |
| | | #define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ |
| | | |
| | | #define APSR_V_Pos 28U /*!< APSR: V Position */ |
| | | #define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ |
| | | |
| | | |
| | | /** |
| | | \brief Union type to access the Interrupt Program Status Register (IPSR). |
| | | */ |
| | | typedef union |
| | | { |
| | | struct |
| | | { |
| | | uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ |
| | | uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ |
| | | } b; /*!< Structure used for bit access */ |
| | | uint32_t w; /*!< Type used for word access */ |
| | | } IPSR_Type; |
| | | |
| | | /* IPSR Register Definitions */ |
| | | #define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ |
| | | #define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ |
| | | |
| | | |
| | | /** |
| | | \brief Union type to access the Special-Purpose Program Status Registers (xPSR). |
| | | */ |
| | | typedef union |
| | | { |
| | | struct |
| | | { |
| | | uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ |
| | | uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ |
| | | uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ |
| | | uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ |
| | | uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ |
| | | uint32_t C:1; /*!< bit: 29 Carry condition code flag */ |
| | | uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ |
| | | uint32_t N:1; /*!< bit: 31 Negative condition code flag */ |
| | | } b; /*!< Structure used for bit access */ |
| | | uint32_t w; /*!< Type used for word access */ |
| | | } xPSR_Type; |
| | | |
| | | /* xPSR Register Definitions */ |
| | | #define xPSR_N_Pos 31U /*!< xPSR: N Position */ |
| | | #define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ |
| | | |
| | | #define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ |
| | | #define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ |
| | | |
| | | #define xPSR_C_Pos 29U /*!< xPSR: C Position */ |
| | | #define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ |
| | | |
| | | #define xPSR_V_Pos 28U /*!< xPSR: V Position */ |
| | | #define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ |
| | | |
| | | #define xPSR_T_Pos 24U /*!< xPSR: T Position */ |
| | | #define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ |
| | | |
| | | #define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ |
| | | #define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ |
| | | |
| | | |
| | | /** |
| | | \brief Union type to access the Control Registers (CONTROL). |
| | | */ |
| | | typedef union |
| | | { |
| | | struct |
| | | { |
| | | uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ |
| | | uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ |
| | | uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ |
| | | } b; /*!< Structure used for bit access */ |
| | | uint32_t w; /*!< Type used for word access */ |
| | | } CONTROL_Type; |
| | | |
| | | /* CONTROL Register Definitions */ |
| | | #define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ |
| | | #define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ |
| | | |
| | | #define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ |
| | | #define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ |
| | | |
| | | /*@} end of group CMSIS_CORE */ |
| | | |
| | | |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) |
| | | \brief Type definitions for the NVIC Registers |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ |
| | | uint32_t RESERVED0[16U]; |
| | | __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ |
| | | uint32_t RSERVED1[16U]; |
| | | __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ |
| | | uint32_t RESERVED2[16U]; |
| | | __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ |
| | | uint32_t RESERVED3[16U]; |
| | | __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ |
| | | uint32_t RESERVED4[16U]; |
| | | __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ |
| | | uint32_t RESERVED5[16U]; |
| | | __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ |
| | | } NVIC_Type; |
| | | |
| | | /*@} end of group CMSIS_NVIC */ |
| | | |
| | | |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_SCB System Control Block (SCB) |
| | | \brief Type definitions for the System Control Block Registers |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the System Control Block (SCB). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ |
| | | __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ |
| | | #if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) |
| | | __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ |
| | | #else |
| | | uint32_t RESERVED0; |
| | | #endif |
| | | __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ |
| | | __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ |
| | | __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ |
| | | uint32_t RESERVED1; |
| | | __IOM uint32_t SHPR[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_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ |
| | | #define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ |
| | | |
| | | #define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ |
| | | #define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ |
| | | |
| | | #define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ |
| | | #define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR 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_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ |
| | | #define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ |
| | | |
| | | #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_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ |
| | | #define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ |
| | | |
| | | #define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ |
| | | #define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ |
| | | |
| | | #if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) |
| | | /* SCB Vector Table Offset Register Definitions */ |
| | | #define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ |
| | | #define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ |
| | | #endif |
| | | |
| | | /* SCB Application Interrupt and Reset Control Register Definitions */ |
| | | #define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ |
| | | #define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ |
| | | |
| | | #define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ |
| | | #define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ |
| | | |
| | | #define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ |
| | | #define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ |
| | | |
| | | #define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ |
| | | #define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ |
| | | |
| | | #define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ |
| | | #define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ |
| | | |
| | | #define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ |
| | | #define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS 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_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ |
| | | #define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS 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_BP_Pos 18U /*!< SCB CCR: BP Position */ |
| | | #define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ |
| | | |
| | | #define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ |
| | | #define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ |
| | | |
| | | #define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ |
| | | #define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ |
| | | |
| | | #define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ |
| | | #define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ |
| | | |
| | | #define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ |
| | | #define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ |
| | | |
| | | #define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ |
| | | #define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP 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 */ |
| | | |
| | | #define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ |
| | | #define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ |
| | | |
| | | /* SCB System Handler Control and State Register Definitions */ |
| | | #define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ |
| | | #define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ |
| | | |
| | | #define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ |
| | | #define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ |
| | | |
| | | #define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ |
| | | #define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ |
| | | |
| | | #define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ |
| | | #define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ |
| | | |
| | | #define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ |
| | | #define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ |
| | | |
| | | #define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ |
| | | #define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ |
| | | |
| | | #define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ |
| | | #define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT 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_DWT Data Watchpoint and Trace (DWT) |
| | | \brief Type definitions for the Data Watchpoint and Trace (DWT) |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Data Watchpoint and Trace Register (DWT). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ |
| | | uint32_t RESERVED0[6U]; |
| | | __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ |
| | | __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ |
| | | uint32_t RESERVED1[1U]; |
| | | __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ |
| | | uint32_t RESERVED2[1U]; |
| | | __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ |
| | | uint32_t RESERVED3[1U]; |
| | | __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ |
| | | uint32_t RESERVED4[1U]; |
| | | __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ |
| | | uint32_t RESERVED5[1U]; |
| | | __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ |
| | | uint32_t RESERVED6[1U]; |
| | | __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ |
| | | uint32_t RESERVED7[1U]; |
| | | __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ |
| | | uint32_t RESERVED8[1U]; |
| | | __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ |
| | | uint32_t RESERVED9[1U]; |
| | | __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ |
| | | uint32_t RESERVED10[1U]; |
| | | __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ |
| | | uint32_t RESERVED11[1U]; |
| | | __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ |
| | | uint32_t RESERVED12[1U]; |
| | | __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ |
| | | uint32_t RESERVED13[1U]; |
| | | __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ |
| | | uint32_t RESERVED14[1U]; |
| | | __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ |
| | | uint32_t RESERVED15[1U]; |
| | | __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ |
| | | uint32_t RESERVED16[1U]; |
| | | __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ |
| | | uint32_t RESERVED17[1U]; |
| | | __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ |
| | | uint32_t RESERVED18[1U]; |
| | | __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ |
| | | uint32_t RESERVED19[1U]; |
| | | __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ |
| | | uint32_t RESERVED20[1U]; |
| | | __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ |
| | | uint32_t RESERVED21[1U]; |
| | | __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ |
| | | uint32_t RESERVED22[1U]; |
| | | __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ |
| | | uint32_t RESERVED23[1U]; |
| | | __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ |
| | | uint32_t RESERVED24[1U]; |
| | | __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ |
| | | uint32_t RESERVED25[1U]; |
| | | __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ |
| | | uint32_t RESERVED26[1U]; |
| | | __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ |
| | | uint32_t RESERVED27[1U]; |
| | | __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ |
| | | uint32_t RESERVED28[1U]; |
| | | __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ |
| | | uint32_t RESERVED29[1U]; |
| | | __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ |
| | | uint32_t RESERVED30[1U]; |
| | | __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ |
| | | uint32_t RESERVED31[1U]; |
| | | __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ |
| | | } DWT_Type; |
| | | |
| | | /* DWT Control Register Definitions */ |
| | | #define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ |
| | | #define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ |
| | | |
| | | #define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ |
| | | #define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ |
| | | |
| | | #define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ |
| | | #define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ |
| | | |
| | | #define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ |
| | | #define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ |
| | | |
| | | #define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ |
| | | #define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ |
| | | |
| | | /* DWT Comparator Function Register Definitions */ |
| | | #define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ |
| | | #define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ |
| | | |
| | | #define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ |
| | | #define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ |
| | | |
| | | #define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ |
| | | #define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ |
| | | |
| | | #define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ |
| | | #define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ |
| | | |
| | | #define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ |
| | | #define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ |
| | | |
| | | /*@}*/ /* end of group CMSIS_DWT */ |
| | | |
| | | |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_TPI Trace Port Interface (TPI) |
| | | \brief Type definitions for the Trace Port Interface (TPI) |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Trace Port Interface Register (TPI). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ |
| | | __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ |
| | | uint32_t RESERVED0[2U]; |
| | | __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ |
| | | uint32_t RESERVED1[55U]; |
| | | __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ |
| | | uint32_t RESERVED2[131U]; |
| | | __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ |
| | | __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ |
| | | __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ |
| | | uint32_t RESERVED3[809U]; |
| | | __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ |
| | | __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ |
| | | uint32_t RESERVED4[4U]; |
| | | __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ |
| | | __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ |
| | | } TPI_Type; |
| | | |
| | | /* TPI Asynchronous Clock Prescaler Register Definitions */ |
| | | #define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ |
| | | #define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ |
| | | |
| | | /* TPI Selected Pin Protocol Register Definitions */ |
| | | #define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ |
| | | #define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ |
| | | |
| | | /* TPI Formatter and Flush Status Register Definitions */ |
| | | #define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ |
| | | #define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ |
| | | |
| | | #define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ |
| | | #define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ |
| | | |
| | | #define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ |
| | | #define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ |
| | | |
| | | #define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ |
| | | #define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ |
| | | |
| | | /* TPI Formatter and Flush Control Register Definitions */ |
| | | #define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ |
| | | #define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ |
| | | |
| | | #define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ |
| | | #define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ |
| | | |
| | | #define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ |
| | | #define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ |
| | | |
| | | /* TPI Periodic Synchronization Control Register Definitions */ |
| | | #define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ |
| | | #define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ |
| | | |
| | | /* TPI Software Lock Status Register Definitions */ |
| | | #define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ |
| | | #define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ |
| | | |
| | | #define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ |
| | | #define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ |
| | | |
| | | #define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ |
| | | #define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ |
| | | |
| | | /* TPI DEVID Register Definitions */ |
| | | #define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ |
| | | #define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ |
| | | |
| | | #define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ |
| | | #define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ |
| | | |
| | | #define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ |
| | | #define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ |
| | | |
| | | #define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ |
| | | #define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ |
| | | |
| | | /* TPI DEVTYPE Register Definitions */ |
| | | #define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ |
| | | #define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ |
| | | |
| | | #define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ |
| | | #define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ |
| | | |
| | | /*@}*/ /* end of group CMSIS_TPI */ |
| | | |
| | | |
| | | #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_MPU Memory Protection Unit (MPU) |
| | | \brief Type definitions for the Memory Protection Unit (MPU) |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Memory Protection Unit (MPU). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ |
| | | __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ |
| | | __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ |
| | | __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ |
| | | __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ |
| | | uint32_t RESERVED0[7U]; |
| | | union { |
| | | __IOM uint32_t MAIR[2]; |
| | | struct { |
| | | __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ |
| | | __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ |
| | | }; |
| | | }; |
| | | } MPU_Type; |
| | | |
| | | #define MPU_TYPE_RALIASES 1U |
| | | |
| | | /* MPU Type Register Definitions */ |
| | | #define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ |
| | | #define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ |
| | | |
| | | #define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ |
| | | #define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ |
| | | |
| | | #define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ |
| | | #define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ |
| | | |
| | | /* MPU Control Register Definitions */ |
| | | #define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ |
| | | #define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ |
| | | |
| | | #define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ |
| | | #define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ |
| | | |
| | | #define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ |
| | | #define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ |
| | | |
| | | /* MPU Region Number Register Definitions */ |
| | | #define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ |
| | | #define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ |
| | | |
| | | /* MPU Region Base Address Register Definitions */ |
| | | #define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ |
| | | #define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ |
| | | |
| | | #define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ |
| | | #define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ |
| | | |
| | | #define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ |
| | | #define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ |
| | | |
| | | #define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ |
| | | #define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ |
| | | |
| | | /* MPU Region Limit Address Register Definitions */ |
| | | #define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ |
| | | #define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ |
| | | |
| | | #define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ |
| | | #define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ |
| | | |
| | | #define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ |
| | | #define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ |
| | | |
| | | /* MPU Memory Attribute Indirection Register 0 Definitions */ |
| | | #define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ |
| | | #define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ |
| | | |
| | | #define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ |
| | | #define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ |
| | | |
| | | #define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ |
| | | #define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ |
| | | |
| | | #define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ |
| | | #define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ |
| | | |
| | | /* MPU Memory Attribute Indirection Register 1 Definitions */ |
| | | #define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ |
| | | #define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ |
| | | |
| | | #define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ |
| | | #define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ |
| | | |
| | | #define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ |
| | | #define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ |
| | | |
| | | #define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ |
| | | #define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ |
| | | |
| | | /*@} end of group CMSIS_MPU */ |
| | | #endif |
| | | |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_SAU Security Attribution Unit (SAU) |
| | | \brief Type definitions for the Security Attribution Unit (SAU) |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Security Attribution Unit (SAU). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ |
| | | __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ |
| | | #if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) |
| | | __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ |
| | | __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ |
| | | __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ |
| | | #endif |
| | | } SAU_Type; |
| | | |
| | | /* SAU Control Register Definitions */ |
| | | #define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ |
| | | #define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ |
| | | |
| | | #define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ |
| | | #define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ |
| | | |
| | | /* SAU Type Register Definitions */ |
| | | #define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ |
| | | #define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ |
| | | |
| | | #if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) |
| | | /* SAU Region Number Register Definitions */ |
| | | #define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ |
| | | #define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ |
| | | |
| | | /* SAU Region Base Address Register Definitions */ |
| | | #define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ |
| | | #define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ |
| | | |
| | | /* SAU Region Limit Address Register Definitions */ |
| | | #define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ |
| | | #define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ |
| | | |
| | | #define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ |
| | | #define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ |
| | | |
| | | #define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ |
| | | #define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ |
| | | |
| | | #endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ |
| | | |
| | | /*@} end of group CMSIS_SAU */ |
| | | #endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ |
| | | |
| | | |
| | | /** |
| | | \ingroup CMSIS_core_register |
| | | \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) |
| | | \brief Type definitions for the Core Debug Registers |
| | | @{ |
| | | */ |
| | | |
| | | /** |
| | | \brief Structure type to access the Core Debug Register (CoreDebug). |
| | | */ |
| | | typedef struct |
| | | { |
| | | __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ |
| | | __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ |
| | | __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ |
| | | __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ |
| | | uint32_t RESERVED4[1U]; |
| | | __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ |
| | | __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ |
| | | } CoreDebug_Type; |
| | | |
| | | /* Debug Halting Control and Status Register Definitions */ |
| | | #define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ |
| | | #define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ |
| | | #define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ |
| | | #define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ |
| | | #define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ |
| | | #define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ |
| | | #define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ |
| | | #define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ |
| | | #define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ |
| | | #define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ |
| | | #define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ |
| | | #define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ |
| | | |
| | | #define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ |
| | | #define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ |
| | | |
| | | /* Debug Core Register Selector Register Definitions */ |
| | | #define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ |
| | | #define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ |
| | | |
| | | #define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ |
| | | #define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ |
| | | |
| | | /* Debug Exception and Monitor Control Register */ |
| | | #define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ |
| | | #define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ |
| | | #define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ |
| | | |
| | | #define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ |
| | | #define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ |
| | | |
| | | /* Debug Authentication Control Register Definitions */ |
| | | #define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ |
| | | #define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ |
| | | |
| | | #define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ |
| | | #define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ |
| | | |
| | | #define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ |
| | | #define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ |
| | | |
| | | #define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ |
| | | #define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ |
| | | |
| | | /* Debug Security Control and Status Register Definitions */ |
| | | #define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ |
| | | #define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ |
| | | |
| | | #define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ |
| | | #define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ |
| | | |
| | | #define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ |
| | | #define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ |
| | | |
| | | /*@} 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 DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ |
| | | #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ |
| | | #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug 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 */ |
| | | #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ |
| | | #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ |
| | | #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ |
| | | |
| | | #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) |
| | | #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ |
| | | #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ |
| | | #endif |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ |
| | | #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ |
| | | #endif |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ |
| | | #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ |
| | | #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ |
| | | #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ |
| | | #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ |
| | | |
| | | #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ |
| | | #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ |
| | | #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ |
| | | #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ |
| | | |
| | | #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) |
| | | #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ |
| | | #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ |
| | | #endif |
| | | |
| | | #endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ |
| | | /*@} */ |
| | | |
| | | |
| | | |
| | | /******************************************************************************* |
| | | * 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 |
| | | #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 |
| | | |
| | | |
| | | /* Special LR values for Secure/Non-Secure call handling and exception handling */ |
| | | |
| | | /* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ |
| | | #define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ |
| | | |
| | | /* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ |
| | | #define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ |
| | | #define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ |
| | | #define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ |
| | | #define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ |
| | | #define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ |
| | | #define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ |
| | | #define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ |
| | | |
| | | /* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ |
| | | #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ |
| | | #define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ |
| | | #else |
| | | #define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ |
| | | #endif |
| | | |
| | | |
| | | /* 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) |
| | | { |
| | | __COMPILER_BARRIER(); |
| | | NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
| | | __COMPILER_BARRIER(); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] & (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[(((uint32_t)IRQn) >> 5UL)] = (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[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Active Interrupt |
| | | \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \return 0 Interrupt status is not active. |
| | | \return 1 Interrupt status is active. |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | /** |
| | | \brief Get Interrupt Target State |
| | | \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \return 0 if interrupt is assigned to Secure |
| | | \return 1 if interrupt is assigned to Non Secure |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Set Interrupt Target State |
| | | \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \return 0 if interrupt is assigned to Secure |
| | | 1 if interrupt is assigned to Non Secure |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); |
| | | return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Clear Interrupt Target State |
| | | \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \return 0 if interrupt is assigned to Secure |
| | | 1 if interrupt is assigned to Non Secure |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); |
| | | return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | #endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ |
| | | |
| | | |
| | | /** |
| | | \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->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | |
| | | (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); |
| | | } |
| | | else |
| | | { |
| | | SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_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->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); |
| | | } |
| | | else |
| | | { |
| | | return((uint32_t)(((SCB->SHPR[_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. |
| | | VTOR must been relocated to SRAM before. |
| | | If VTOR is not present 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) |
| | | { |
| | | #if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) |
| | | uint32_t *vectors = (uint32_t *)SCB->VTOR; |
| | | #else |
| | | uint32_t *vectors = (uint32_t *)0x0U; |
| | | #endif |
| | | vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; |
| | | __DSB(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | \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) |
| | | { |
| | | #if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) |
| | | uint32_t *vectors = (uint32_t *)SCB->VTOR; |
| | | #else |
| | | uint32_t *vectors = (uint32_t *)0x0U; |
| | | #endif |
| | | 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(); |
| | | } |
| | | } |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | /** |
| | | \brief Enable Interrupt (non-secure) |
| | | \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Interrupt Enable status (non-secure) |
| | | \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. |
| | | \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 TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Disable Interrupt (non-secure) |
| | | \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Pending Interrupt (non-secure) |
| | | \details Reads the NVIC pending register in the non-secure NVIC when in secure state 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 TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Set Pending Interrupt (non-secure) |
| | | \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Clear Pending Interrupt (non-secure) |
| | | \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Active Interrupt (non-secure) |
| | | \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. |
| | | \param [in] IRQn Device specific interrupt number. |
| | | \return 0 Interrupt status is not active. |
| | | \return 1 Interrupt status is active. |
| | | \note IRQn must not be negative. |
| | | */ |
| | | __STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
| | | } |
| | | else |
| | | { |
| | | return(0U); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Set Interrupt Priority (non-secure) |
| | | \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. |
| | | 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 non-secure processor exception. |
| | | */ |
| | | __STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) |
| | | { |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | |
| | | (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); |
| | | } |
| | | else |
| | | { |
| | | SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | |
| | | (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | \brief Get Interrupt Priority (non-secure) |
| | | \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. |
| | | 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 TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) |
| | | { |
| | | |
| | | if ((int32_t)(IRQn) >= 0) |
| | | { |
| | | return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); |
| | | } |
| | | else |
| | | { |
| | | return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); |
| | | } |
| | | } |
| | | #endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ |
| | | |
| | | /*@} end of CMSIS_Core_NVICFunctions */ |
| | | |
| | | /* ########################## MPU functions #################################### */ |
| | | |
| | | #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) |
| | | |
| | | #include "mpu_armv8.h" |
| | | |
| | | #endif |
| | | |
| | | /* ########################## 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 */ |
| | | |
| | | |
| | | |
| | | /* ########################## SAU functions #################################### */ |
| | | /** |
| | | \ingroup CMSIS_Core_FunctionInterface |
| | | \defgroup CMSIS_Core_SAUFunctions SAU Functions |
| | | \brief Functions that configure the SAU. |
| | | @{ |
| | | */ |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | |
| | | /** |
| | | \brief Enable SAU |
| | | \details Enables the Security Attribution Unit (SAU). |
| | | */ |
| | | __STATIC_INLINE void TZ_SAU_Enable(void) |
| | | { |
| | | SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | \brief Disable SAU |
| | | \details Disables the Security Attribution Unit (SAU). |
| | | */ |
| | | __STATIC_INLINE void TZ_SAU_Disable(void) |
| | | { |
| | | SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); |
| | | } |
| | | |
| | | #endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ |
| | | |
| | | /*@} end of CMSIS_Core_SAUFunctions */ |
| | | |
| | | |
| | | |
| | | |
| | | /* ################################## 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 */ |
| | | } |
| | | |
| | | #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) |
| | | /** |
| | | \brief System Tick Configuration (non-secure) |
| | | \details Initializes the non-secure System Timer and its interrupt when in secure state, 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>TZ_SysTick_Config_NS</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 TZ_SysTick_Config_NS(uint32_t ticks) |
| | | { |
| | | if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) |
| | | { |
| | | return (1UL); /* Reload value impossible */ |
| | | } |
| | | |
| | | SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ |
| | | TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ |
| | | SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ |
| | | SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | |
| | | SysTick_CTRL_TICKINT_Msk | |
| | | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ |
| | | return (0UL); /* Function successful */ |
| | | } |
| | | #endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ |
| | | |
| | | #endif |
| | | |
| | | /*@} end of CMSIS_Core_SysTickFunctions */ |
| | | |
| | | |
| | | |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | | |
| | | #endif /* __CORE_ARMV8MBL_H_DEPENDANT */ |
| | | |
| | | #endif /* __CMSIS_GENERIC */ |
src/BearKE1/Drivers/CMSIS/Include/core_armv8mml.h
src/BearKE1/Drivers/CMSIS/Include/core_cm0.h
src/BearKE1/Drivers/CMSIS/Include/core_cm0plus.h
src/BearKE1/Drivers/CMSIS/Include/core_cm1.h
src/BearKE1/Drivers/CMSIS/Include/core_cm23.h
src/BearKE1/Drivers/CMSIS/Include/core_cm3.h
src/BearKE1/Drivers/CMSIS/Include/core_cm33.h
src/BearKE1/Drivers/CMSIS/Include/core_cm35p.h
src/BearKE1/Drivers/CMSIS/Include/core_cm4.h
src/BearKE1/Drivers/CMSIS/Include/core_cm7.h
src/BearKE1/Drivers/CMSIS/Include/core_sc000.h
src/BearKE1/Drivers/CMSIS/Include/core_sc300.h
src/BearKE1/Drivers/CMSIS/Include/mpu_armv7.h
src/BearKE1/Drivers/CMSIS/Include/mpu_armv8.h
src/BearKE1/Drivers/CMSIS/Include/tz_context.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c
src/BearKE1/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c
src/BearKE1/STM32L433CBTX_FLASH.ld |